comparison src/alloc.c @ 90072:cb67264d6096

Revision: miles@gnu.org--gnu-2005/emacs--unicode--0--patch-2 Merge from emacs--cvs-trunk--0 Patches applied: * miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-83 - miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-84 Update from CVS * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-3 - miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-4 Update from CVS * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-5 Merge from gnus--rel--5.10 * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-6 - miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-11 Update from CVS * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-12 Remove "-face" suffix from lazy-highlight face name * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-13 - miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-16 Update from CVS * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-17 Merge from gnus--rel--5.10 * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-18 - miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-21 Update from CVS * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-22 <no summary provided> * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-23 - miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-39 Update from CVS * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-40 Fix regressions from latest reftex update * miles@gnu.org--gnu-2005/gnus--rel--5.10--base-0 tag of miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-82 * miles@gnu.org--gnu-2005/gnus--rel--5.10--patch-1 Merge from emacs--cvs-trunk--0 * miles@gnu.org--gnu-2005/gnus--rel--5.10--patch-2 Merge from miles@gnu.org--gnu-2004 * miles@gnu.org--gnu-2005/gnus--rel--5.10--patch-3 Merge from emacs--cvs-trunk--0
author Miles Bader <miles@gnu.org>
date Sun, 16 Jan 2005 03:40:12 +0000
parents 95879cc1ed20 eeb8b96d077d
children 6d92d69fae33
comparison
equal deleted inserted replaced
90071:f6b4d0ebf147 90072:cb67264d6096
101 of these threads preempts the Emacs main thread and the hook variables 101 of these threads preempts the Emacs main thread and the hook variables
102 end up in an inconsistent state. So we have a mutex to prevent that (note 102 end up in an inconsistent state. So we have a mutex to prevent that (note
103 that the backend handles concurrent access to malloc within its own threads 103 that the backend handles concurrent access to malloc within its own threads
104 but Emacs code running in the main thread is not included in that control). 104 but Emacs code running in the main thread is not included in that control).
105 105
106 When UNBLOCK_INPUT is called, revoke_input_signal may be called. If this 106 When UNBLOCK_INPUT is called, reinvoke_input_signal may be called. If this
107 happens in one of the backend threads we will have two threads that tries 107 happens in one of the backend threads we will have two threads that tries
108 to run Emacs code at once, and the code is not prepared for that. 108 to run Emacs code at once, and the code is not prepared for that.
109 To prevent that, we only call BLOCK/UNBLOCK from the main thread. */ 109 To prevent that, we only call BLOCK/UNBLOCK from the main thread. */
110 110
111 static pthread_mutex_t alloc_mutex; 111 static pthread_mutex_t alloc_mutex;
307 static void gc_sweep P_ ((void)); 307 static void gc_sweep P_ ((void));
308 static void mark_glyph_matrix P_ ((struct glyph_matrix *)); 308 static void mark_glyph_matrix P_ ((struct glyph_matrix *));
309 static void mark_face_cache P_ ((struct face_cache *)); 309 static void mark_face_cache P_ ((struct face_cache *));
310 310
311 #ifdef HAVE_WINDOW_SYSTEM 311 #ifdef HAVE_WINDOW_SYSTEM
312 extern void mark_fringe_data P_ ((void));
312 static void mark_image P_ ((struct image *)); 313 static void mark_image P_ ((struct image *));
313 static void mark_image_cache P_ ((struct frame *)); 314 static void mark_image_cache P_ ((struct frame *));
314 #endif /* HAVE_WINDOW_SYSTEM */ 315 #endif /* HAVE_WINDOW_SYSTEM */
315 316
316 static struct Lisp_String *allocate_string P_ ((void)); 317 static struct Lisp_String *allocate_string P_ ((void));
702 size_t osize = XMALLOC_GET_SIZE (val); 703 size_t osize = XMALLOC_GET_SIZE (val);
703 if (bcmp (xmalloc_overrun_check_trailer, 704 if (bcmp (xmalloc_overrun_check_trailer,
704 val + osize, 705 val + osize,
705 XMALLOC_OVERRUN_CHECK_SIZE)) 706 XMALLOC_OVERRUN_CHECK_SIZE))
706 abort (); 707 abort ();
708 #ifdef XMALLOC_CLEAR_FREE_MEMORY
709 val -= XMALLOC_OVERRUN_CHECK_SIZE;
710 memset (val, 0xff, osize + XMALLOC_OVERRUN_CHECK_SIZE*2);
711 #else
707 bzero (val + osize, XMALLOC_OVERRUN_CHECK_SIZE); 712 bzero (val + osize, XMALLOC_OVERRUN_CHECK_SIZE);
708 val -= XMALLOC_OVERRUN_CHECK_SIZE; 713 val -= XMALLOC_OVERRUN_CHECK_SIZE;
709 bzero (val, XMALLOC_OVERRUN_CHECK_SIZE); 714 bzero (val, XMALLOC_OVERRUN_CHECK_SIZE);
715 #endif
710 } 716 }
711 717
712 free (val); 718 free (val);
713 --check_depth; 719 --check_depth;
714 } 720 }
1111 MEM_TYPE_BUFFER); 1117 MEM_TYPE_BUFFER);
1112 return b; 1118 return b;
1113 } 1119 }
1114 1120
1115 1121
1122 #ifndef SYSTEM_MALLOC
1123
1124 /* If we released our reserve (due to running out of memory),
1125 and we have a fair amount free once again,
1126 try to set aside another reserve in case we run out once more.
1127
1128 This is called when a relocatable block is freed in ralloc.c. */
1129
1130 void
1131 refill_memory_reserve ()
1132 {
1133 if (spare_memory == 0)
1134 spare_memory = (char *) malloc ((size_t) SPARE_MEMORY);
1135 }
1136
1137
1116 /* Arranging to disable input signals while we're in malloc. 1138 /* Arranging to disable input signals while we're in malloc.
1117 1139
1118 This only works with GNU malloc. To help out systems which can't 1140 This only works with GNU malloc. To help out systems which can't
1119 use GNU malloc, all the calls to malloc, realloc, and free 1141 use GNU malloc, all the calls to malloc, realloc, and free
1120 elsewhere in the code should be inside a BLOCK_INPUT/UNBLOCK_INPUT 1142 elsewhere in the code should be inside a BLOCK_INPUT/UNBLOCK_INPUT
1121 pairs; unfortunately, we have no idea what C library functions 1143 pair; unfortunately, we have no idea what C library functions
1122 might call malloc, so we can't really protect them unless you're 1144 might call malloc, so we can't really protect them unless you're
1123 using GNU malloc. Fortunately, most of the major operating systems 1145 using GNU malloc. Fortunately, most of the major operating systems
1124 can use GNU malloc. */ 1146 can use GNU malloc. */
1125 1147
1126 #ifndef SYSTEM_MALLOC 1148 #ifndef SYNC_INPUT
1149
1127 #ifndef DOUG_LEA_MALLOC 1150 #ifndef DOUG_LEA_MALLOC
1128 extern void * (*__malloc_hook) P_ ((size_t)); 1151 extern void * (*__malloc_hook) P_ ((size_t));
1129 extern void * (*__realloc_hook) P_ ((void *, size_t)); 1152 extern void * (*__realloc_hook) P_ ((void *, size_t));
1130 extern void (*__free_hook) P_ ((void *)); 1153 extern void (*__free_hook) P_ ((void *));
1131 /* Else declared in malloc.h, perhaps with an extra arg. */ 1154 /* Else declared in malloc.h, perhaps with an extra arg. */
1180 __free_hook = emacs_blocked_free; 1203 __free_hook = emacs_blocked_free;
1181 UNBLOCK_INPUT_ALLOC; 1204 UNBLOCK_INPUT_ALLOC;
1182 } 1205 }
1183 1206
1184 1207
1185 /* If we released our reserve (due to running out of memory),
1186 and we have a fair amount free once again,
1187 try to set aside another reserve in case we run out once more.
1188
1189 This is called when a relocatable block is freed in ralloc.c. */
1190
1191 void
1192 refill_memory_reserve ()
1193 {
1194 if (spare_memory == 0)
1195 spare_memory = (char *) malloc ((size_t) SPARE_MEMORY);
1196 }
1197
1198
1199 /* This function is the malloc hook that Emacs uses. */ 1208 /* This function is the malloc hook that Emacs uses. */
1200 1209
1201 static void * 1210 static void *
1202 emacs_blocked_malloc (size) 1211 emacs_blocked_malloc (size)
1203 size_t size; 1212 size_t size;
1345 if (__realloc_hook != emacs_blocked_realloc) 1354 if (__realloc_hook != emacs_blocked_realloc)
1346 old_realloc_hook = __realloc_hook; 1355 old_realloc_hook = __realloc_hook;
1347 __realloc_hook = emacs_blocked_realloc; 1356 __realloc_hook = emacs_blocked_realloc;
1348 } 1357 }
1349 1358
1359 #endif /* not SYNC_INPUT */
1350 #endif /* not SYSTEM_MALLOC */ 1360 #endif /* not SYSTEM_MALLOC */
1351 1361
1352 1362
1353 1363
1354 /*********************************************************************** 1364 /***********************************************************************
4638 { 4648 {
4639 /* If a buffer's undo list is Qt, that means that undo is 4649 /* If a buffer's undo list is Qt, that means that undo is
4640 turned off in that buffer. Calling truncate_undo_list on 4650 turned off in that buffer. Calling truncate_undo_list on
4641 Qt tends to return NULL, which effectively turns undo back on. 4651 Qt tends to return NULL, which effectively turns undo back on.
4642 So don't call truncate_undo_list if undo_list is Qt. */ 4652 So don't call truncate_undo_list if undo_list is Qt. */
4643 if (! EQ (nextb->undo_list, Qt)) 4653 if (! NILP (nextb->name) && ! EQ (nextb->undo_list, Qt))
4644 truncate_undo_list (nextb); 4654 truncate_undo_list (nextb);
4645 4655
4646 /* Shrink buffer gaps, but skip indirect and dead buffers. */ 4656 /* Shrink buffer gaps, but skip indirect and dead buffers. */
4647 if (nextb->base_buffer == 0 && !NILP (nextb->name)) 4657 if (nextb->base_buffer == 0 && !NILP (nextb->name))
4648 { 4658 {
4749 { 4759 {
4750 mark_object (handler->handler); 4760 mark_object (handler->handler);
4751 mark_object (handler->var); 4761 mark_object (handler->var);
4752 } 4762 }
4753 mark_backtrace (); 4763 mark_backtrace ();
4764
4765 #ifdef HAVE_WINDOW_SYSTEM
4766 mark_fringe_data ();
4767 #endif
4754 4768
4755 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES 4769 #if GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES
4756 mark_stack (); 4770 mark_stack ();
4757 #endif 4771 #endif
4758 4772