comparison src/alloc.c @ 91056:1251cabc40b7

Merge from emacs--devo--0 Patches applied: * emacs--devo--0 (patch 890-898) - Update from CVS - Merge from emacs--rel--22 * emacs--rel--22 (patch 122-128) - Update from CVS - Merge from gnus--rel--5.10 * gnus--rel--5.10 (patch 257-258) - Merge from emacs--rel--22 - Update from CVS Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-270
author Miles Bader <miles@gnu.org>
date Fri, 19 Oct 2007 00:00:21 +0000
parents 35069180a991 99492f857499
children 4bc33ffdda1a
comparison
equal deleted inserted replaced
91055:46bc3a01b2fa 91056:1251cabc40b7
1151 allocate_buffer () 1151 allocate_buffer ()
1152 { 1152 {
1153 struct buffer *b 1153 struct buffer *b
1154 = (struct buffer *) lisp_malloc (sizeof (struct buffer), 1154 = (struct buffer *) lisp_malloc (sizeof (struct buffer),
1155 MEM_TYPE_BUFFER); 1155 MEM_TYPE_BUFFER);
1156 b->size = sizeof (struct buffer) / sizeof (EMACS_INT);
1157 XSETPVECTYPE (b, PVEC_BUFFER);
1156 return b; 1158 return b;
1157 } 1159 }
1158 1160
1159 1161
1160 #ifndef SYSTEM_MALLOC 1162 #ifndef SYSTEM_MALLOC
3305 MALLOC_UNBLOCK_INPUT; 3307 MALLOC_UNBLOCK_INPUT;
3306 3308
3307 --total_free_markers; 3309 --total_free_markers;
3308 consing_since_gc += sizeof (union Lisp_Misc); 3310 consing_since_gc += sizeof (union Lisp_Misc);
3309 misc_objects_consed++; 3311 misc_objects_consed++;
3310 XMARKER (val)->gcmarkbit = 0; 3312 XMISCANY (val)->gcmarkbit = 0;
3311 return val; 3313 return val;
3312 } 3314 }
3313 3315
3314 /* Free a Lisp_Misc object */ 3316 /* Free a Lisp_Misc object */
3315 3317
3316 void 3318 void
3317 free_misc (misc) 3319 free_misc (misc)
3318 Lisp_Object misc; 3320 Lisp_Object misc;
3319 { 3321 {
3320 XMISC (misc)->u_marker.type = Lisp_Misc_Free; 3322 XMISCTYPE (misc) = Lisp_Misc_Free;
3321 XMISC (misc)->u_free.chain = marker_free_list; 3323 XMISC (misc)->u_free.chain = marker_free_list;
3322 marker_free_list = XMISC (misc); 3324 marker_free_list = XMISC (misc);
3323 3325
3324 total_free_markers++; 3326 total_free_markers++;
3325 } 3327 }
4031 return (offset >= 0 4033 return (offset >= 0
4032 && offset % sizeof b->markers[0] == 0 4034 && offset % sizeof b->markers[0] == 0
4033 && offset < (MARKER_BLOCK_SIZE * sizeof b->markers[0]) 4035 && offset < (MARKER_BLOCK_SIZE * sizeof b->markers[0])
4034 && (b != marker_block 4036 && (b != marker_block
4035 || offset / sizeof b->markers[0] < marker_block_index) 4037 || offset / sizeof b->markers[0] < marker_block_index)
4036 && ((union Lisp_Misc *) p)->u_marker.type != Lisp_Misc_Free); 4038 && ((union Lisp_Misc *) p)->u_any.type != Lisp_Misc_Free);
4037 } 4039 }
4038 else 4040 else
4039 return 0; 4041 return 0;
4040 } 4042 }
4041 4043
4162 else if (live_buffer_p (m, po)) 4164 else if (live_buffer_p (m, po))
4163 mark_p = BUFFERP (obj) && !VECTOR_MARKED_P (XBUFFER (obj)); 4165 mark_p = BUFFERP (obj) && !VECTOR_MARKED_P (XBUFFER (obj));
4164 break; 4166 break;
4165 4167
4166 case Lisp_Misc: 4168 case Lisp_Misc:
4167 mark_p = (live_misc_p (m, po) && !XMARKER (obj)->gcmarkbit); 4169 mark_p = (live_misc_p (m, po) && !XMISCANY (obj)->gcmarkbit);
4168 break; 4170 break;
4169 4171
4170 case Lisp_Int: 4172 case Lisp_Int:
4171 case Lisp_Type_Limit: 4173 case Lisp_Type_Limit:
4172 break; 4174 break;
5611 } 5613 }
5612 break; 5614 break;
5613 5615
5614 case Lisp_Misc: 5616 case Lisp_Misc:
5615 CHECK_ALLOCATED_AND_LIVE (live_misc_p); 5617 CHECK_ALLOCATED_AND_LIVE (live_misc_p);
5616 if (XMARKER (obj)->gcmarkbit) 5618 if (XMISCANY (obj)->gcmarkbit)
5617 break; 5619 break;
5618 XMARKER (obj)->gcmarkbit = 1; 5620 XMISCANY (obj)->gcmarkbit = 1;
5619 5621
5620 switch (XMISCTYPE (obj)) 5622 switch (XMISCTYPE (obj))
5621 { 5623 {
5622 case Lisp_Misc_Buffer_Local_Value: 5624 case Lisp_Misc_Buffer_Local_Value:
5623 case Lisp_Misc_Some_Buffer_Local_Value:
5624 { 5625 {
5625 register struct Lisp_Buffer_Local_Value *ptr 5626 register struct Lisp_Buffer_Local_Value *ptr
5626 = XBUFFER_LOCAL_VALUE (obj); 5627 = XBUFFER_LOCAL_VALUE (obj);
5627 /* If the cdr is nil, avoid recursion for the car. */ 5628 /* If the cdr is nil, avoid recursion for the car. */
5628 if (EQ (ptr->cdr, Qnil)) 5629 if (EQ (ptr->cdr, Qnil))
5804 case Lisp_Symbol: 5805 case Lisp_Symbol:
5805 survives_p = XSYMBOL (obj)->gcmarkbit; 5806 survives_p = XSYMBOL (obj)->gcmarkbit;
5806 break; 5807 break;
5807 5808
5808 case Lisp_Misc: 5809 case Lisp_Misc:
5809 survives_p = XMARKER (obj)->gcmarkbit; 5810 survives_p = XMISCANY (obj)->gcmarkbit;
5810 break; 5811 break;
5811 5812
5812 case Lisp_String: 5813 case Lisp_String:
5813 survives_p = STRING_MARKED_P (XSTRING (obj)); 5814 survives_p = STRING_MARKED_P (XSTRING (obj));
5814 break; 5815 break;
6101 register int i; 6102 register int i;
6102 int this_free = 0; 6103 int this_free = 0;
6103 6104
6104 for (i = 0; i < lim; i++) 6105 for (i = 0; i < lim; i++)
6105 { 6106 {
6106 if (!mblk->markers[i].u_marker.gcmarkbit) 6107 if (!mblk->markers[i].u_any.gcmarkbit)
6107 { 6108 {
6108 if (mblk->markers[i].u_marker.type == Lisp_Misc_Marker) 6109 if (mblk->markers[i].u_any.type == Lisp_Misc_Marker)
6109 unchain_marker (&mblk->markers[i].u_marker); 6110 unchain_marker (&mblk->markers[i].u_marker);
6110 /* Set the type of the freed object to Lisp_Misc_Free. 6111 /* Set the type of the freed object to Lisp_Misc_Free.
6111 We could leave the type alone, since nobody checks it, 6112 We could leave the type alone, since nobody checks it,
6112 but this might catch bugs faster. */ 6113 but this might catch bugs faster. */
6113 mblk->markers[i].u_marker.type = Lisp_Misc_Free; 6114 mblk->markers[i].u_marker.type = Lisp_Misc_Free;
6116 this_free++; 6117 this_free++;
6117 } 6118 }
6118 else 6119 else
6119 { 6120 {
6120 num_used++; 6121 num_used++;
6121 mblk->markers[i].u_marker.gcmarkbit = 0; 6122 mblk->markers[i].u_any.gcmarkbit = 0;
6122 } 6123 }
6123 } 6124 }
6124 lim = MARKER_BLOCK_SIZE; 6125 lim = MARKER_BLOCK_SIZE;
6125 /* If this block contains only free markers and we have already 6126 /* If this block contains only free markers and we have already
6126 seen more than two blocks worth of free markers then deallocate 6127 seen more than two blocks worth of free markers then deallocate
6254 die (msg, file, line) 6255 die (msg, file, line)
6255 const char *msg; 6256 const char *msg;
6256 const char *file; 6257 const char *file;
6257 int line; 6258 int line;
6258 { 6259 {
6259 fprintf (stderr, "\r\nEmacs fatal error: %s:%d: %s\r\n", 6260 fprintf (stderr, "\r\n%s:%d: Emacs fatal error: %s\r\n",
6260 file, line, msg); 6261 file, line, msg);
6261 abort (); 6262 abort ();
6262 } 6263 }
6263 6264
6264 /* Initialization */ 6265 /* Initialization */