aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c70
1 files changed, 35 insertions, 35 deletions
diff --git a/src/alloc.c b/src/alloc.c
index 37ec06c7be1..c1f1094d15f 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -1365,7 +1365,7 @@ uninterrupt_malloc ()
1365 pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE); 1365 pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE);
1366 pthread_mutex_init (&alloc_mutex, &attr); 1366 pthread_mutex_init (&alloc_mutex, &attr);
1367#else /* !DOUG_LEA_MALLOC */ 1367#else /* !DOUG_LEA_MALLOC */
1368 /* Some systems such as Solaris 2.6 doesn't have a recursive mutex, 1368 /* Some systems such as Solaris 2.6 don't have a recursive mutex,
1369 and the bundled gmalloc.c doesn't require it. */ 1369 and the bundled gmalloc.c doesn't require it. */
1370 pthread_mutex_init (&alloc_mutex, NULL); 1370 pthread_mutex_init (&alloc_mutex, NULL);
1371#endif /* !DOUG_LEA_MALLOC */ 1371#endif /* !DOUG_LEA_MALLOC */
@@ -3193,13 +3193,13 @@ Its value and function definition are void, and its property list is nil. */)
3193 p = XSYMBOL (val); 3193 p = XSYMBOL (val);
3194 p->xname = name; 3194 p->xname = name;
3195 p->plist = Qnil; 3195 p->plist = Qnil;
3196 p->value = Qunbound; 3196 p->redirect = SYMBOL_PLAINVAL;
3197 SET_SYMBOL_VAL (p, Qunbound);
3197 p->function = Qunbound; 3198 p->function = Qunbound;
3198 p->next = NULL; 3199 p->next = NULL;
3199 p->gcmarkbit = 0; 3200 p->gcmarkbit = 0;
3200 p->interned = SYMBOL_UNINTERNED; 3201 p->interned = SYMBOL_UNINTERNED;
3201 p->constant = 0; 3202 p->constant = 0;
3202 p->indirect_variable = 0;
3203 consing_since_gc += sizeof (struct Lisp_Symbol); 3203 consing_since_gc += sizeof (struct Lisp_Symbol);
3204 symbols_consed++; 3204 symbols_consed++;
3205 return val; 3205 return val;
@@ -5581,17 +5581,42 @@ mark_object (arg)
5581 break; 5581 break;
5582 CHECK_ALLOCATED_AND_LIVE (live_symbol_p); 5582 CHECK_ALLOCATED_AND_LIVE (live_symbol_p);
5583 ptr->gcmarkbit = 1; 5583 ptr->gcmarkbit = 1;
5584 mark_object (ptr->value);
5585 mark_object (ptr->function); 5584 mark_object (ptr->function);
5586 mark_object (ptr->plist); 5585 mark_object (ptr->plist);
5587 5586 switch (ptr->redirect)
5587 {
5588 case SYMBOL_PLAINVAL: mark_object (SYMBOL_VAL (ptr)); break;
5589 case SYMBOL_VARALIAS:
5590 {
5591 Lisp_Object tem;
5592 XSETSYMBOL (tem, SYMBOL_ALIAS (ptr));
5593 mark_object (tem);
5594 break;
5595 }
5596 case SYMBOL_LOCALIZED:
5597 {
5598 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (ptr);
5599 /* If the value is forwarded to a buffer or keyboard field,
5600 these are marked when we see the corresponding object.
5601 And if it's forwarded to a C variable, either it's not
5602 a Lisp_Object var, or it's staticpro'd already. */
5603 mark_object (blv->where);
5604 mark_object (blv->valcell);
5605 mark_object (blv->defcell);
5606 break;
5607 }
5608 case SYMBOL_FORWARDED:
5609 /* If the value is forwarded to a buffer or keyboard field,
5610 these are marked when we see the corresponding object.
5611 And if it's forwarded to a C variable, either it's not
5612 a Lisp_Object var, or it's staticpro'd already. */
5613 break;
5614 default: abort ();
5615 }
5588 if (!PURE_POINTER_P (XSTRING (ptr->xname))) 5616 if (!PURE_POINTER_P (XSTRING (ptr->xname)))
5589 MARK_STRING (XSTRING (ptr->xname)); 5617 MARK_STRING (XSTRING (ptr->xname));
5590 MARK_INTERVAL_TREE (STRING_INTERVALS (ptr->xname)); 5618 MARK_INTERVAL_TREE (STRING_INTERVALS (ptr->xname));
5591 5619
5592 /* Note that we do not mark the obarray of the symbol.
5593 It is safe not to do so because nothing accesses that
5594 slot except to check whether it is nil. */
5595 ptr = ptr->next; 5620 ptr = ptr->next;
5596 if (ptr) 5621 if (ptr)
5597 { 5622 {
@@ -5610,22 +5635,6 @@ mark_object (arg)
5610 5635
5611 switch (XMISCTYPE (obj)) 5636 switch (XMISCTYPE (obj))
5612 { 5637 {
5613 case Lisp_Misc_Buffer_Local_Value:
5614 {
5615 register struct Lisp_Buffer_Local_Value *ptr
5616 = XBUFFER_LOCAL_VALUE (obj);
5617 /* If the cdr is nil, avoid recursion for the car. */
5618 if (EQ (ptr->cdr, Qnil))
5619 {
5620 obj = ptr->realvalue;
5621 goto loop;
5622 }
5623 mark_object (ptr->realvalue);
5624 mark_object (ptr->buffer);
5625 mark_object (ptr->frame);
5626 obj = ptr->cdr;
5627 goto loop;
5628 }
5629 5638
5630 case Lisp_Misc_Marker: 5639 case Lisp_Misc_Marker:
5631 /* DO NOT mark thru the marker's chain. 5640 /* DO NOT mark thru the marker's chain.
@@ -5633,17 +5642,6 @@ mark_object (arg)
5633 instead, markers are removed from the chain when freed by gc. */ 5642 instead, markers are removed from the chain when freed by gc. */
5634 break; 5643 break;
5635 5644
5636 case Lisp_Misc_Intfwd:
5637 case Lisp_Misc_Boolfwd:
5638 case Lisp_Misc_Objfwd:
5639 case Lisp_Misc_Buffer_Objfwd:
5640 case Lisp_Misc_Kboard_Objfwd:
5641 /* Don't bother with Lisp_Buffer_Objfwd,
5642 since all markable slots in current buffer marked anyway. */
5643 /* Don't need to do Lisp_Objfwd, since the places they point
5644 are protected with staticpro. */
5645 break;
5646
5647 case Lisp_Misc_Save_Value: 5645 case Lisp_Misc_Save_Value:
5648#if GC_MARK_STACK 5646#if GC_MARK_STACK
5649 { 5647 {
@@ -6048,6 +6046,8 @@ gc_sweep ()
6048 6046
6049 if (!sym->gcmarkbit && !pure_p) 6047 if (!sym->gcmarkbit && !pure_p)
6050 { 6048 {
6049 if (sym->redirect == SYMBOL_LOCALIZED)
6050 xfree (SYMBOL_BLV (sym));
6051 sym->next = symbol_free_list; 6051 sym->next = symbol_free_list;
6052 symbol_free_list = sym; 6052 symbol_free_list = sym;
6053#if GC_MARK_STACK 6053#if GC_MARK_STACK