59 |
|
|
60 |
|
|
61 |
#define sgc_mark_pack_list(u) \ |
#define sgc_mark_pack_list(u) \ |
62 |
do {register object xtmp = u; \ |
do {object xtmp = u; \ |
63 |
while (xtmp != Cnil) \ |
while (xtmp != Cnil) \ |
64 |
{if (ON_WRITABLE_PAGE(xtmp)) xtmp->d.m = TRUE; \ |
{if (ON_WRITABLE_PAGE(xtmp)) {mark(xtmp);} \ |
65 |
sgc_mark_object(xtmp->c.c_car); \ |
sgc_mark_object(xtmp->c.c_car); \ |
66 |
xtmp=xtmp->c.c_cdr;}}while(0) |
xtmp=Scdr(xtmp);}}while(0) |
67 |
|
|
68 |
|
|
69 |
#ifdef SDEBUG |
#ifdef SDEBUG |
72 |
joe() {;} |
joe() {;} |
73 |
#endif |
#endif |
74 |
|
|
75 |
|
static void *mcsh,*mcsl; |
76 |
|
|
77 |
static void |
static void |
78 |
sgc_mark_cons(object x) { |
sgc_mark_cons(object x) { |
79 |
|
|
80 |
cs_check(x); |
cs_check(x); |
81 |
|
|
82 |
|
#if CSTACK_DIRECTION == -1 |
83 |
|
if (mcsl>(void *)&x) |
84 |
|
#else |
85 |
|
if (mcsl<(void *)&x) |
86 |
|
#endif |
87 |
|
mcsl=&x; |
88 |
|
|
89 |
/* x is already marked. */ |
/* x is already marked. */ |
90 |
|
|
91 |
BEGIN: |
BEGIN: |
98 |
goto MARK_CDR; |
goto MARK_CDR; |
99 |
|
|
100 |
MARK_CAR: |
MARK_CAR: |
101 |
if (x->c.c_car->c.m ==0) { |
if (!is_marked_or_free(x->c.c_car)) { |
102 |
if (type_of(x->c.c_car) == t_cons) { |
if (type_of(x->c.c_car) == t_cons) { |
103 |
x->c.c_car->c.m = TRUE; |
mark(x->c.c_car); |
104 |
sgc_mark_cons(x->c.c_car); |
sgc_mark_cons(x->c.c_car); |
105 |
} else |
} else |
106 |
sgc_mark_object1(x->c.c_car);} |
sgc_mark_object1(x->c.c_car);} |
107 |
MARK_CDR: |
MARK_CDR: |
108 |
#endif |
#endif |
109 |
x = x->c.c_cdr; |
if (is_imm_fixnum(x->c.c_cdr)) return; |
110 |
|
x = Scdr(x); |
111 |
IF_WRITABLE(x, goto WRITABLE_CDR;); |
IF_WRITABLE(x, goto WRITABLE_CDR;); |
112 |
return; |
return; |
113 |
WRITABLE_CDR: |
WRITABLE_CDR: |
114 |
if (x->d.m) return; |
if (is_marked_or_free(x)) return; |
115 |
if (type_of(x) == t_cons) { |
if (type_of(x) == t_cons) { |
116 |
x->c.m = TRUE; |
mark(x); |
117 |
goto BEGIN; |
goto BEGIN; |
118 |
} |
} |
119 |
sgc_mark_object1(x); |
sgc_mark_object1(x); |
135 |
static void |
static void |
136 |
sgc_mark_object1(object x) { |
sgc_mark_object1(object x) { |
137 |
|
|
138 |
long i; |
fixnum i,j; |
|
int j; |
|
139 |
object *p; |
object *p; |
140 |
char *cp; |
char *cp; |
141 |
|
|
142 |
cs_check(x); |
cs_check(x); |
143 |
|
#if CSTACK_DIRECTION == -1 |
144 |
|
if (mcsl>(void *)&cp) |
145 |
|
#else |
146 |
|
if (mcsl<(void *)&cp) |
147 |
|
#endif |
148 |
|
mcsl=&cp; |
149 |
|
|
150 |
BEGIN: |
BEGIN: |
151 |
#ifdef SDEBUG |
#ifdef SDEBUG |
152 |
if (x == OBJNULL || !ON_WRITABLE_PAGE(x)) |
if (x == OBJNULL || !ON_WRITABLE_PAGE(x)) |
155 |
joe(); |
joe(); |
156 |
OK: |
OK: |
157 |
#endif |
#endif |
158 |
if (x->d.m) |
if (is_marked_or_free(x)) |
159 |
return; |
return; |
160 |
#ifdef SDEBUG |
#ifdef SDEBUG |
161 |
if(x==sdebug) joe1(); |
if(x==sdebug) joe1(); |
167 |
always fail on x that satisfy (NULL_OR_ON_C_STACK(x)) |
always fail on x that satisfy (NULL_OR_ON_C_STACK(x)) |
168 |
*/ |
*/ |
169 |
|
|
170 |
x->d.m = TRUE; |
mark(x); |
171 |
switch (type_of(x)) { |
switch (type_of(x)) { |
172 |
case t_fixnum: |
case t_fixnum: |
173 |
break; |
break; |
175 |
case t_ratio: |
case t_ratio: |
176 |
sgc_mark_object(x->rat.rat_num); |
sgc_mark_object(x->rat.rat_num); |
177 |
x = x->rat.rat_den; |
x = x->rat.rat_den; |
178 |
IF_WRITABLE(x,if(x->d.m==0) goto BEGIN); |
IF_WRITABLE(x,if(!is_marked_or_free(x)) goto BEGIN); |
179 |
|
|
180 |
case t_shortfloat: |
case t_shortfloat: |
181 |
break; |
break; |
186 |
case t_complex: |
case t_complex: |
187 |
sgc_mark_object(x->cmp.cmp_imag); |
sgc_mark_object(x->cmp.cmp_imag); |
188 |
x = x->cmp.cmp_real; |
x = x->cmp.cmp_real; |
189 |
IF_WRITABLE(x,if(x->d.m==0) goto BEGIN); |
IF_WRITABLE(x,if(!is_marked_or_free(x)) goto BEGIN); |
190 |
|
|
191 |
case t_character: |
case t_character: |
192 |
break; |
break; |
193 |
|
|
194 |
case t_symbol: |
case t_symbol: |
195 |
IF_WRITABLE(x->s.s_plist,if(x->s.s_plist->d.m==0) |
IF_WRITABLE(x->s.s_plist,if(!is_marked_or_free(x->s.s_plist)) |
196 |
{x->s.s_plist->d.m=TRUE; |
{mark(x->s.s_plist); |
197 |
sgc_mark_cons(x->s.s_plist);}); |
sgc_mark_cons(x->s.s_plist);}); |
198 |
sgc_mark_object(x->s.s_gfdef); |
sgc_mark_object(x->s.s_gfdef); |
199 |
sgc_mark_object(x->s.s_dbind); |
sgc_mark_object(x->s.s_dbind); |
265 |
if (inheap(x->a.a_dims)) { |
if (inheap(x->a.a_dims)) { |
266 |
if (what_to_collect == t_contiguous) |
if (what_to_collect == t_contiguous) |
267 |
mark_contblock((char *)(x->a.a_dims), |
mark_contblock((char *)(x->a.a_dims), |
268 |
sizeof(int)*x->a.a_rank); |
sizeof(fixnum)*x->a.a_rank); |
269 |
} else if(SGC_RELBLOCK_P(x->a.a_dims)) |
} else if(SGC_RELBLOCK_P(x->a.a_dims)) |
270 |
x->a.a_dims = (int *) |
x->a.a_dims = (fixnum *) |
271 |
copy_relblock((char *)(x->a.a_dims), |
copy_relblock((char *)(x->a.a_dims), |
272 |
sizeof(int)*x->a.a_rank); |
sizeof(fixnum)*x->a.a_rank); |
273 |
} |
} |
274 |
if ((enum aelttype)x->a.a_elttype == aet_ch) |
if ((enum aelttype)x->a.a_elttype == aet_ch) |
275 |
goto CASE_STRING; |
goto CASE_STRING; |
354 |
if (type_map[page(x->big.big_self)] < t_contiguous) |
if (type_map[page(x->big.big_self)] < t_contiguous) |
355 |
printf("bad body for %x (%x)\n",x,cp); |
printf("bad body for %x (%x)\n",x,cp); |
356 |
#endif |
#endif |
357 |
#ifndef GMP |
/* #ifndef GMP */ |
358 |
if ((int)what_to_collect >= (int)t_contiguous) { |
/* if ((int)what_to_collect >= (int)t_contiguous) { */ |
359 |
j = x->big.big_length; |
/* j = x->big.big_length; */ |
360 |
cp = (char *)x->big.big_self; |
/* cp = (char *)x->big.big_self; */ |
361 |
if (cp == NULL) |
/* if (cp == NULL) */ |
362 |
break; |
/* break; */ |
363 |
if (j != lg(MP(x)) && |
/* if (j != lg(MP(x)) && */ |
364 |
/* we don't bother to zero this register, |
/* we don't bother to zero this register, |
365 |
and its contents may get over written */ |
and its contents may get over written */ |
366 |
! (x == big_register_1 && |
/* ! (x == big_register_1 && */ |
367 |
(int)(cp) <= top && |
/* (int)(cp) <= top && */ |
368 |
(int) cp >= bot)) |
/* (int) cp >= bot)) */ |
369 |
|
|
370 |
printf("bad length 0x%x ",x); |
/* printf("bad length 0x%x ",x); */ |
371 |
j = j * sizeof(int); |
/* j = j * sizeof(int); */ |
372 |
|
|
373 |
if (inheap(cp)) { |
/* if (inheap(cp)) { */ |
374 |
if (what_to_collect == t_contiguous) |
/* if (what_to_collect == t_contiguous) */ |
375 |
mark_contblock(cp, j); |
/* mark_contblock(cp, j); */ |
376 |
} else { |
/* } else { */ |
377 |
if (SGC_RELBLOCK_P(cp)) |
/* if (SGC_RELBLOCK_P(cp)) */ |
378 |
x->big.big_self = (plong *)copy_relblock(cp, j);}} |
/* x->big.big_self = (plong *)copy_relblock(cp, j);}} */ |
379 |
#endif /* no gmp */ |
/* #endif */ /* no gmp */ |
380 |
#ifndef GMP_USE_MALLOC |
#ifndef GMP_USE_MALLOC |
381 |
if ((int)what_to_collect >= (int)t_contiguous) { |
if ((int)what_to_collect >= (int)t_contiguous) { |
382 |
j = MP_ALLOCATED(x); |
j = MP_ALLOCATED(x); |
383 |
cp = (char *)MP_SELF(x); |
cp = (char *)MP_SELF(x); |
384 |
if (cp == 0) |
if (cp == 0) |
385 |
break; |
break; |
386 |
#ifdef PARI |
/* #ifdef PARI */ |
387 |
if (j != lg(MP(x)) && |
/* if (j != lg(MP(x)) && */ |
388 |
/* we don't bother to zero this register, |
/* we don't bother to zero this register, |
389 |
and its contents may get over written */ |
and its contents may get over written */ |
390 |
! (x == big_register_1 && |
/* ! (x == big_register_1 && */ |
391 |
(int)(cp) <= top && |
/* (int)(cp) <= top && */ |
392 |
(int) cp >= bot)) |
/* (int) cp >= bot)) */ |
393 |
printf("bad length 0x%x ",x); |
/* printf("bad length 0x%x ",x); */ |
394 |
#endif |
/* #endif */ |
395 |
j = j * MP_LIMB_SIZE; |
j = j * MP_LIMB_SIZE; |
396 |
if (inheap(cp)) { |
if (inheap(cp)) { |
397 |
if (what_to_collect == t_contiguous) |
if (what_to_collect == t_contiguous) |
436 |
/* We make bitvectors multiple of sizeof(int) in size allocated |
/* We make bitvectors multiple of sizeof(int) in size allocated |
437 |
Assume 8 = number of bits in char */ |
Assume 8 = number of bits in char */ |
438 |
|
|
439 |
#define W_SIZE (8*sizeof(int)) |
j= sizeof(fixnum) * |
|
j= sizeof(int) * |
|
440 |
((BV_OFFSET(x) + x->bv.bv_dim + W_SIZE -1)/W_SIZE); |
((BV_OFFSET(x) + x->bv.bv_dim + W_SIZE -1)/W_SIZE); |
441 |
cp = x->bv.bv_self; |
cp = x->bv.bv_self; |
442 |
if (cp == NULL) |
if (cp == NULL) |
523 |
} |
} |
524 |
break; |
break; |
525 |
|
|
526 |
|
/*FIXME: centralize this*/ |
527 |
|
/*FIXME: SGC_CONTBLOCK_P? */ |
528 |
|
#define SGC_MARK_CP(a_,b_) {fixnum _t=(b_);if (inheap((a_))) {\ |
529 |
|
if (what_to_collect == t_contiguous) mark_contblock((void *)(a_),_t);\ |
530 |
|
} else if (SGC_RELBLOCK_P((a_))) (a_)=(void *)copy_relblock((void *)(a_),_t);} |
531 |
|
|
532 |
|
#define SGC_MARK_MP(a_) {if ((a_)->_mp_d) \ |
533 |
|
SGC_MARK_CP((a_)->_mp_d,(a_)->_mp_alloc*MP_LIMB_SIZE);} |
534 |
|
|
535 |
case t_random: |
case t_random: |
536 |
|
if ((int)what_to_collect >= (int)t_contiguous) { |
537 |
|
SGC_MARK_MP(x->rnd.rnd_state._mp_seed); |
538 |
|
if (x->rnd.rnd_state._mp_algdata._mp_lc) { |
539 |
|
SGC_MARK_MP(x->rnd.rnd_state._mp_algdata._mp_lc->_mp_a); |
540 |
|
if (!x->rnd.rnd_state._mp_algdata._mp_lc->_mp_m2exp) SGC_MARK_MP(x->rnd.rnd_state._mp_algdata._mp_lc->_mp_m); |
541 |
|
SGC_MARK_CP(x->rnd.rnd_state._mp_algdata._mp_lc,sizeof(*x->rnd.rnd_state._mp_algdata._mp_lc)); |
542 |
|
} |
543 |
|
} |
544 |
break; |
break; |
545 |
|
|
546 |
case t_readtable: |
case t_readtable: |
599 |
break; |
break; |
600 |
if (what_to_collect == t_contiguous) { |
if (what_to_collect == t_contiguous) { |
601 |
if (!MAYBE_DATA_P((x->cfd.cfd_start)) || |
if (!MAYBE_DATA_P((x->cfd.cfd_start)) || |
602 |
get_mark_bit((int *)(x->cfd.cfd_start))) |
get_mark_bit(x->cfd.cfd_start)) |
603 |
break; |
break; |
604 |
mark_contblock(x->cfd.cfd_start, x->cfd.cfd_size); |
mark_contblock(x->cfd.cfd_start, x->cfd.cfd_size); |
605 |
} |
} |
608 |
sgc_mark_object(x->cc.cc_name); |
sgc_mark_object(x->cc.cc_name); |
609 |
sgc_mark_object(x->cc.cc_env); |
sgc_mark_object(x->cc.cc_env); |
610 |
sgc_mark_object(x->cc.cc_data); |
sgc_mark_object(x->cc.cc_data); |
611 |
|
if (x->cc.cc_turbo!=NULL) sgc_mark_object(*(x->cc.cc_turbo-1)); |
612 |
if (what_to_collect == t_contiguous) { |
if (what_to_collect == t_contiguous) { |
613 |
if (x->cc.cc_turbo != NULL) |
if (x->cc.cc_turbo != NULL) |
614 |
mark_contblock((char *)(x->cc.cc_turbo-1), |
mark_contblock((char *)(x->cc.cc_turbo-1), |
632 |
static void |
static void |
633 |
sgc_mark_stack_carefully(void *topv, void *bottomv, int offset) { |
sgc_mark_stack_carefully(void *topv, void *bottomv, int offset) { |
634 |
|
|
635 |
long m,pageoffset; |
long pageoffset; |
636 |
unsigned long p; |
unsigned long p; |
637 |
object x; |
object x; |
638 |
struct typemanager *tm; |
struct typemanager *tm; |
661 |
((pageoffset=((char *)*j - pagetochar(p))) % |
((pageoffset=((char *)*j - pagetochar(p))) % |
662 |
tm->tm_size)); |
tm->tm_size)); |
663 |
if ((pageoffset < (tm->tm_size * tm->tm_nppage)) |
if ((pageoffset < (tm->tm_size * tm->tm_nppage)) |
664 |
&& (m=x->d.m) != FREE) { |
&& !is_marked_or_free(x)) { |
|
if (m==TRUE) continue; |
|
|
if (m!=0) { |
|
|
fprintf(stdout, |
|
|
"**bad value %ld of d.m in gbc page %ld skipping mark**" |
|
|
,m,p);fflush(stdout); |
|
|
continue; |
|
|
} |
|
665 |
sgc_mark_object(x); |
sgc_mark_object(x); |
666 |
} |
} |
667 |
} |
} |
699 |
object x = (object) p; |
object x = (object) p; |
700 |
if (SGC_OR_M(x)) |
if (SGC_OR_M(x)) |
701 |
continue; |
continue; |
702 |
if (x->d.t==t_cons) { |
if (type_of(x)==t_cons) { |
703 |
x->d.m = TRUE; |
mark(x); |
704 |
sgc_mark_cons(x); |
sgc_mark_cons(x); |
705 |
} else |
} else |
706 |
sgc_mark_object1(x); |
sgc_mark_object1(x); |
790 |
STATIC object f; |
STATIC object f; |
791 |
int size; |
int size; |
792 |
|
|
793 |
Cnil->s.m = FALSE; |
unmark(Cnil); |
794 |
Ct->s.m = FALSE; |
unmark(Ct); |
795 |
|
|
796 |
#ifdef DEBUG |
#ifdef DEBUG |
797 |
if (debug) |
if (debug) |
834 |
for (j = tm->tm_nppage; --j >= 0; p += size) { |
for (j = tm->tm_nppage; --j >= 0; p += size) { |
835 |
x = (object)p; |
x = (object)p; |
836 |
|
|
837 |
if (x->d.m == FREE) |
if (is_free(x)) |
838 |
continue; |
continue; |
839 |
else if (x->d.m) { |
else if (is_marked(x)) { |
840 |
x->d.m = FALSE; |
unmark(x); |
841 |
continue; |
continue; |
842 |
} |
} |
843 |
if(x->d.s == SGC_NORMAL) |
if(!is_cons(x) && x->d.s == SGC_NORMAL) |
844 |
continue; |
continue; |
845 |
|
|
846 |
/* it is ok to free x */ |
/* it is ok to free x */ |
847 |
|
|
848 |
#ifdef OLD_DISPLACE |
#ifdef OLD_DISPLACE |
849 |
/* old_displace: from might be free, to not */ |
/* old_displace: from might be free, to not */ |
850 |
if(x->d.t >=t_array && x->d.t <= t_bitvector) { |
if(type_of(x) >=t_array && type_of(x) <= t_bitvector) { |
851 |
/* case t_array: |
/* case t_array: |
852 |
case t_vector: |
case t_vector: |
853 |
case t_string: |
case t_string: |
867 |
} |
} |
868 |
#endif /* OLD_DISPLACE */ |
#endif /* OLD_DISPLACE */ |
869 |
#ifdef GMP_USE_MALLOC |
#ifdef GMP_USE_MALLOC |
870 |
if (x->d.t == t_bignum) |
if (type_of(x) == t_bignum) |
871 |
mpz_clear(MP(x)); |
mpz_clear(MP(x)); |
872 |
#endif |
#endif |
873 |
|
|
874 |
SET_LINK(x,f); |
SET_LINK(x,f); |
875 |
x->d.m = FREE; |
make_free(x); |
876 |
x->d.s = (int)SGC_RECENT; |
if (!is_cons(x)) x->d.s = (int)SGC_RECENT; |
877 |
f = x; |
f = x; |
878 |
k++; |
k++; |
879 |
} |
} |
883 |
else /*non sgc_page */ |
else /*non sgc_page */ |
884 |
for (j = tm->tm_nppage; --j >= 0; p += size) { |
for (j = tm->tm_nppage; --j >= 0; p += size) { |
885 |
x = (object)p; |
x = (object)p; |
886 |
if (x->d.m == TRUE) x->d.m=FALSE; |
if (is_marked(x) && !is_free(x)) {unmark(x);} |
887 |
} |
} |
888 |
|
|
889 |
} |
} |
918 |
s = pagetochar(i); |
s = pagetochar(i); |
919 |
e = pagetochar(j); |
e = pagetochar(j); |
920 |
for (p = s; p < e;) { |
for (p = s; p < e;) { |
921 |
if (get_mark_bit((int *)p)) { |
if (get_mark_bit(p)) { |
922 |
/* SGC cont pages: cont blocks must be no smaller than |
/* SGC cont pages: cont blocks must be no smaller than |
923 |
sizeof(struct contblock), and must not have a sweep |
sizeof(struct contblock), and must not have a sweep |
924 |
granularity greater than this amount (e.g. CPTR_ALIGN) if |
granularity greater than this amount (e.g. CPTR_ALIGN) if |
929 |
} |
} |
930 |
q = p + CPTR_ALIGN; |
q = p + CPTR_ALIGN; |
931 |
while (q < e) { |
while (q < e) { |
932 |
if (!get_mark_bit((int *)q)) { |
if (!get_mark_bit(q)) { |
933 |
q += CPTR_ALIGN; |
q += CPTR_ALIGN; |
934 |
continue; |
continue; |
935 |
} |
} |
943 |
#ifdef DEBUG |
#ifdef DEBUG |
944 |
if (debug) { |
if (debug) { |
945 |
for (cbp = cb_pointer; cbp != NULL; cbp = cbp->cb_link) |
for (cbp = cb_pointer; cbp != NULL; cbp = cbp->cb_link) |
946 |
printf("%d-byte contblock\n", cbp->cb_size); |
printf("%ld-byte contblock\n", cbp->cb_size); |
947 |
fflush(stdout); |
fflush(stdout); |
948 |
} |
} |
949 |
#endif |
#endif |
1227 |
#define WSGC(tm) ({long _t=MMAX(MMIN(tm->tm_opt_maxpage,tm->tm_npage),tm->tm_sgc);_t;}) |
#define WSGC(tm) ({long _t=MMAX(MMIN(tm->tm_opt_maxpage,tm->tm_npage),tm->tm_sgc);_t;}) |
1228 |
/* If opt_maxpage is set, add full pages to the sgc set if needed |
/* If opt_maxpage is set, add full pages to the sgc set if needed |
1229 |
too. 20040804 CM*/ |
too. 20040804 CM*/ |
1230 |
#define FSGC(tm) (tm->tm_opt_maxpage ? 0 : tm->tm_sgc_minfree) |
#define FSGC(tm) (tm->tm_type==t_cons ? tm->tm_nppage : (tm->tm_opt_maxpage ? 0 : tm->tm_sgc_minfree)) |
1231 |
|
|
1232 |
int |
int |
1233 |
sgc_start(void) { |
sgc_start(void) { |
1489 |
while (f!=0) { |
while (f!=0) { |
1490 |
next=OBJ_LINK(f); |
next=OBJ_LINK(f); |
1491 |
#ifdef SDEBUG |
#ifdef SDEBUG |
1492 |
if (f->d.m!=FREE) |
if (!is_free(f)) |
1493 |
printf("Not FREE in freelist f=%d",f); |
printf("Not FREE in freelist f=%d",f); |
1494 |
#endif |
#endif |
1495 |
if (ON_SGC_PAGE(f)) { |
if (ON_SGC_PAGE(f)) { |
1496 |
SET_LINK(f,x); |
SET_LINK(f,x); |
1497 |
f->d.s = SGC_RECENT; |
if (!is_cons(f)) f->d.s = SGC_RECENT; |
1498 |
x=f; |
x=f; |
1499 |
count++; |
count++; |
1500 |
} else { |
} else { |
1501 |
SET_LINK(f,y); |
SET_LINK(f,y); |
1502 |
f->d.s = SGC_NORMAL; |
if (!is_cons(f)) f->d.s = SGC_NORMAL; |
1503 |
y=f; |
y=f; |
1504 |
} |
} |
1505 |
f=next; |
f=next; |
1606 |
if (type_map[i]==t && (sgc_type_map[i] & SGC_PAGE_FLAG)) |
if (type_map[i]==t && (sgc_type_map[i] & SGC_PAGE_FLAG)) |
1607 |
for (p= pagetochar(i),j = tm->tm_nppage; |
for (p= pagetochar(i),j = tm->tm_nppage; |
1608 |
j > 0; --j, p += tm->tm_size) |
j > 0; --j, p += tm->tm_size) |
1609 |
((object) p)->d.s = SGC_NORMAL; |
if (!is_cons((object)p)) ((object) p)->d.s = SGC_NORMAL; |
1610 |
} |
} |
1611 |
} |
} |
1612 |
} |
} |
1685 |
INSTALL_MPROTECT_HANDLER; |
INSTALL_MPROTECT_HANDLER; |
1686 |
#endif |
#endif |
1687 |
|
|
1688 |
segmentation_catcher(0); |
segmentation_catcher(sig,code,scp,addr); |
1689 |
|
|
1690 |
} |
} |
1691 |
|
|