File: writable.h

package info (click to toggle)
gcl 2.6.14-19
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 60,804 kB
  • sloc: ansic: 177,407; lisp: 151,508; asm: 128,169; sh: 22,510; cpp: 11,923; tcl: 3,181; perl: 2,930; makefile: 2,360; sed: 334; yacc: 226; lex: 95; awk: 30; fortran: 24; csh: 23
file content (63 lines) | stat: -rw-r--r-- 1,088 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
EXTER fixnum last_page;
EXTER int last_result;

INLINE int
set_writable(fixnum i,bool m) {

  fixnum j;
  object v;

  last_page=last_result=0;

  if (i<first_data_page || i>=page(heap_end))
    error("out of heap in set_writable");

  if ((v=sSAwritableA ? sSAwritableA->s.s_dbind : Cnil)==Cnil)
    error("no wrimap in set_writable");

  if ((j=i-first_data_page)<0 || j>=v->v.v_dim)/*FIXME*/
    return 0;

  if ((void *)wrimap!=(void *)v->v.v_self)
    error("set_writable called in gc");

  writable_pages+=m-((wrimap[j/8]>>(j%8))&0x1);

  if (m)
    wrimap[j/8]|=(1<<(j%8));
  else
    wrimap[j/8]&=~(1<<(j%8));

  return 0;

}

INLINE int
is_writable(fixnum i) {

  fixnum j;
  object v;

  if (i<first_data_page || i>=page(core_end))
    return 0;
  
  if ((v=sSAwritableA ? sSAwritableA->s.s_dbind : Cnil)==Cnil)
    return 1;
  
  if ((j=i-first_data_page)<0 || j>=v->v.v_dim)
    return 1;
  
  return (wrimap[j/8]>>(j%8))&0x1;
  
}

INLINE int
is_writable_cached(fixnum i) {

  if (last_page==i)
    return last_result;

  last_page=i;
  return last_result=is_writable(i);

}