aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c98
1 files changed, 56 insertions, 42 deletions
diff --git a/src/alloc.c b/src/alloc.c
index 98d60067f9e..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;
@@ -4893,14 +4893,21 @@ Does not copy symbols. Copies strings without text properties. */)
4893 if (PURE_POINTER_P (XPNTR (obj))) 4893 if (PURE_POINTER_P (XPNTR (obj)))
4894 return obj; 4894 return obj;
4895 4895
4896 if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */
4897 {
4898 Lisp_Object tmp = Fgethash (obj, Vpurify_flag, Qnil);
4899 if (!NILP (tmp))
4900 return tmp;
4901 }
4902
4896 if (CONSP (obj)) 4903 if (CONSP (obj))
4897 return pure_cons (XCAR (obj), XCDR (obj)); 4904 obj = pure_cons (XCAR (obj), XCDR (obj));
4898 else if (FLOATP (obj)) 4905 else if (FLOATP (obj))
4899 return make_pure_float (XFLOAT_DATA (obj)); 4906 obj = make_pure_float (XFLOAT_DATA (obj));
4900 else if (STRINGP (obj)) 4907 else if (STRINGP (obj))
4901 return make_pure_string (SDATA (obj), SCHARS (obj), 4908 obj = make_pure_string (SDATA (obj), SCHARS (obj),
4902 SBYTES (obj), 4909 SBYTES (obj),
4903 STRING_MULTIBYTE (obj)); 4910 STRING_MULTIBYTE (obj));
4904 else if (COMPILEDP (obj) || VECTORP (obj)) 4911 else if (COMPILEDP (obj) || VECTORP (obj))
4905 { 4912 {
4906 register struct Lisp_Vector *vec; 4913 register struct Lisp_Vector *vec;
@@ -4920,10 +4927,15 @@ Does not copy symbols. Copies strings without text properties. */)
4920 } 4927 }
4921 else 4928 else
4922 XSETVECTOR (obj, vec); 4929 XSETVECTOR (obj, vec);
4923 return obj;
4924 } 4930 }
4925 else if (MARKERP (obj)) 4931 else if (MARKERP (obj))
4926 error ("Attempt to copy a marker to pure storage"); 4932 error ("Attempt to copy a marker to pure storage");
4933 else
4934 /* Not purified, don't hash-cons. */
4935 return obj;
4936
4937 if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */
4938 Fputhash (obj, obj, Vpurify_flag);
4927 4939
4928 return obj; 4940 return obj;
4929} 4941}
@@ -5569,17 +5581,42 @@ mark_object (arg)
5569 break; 5581 break;
5570 CHECK_ALLOCATED_AND_LIVE (live_symbol_p); 5582 CHECK_ALLOCATED_AND_LIVE (live_symbol_p);
5571 ptr->gcmarkbit = 1; 5583 ptr->gcmarkbit = 1;
5572 mark_object (ptr->value);
5573 mark_object (ptr->function); 5584 mark_object (ptr->function);
5574 mark_object (ptr->plist); 5585 mark_object (ptr->plist);
5575 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 }
5576 if (!PURE_POINTER_P (XSTRING (ptr->xname))) 5616 if (!PURE_POINTER_P (XSTRING (ptr->xname)))
5577 MARK_STRING (XSTRING (ptr->xname)); 5617 MARK_STRING (XSTRING (ptr->xname));
5578 MARK_INTERVAL_TREE (STRING_INTERVALS (ptr->xname)); 5618 MARK_INTERVAL_TREE (STRING_INTERVALS (ptr->xname));
5579 5619
5580 /* Note that we do not mark the obarray of the symbol.
5581 It is safe not to do so because nothing accesses that
5582 slot except to check whether it is nil. */
5583 ptr = ptr->next; 5620 ptr = ptr->next;
5584 if (ptr) 5621 if (ptr)
5585 { 5622 {
@@ -5598,22 +5635,6 @@ mark_object (arg)
5598 5635
5599 switch (XMISCTYPE (obj)) 5636 switch (XMISCTYPE (obj))
5600 { 5637 {
5601 case Lisp_Misc_Buffer_Local_Value:
5602 {
5603 register struct Lisp_Buffer_Local_Value *ptr
5604 = XBUFFER_LOCAL_VALUE (obj);
5605 /* If the cdr is nil, avoid recursion for the car. */
5606 if (EQ (ptr->cdr, Qnil))
5607 {
5608 obj = ptr->realvalue;
5609 goto loop;
5610 }
5611 mark_object (ptr->realvalue);
5612 mark_object (ptr->buffer);
5613 mark_object (ptr->frame);
5614 obj = ptr->cdr;
5615 goto loop;
5616 }
5617 5638
5618 case Lisp_Misc_Marker: 5639 case Lisp_Misc_Marker:
5619 /* DO NOT mark thru the marker's chain. 5640 /* DO NOT mark thru the marker's chain.
@@ -5621,17 +5642,6 @@ mark_object (arg)
5621 instead, markers are removed from the chain when freed by gc. */ 5642 instead, markers are removed from the chain when freed by gc. */
5622 break; 5643 break;
5623 5644
5624 case Lisp_Misc_Intfwd:
5625 case Lisp_Misc_Boolfwd:
5626 case Lisp_Misc_Objfwd:
5627 case Lisp_Misc_Buffer_Objfwd:
5628 case Lisp_Misc_Kboard_Objfwd:
5629 /* Don't bother with Lisp_Buffer_Objfwd,
5630 since all markable slots in current buffer marked anyway. */
5631 /* Don't need to do Lisp_Objfwd, since the places they point
5632 are protected with staticpro. */
5633 break;
5634
5635 case Lisp_Misc_Save_Value: 5645 case Lisp_Misc_Save_Value:
5636#if GC_MARK_STACK 5646#if GC_MARK_STACK
5637 { 5647 {
@@ -6036,6 +6046,8 @@ gc_sweep ()
6036 6046
6037 if (!sym->gcmarkbit && !pure_p) 6047 if (!sym->gcmarkbit && !pure_p)
6038 { 6048 {
6049 if (sym->redirect == SYMBOL_LOCALIZED)
6050 xfree (SYMBOL_BLV (sym));
6039 sym->next = symbol_free_list; 6051 sym->next = symbol_free_list;
6040 symbol_free_list = sym; 6052 symbol_free_list = sym;
6041#if GC_MARK_STACK 6053#if GC_MARK_STACK
@@ -6371,7 +6383,9 @@ If this portion is smaller than `gc-cons-threshold', this is ignored. */);
6371 6383
6372 DEFVAR_LISP ("purify-flag", &Vpurify_flag, 6384 DEFVAR_LISP ("purify-flag", &Vpurify_flag,
6373 doc: /* Non-nil means loading Lisp code in order to dump an executable. 6385 doc: /* Non-nil means loading Lisp code in order to dump an executable.
6374This means that certain objects should be allocated in shared (pure) space. */); 6386This means that certain objects should be allocated in shared (pure) space.
6387It can also be set to a hash-table, in which case this table is used to
6388do hash-consing of the objects allocated to pure space. */);
6375 6389
6376 DEFVAR_BOOL ("garbage-collection-messages", &garbage_collection_messages, 6390 DEFVAR_BOOL ("garbage-collection-messages", &garbage_collection_messages,
6377 doc: /* Non-nil means display messages at start and end of garbage collection. */); 6391 doc: /* Non-nil means display messages at start and end of garbage collection. */);