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);
}
|