Mercurial > emacs
comparison src/alloc.c @ 91073:4bc33ffdda1a
Merge from emacs--devo--0
Patches applied:
* emacs--devo--0 (patch 902-908)
- Update from CVS
- Merge from emacs--rel--22
* emacs--rel--22 (patch 131-137)
- Update from CVS
- Merge from gnus--rel--5.10
* gnus--rel--5.10 (patch 261-262)
- Update from CVS
Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-278
| author | Miles Bader <miles@gnu.org> |
|---|---|
| date | Sat, 27 Oct 2007 09:12:07 +0000 |
| parents | 1251cabc40b7 01258ecfc38e |
| children | b55268b337cd |
comparison
equal
deleted
inserted
replaced
| 91072:74ab3ea909f9 | 91073:4bc33ffdda1a |
|---|---|
| 239 | 239 |
| 240 /* Points to memory space allocated as "spare", to be freed if we run | 240 /* Points to memory space allocated as "spare", to be freed if we run |
| 241 out of memory. We keep one large block, four cons-blocks, and | 241 out of memory. We keep one large block, four cons-blocks, and |
| 242 two string blocks. */ | 242 two string blocks. */ |
| 243 | 243 |
| 244 char *spare_memory[7]; | 244 static char *spare_memory[7]; |
| 245 | 245 |
| 246 /* Amount of spare memory to keep in large reserve block. */ | 246 /* Amount of spare memory to keep in large reserve block. */ |
| 247 | 247 |
| 248 #define SPARE_MEMORY (1 << 14) | 248 #define SPARE_MEMORY (1 << 14) |
| 249 | 249 |
| 322 #define MAX_SAVE_STACK 16000 | 322 #define MAX_SAVE_STACK 16000 |
| 323 #endif | 323 #endif |
| 324 | 324 |
| 325 /* Buffer in which we save a copy of the C stack at each GC. */ | 325 /* Buffer in which we save a copy of the C stack at each GC. */ |
| 326 | 326 |
| 327 char *stack_copy; | 327 static char *stack_copy; |
| 328 int stack_copy_size; | 328 static int stack_copy_size; |
| 329 | 329 |
| 330 /* Non-zero means ignore malloc warnings. Set during initialization. | 330 /* Non-zero means ignore malloc warnings. Set during initialization. |
| 331 Currently not used. */ | 331 Currently not used. */ |
| 332 | 332 |
| 333 int ignore_warnings; | 333 static int ignore_warnings; |
| 334 | 334 |
| 335 Lisp_Object Qgc_cons_threshold, Qchar_table_extra_slots; | 335 Lisp_Object Qgc_cons_threshold, Qchar_table_extra_slots; |
| 336 | 336 |
| 337 /* Hook run after GC has finished. */ | 337 /* Hook run after GC has finished. */ |
| 338 | 338 |
| 395 #endif | 395 #endif |
| 396 | 396 |
| 397 /* A unique object in pure space used to make some Lisp objects | 397 /* A unique object in pure space used to make some Lisp objects |
| 398 on free lists recognizable in O(1). */ | 398 on free lists recognizable in O(1). */ |
| 399 | 399 |
| 400 Lisp_Object Vdead; | 400 static Lisp_Object Vdead; |
| 401 | 401 |
| 402 #ifdef GC_MALLOC_CHECK | 402 #ifdef GC_MALLOC_CHECK |
| 403 | 403 |
| 404 enum mem_type allocated_mem_type; | 404 enum mem_type allocated_mem_type; |
| 405 int dont_register_blocks; | 405 static int dont_register_blocks; |
| 406 | 406 |
| 407 #endif /* GC_MALLOC_CHECK */ | 407 #endif /* GC_MALLOC_CHECK */ |
| 408 | 408 |
| 409 /* A node in the red-black tree describing allocated memory containing | 409 /* A node in the red-black tree describing allocated memory containing |
| 410 Lisp data. Each such block is recorded with its start and end | 410 Lisp data. Each such block is recorded with its start and end |
| 500 struct gcpro *gcprolist; | 500 struct gcpro *gcprolist; |
| 501 | 501 |
| 502 /* Addresses of staticpro'd variables. Initialize it to a nonzero | 502 /* Addresses of staticpro'd variables. Initialize it to a nonzero |
| 503 value; otherwise some compilers put it into BSS. */ | 503 value; otherwise some compilers put it into BSS. */ |
| 504 | 504 |
| 505 #define NSTATICS 0x600 | 505 #define NSTATICS 1280 |
| 506 Lisp_Object *staticvec[NSTATICS] = {&Vpurify_flag}; | 506 static Lisp_Object *staticvec[NSTATICS] = {&Vpurify_flag}; |
| 507 | 507 |
| 508 /* Index of next unused slot in staticvec. */ | 508 /* Index of next unused slot in staticvec. */ |
| 509 | 509 |
| 510 int staticidx = 0; | 510 static int staticidx = 0; |
| 511 | 511 |
| 512 static POINTER_TYPE *pure_alloc P_ ((size_t, int)); | 512 static POINTER_TYPE *pure_alloc P_ ((size_t, int)); |
| 513 | 513 |
| 514 | 514 |
| 515 /* Value is SZ rounded up to the next multiple of ALIGNMENT. | 515 /* Value is SZ rounded up to the next multiple of ALIGNMENT. |
| 1415 }; | 1415 }; |
| 1416 | 1416 |
| 1417 /* Current interval block. Its `next' pointer points to older | 1417 /* Current interval block. Its `next' pointer points to older |
| 1418 blocks. */ | 1418 blocks. */ |
| 1419 | 1419 |
| 1420 struct interval_block *interval_block; | 1420 static struct interval_block *interval_block; |
| 1421 | 1421 |
| 1422 /* Index in interval_block above of the next unused interval | 1422 /* Index in interval_block above of the next unused interval |
| 1423 structure. */ | 1423 structure. */ |
| 1424 | 1424 |
| 1425 static int interval_block_index; | 1425 static int interval_block_index; |
| 1432 | 1432 |
| 1433 INTERVAL interval_free_list; | 1433 INTERVAL interval_free_list; |
| 1434 | 1434 |
| 1435 /* Total number of interval blocks now in use. */ | 1435 /* Total number of interval blocks now in use. */ |
| 1436 | 1436 |
| 1437 int n_interval_blocks; | 1437 static int n_interval_blocks; |
| 1438 | 1438 |
| 1439 | 1439 |
| 1440 /* Initialize interval allocation. */ | 1440 /* Initialize interval allocation. */ |
| 1441 | 1441 |
| 1442 static void | 1442 static void |
| 1754 | 1754 |
| 1755 #define GC_STRING_EXTRA (GC_STRING_OVERRUN_COOKIE_SIZE) | 1755 #define GC_STRING_EXTRA (GC_STRING_OVERRUN_COOKIE_SIZE) |
| 1756 | 1756 |
| 1757 /* Initialize string allocation. Called from init_alloc_once. */ | 1757 /* Initialize string allocation. Called from init_alloc_once. */ |
| 1758 | 1758 |
| 1759 void | 1759 static void |
| 1760 init_strings () | 1760 init_strings () |
| 1761 { | 1761 { |
| 1762 total_strings = total_free_strings = total_string_size = 0; | 1762 total_strings = total_free_strings = total_string_size = 0; |
| 1763 oldest_sblock = current_sblock = large_sblocks = NULL; | 1763 oldest_sblock = current_sblock = large_sblocks = NULL; |
| 1764 string_blocks = NULL; | 1764 string_blocks = NULL; |
| 1771 | 1771 |
| 1772 #ifdef GC_CHECK_STRING_BYTES | 1772 #ifdef GC_CHECK_STRING_BYTES |
| 1773 | 1773 |
| 1774 static int check_string_bytes_count; | 1774 static int check_string_bytes_count; |
| 1775 | 1775 |
| 1776 void check_string_bytes P_ ((int)); | 1776 static void check_string_bytes P_ ((int)); |
| 1777 void check_sblock P_ ((struct sblock *)); | 1777 static void check_sblock P_ ((struct sblock *)); |
| 1778 | 1778 |
| 1779 #define CHECK_STRING_BYTES(S) STRING_BYTES (S) | 1779 #define CHECK_STRING_BYTES(S) STRING_BYTES (S) |
| 1780 | 1780 |
| 1781 | 1781 |
| 1782 /* Like GC_STRING_BYTES, but with debugging check. */ | 1782 /* Like GC_STRING_BYTES, but with debugging check. */ |
| 1793 return nbytes; | 1793 return nbytes; |
| 1794 } | 1794 } |
| 1795 | 1795 |
| 1796 /* Check validity of Lisp strings' string_bytes member in B. */ | 1796 /* Check validity of Lisp strings' string_bytes member in B. */ |
| 1797 | 1797 |
| 1798 void | 1798 static void |
| 1799 check_sblock (b) | 1799 check_sblock (b) |
| 1800 struct sblock *b; | 1800 struct sblock *b; |
| 1801 { | 1801 { |
| 1802 struct sdata *from, *end, *from_end; | 1802 struct sdata *from, *end, *from_end; |
| 1803 | 1803 |
| 1827 | 1827 |
| 1828 /* Check validity of Lisp strings' string_bytes member. ALL_P | 1828 /* Check validity of Lisp strings' string_bytes member. ALL_P |
| 1829 non-zero means check all strings, otherwise check only most | 1829 non-zero means check all strings, otherwise check only most |
| 1830 recently allocated strings. Used for hunting a bug. */ | 1830 recently allocated strings. Used for hunting a bug. */ |
| 1831 | 1831 |
| 1832 void | 1832 static void |
| 1833 check_string_bytes (all_p) | 1833 check_string_bytes (all_p) |
| 1834 int all_p; | 1834 int all_p; |
| 1835 { | 1835 { |
| 1836 if (all_p) | 1836 if (all_p) |
| 1837 { | 1837 { |
| 2580 struct Lisp_Float *float_free_list; | 2580 struct Lisp_Float *float_free_list; |
| 2581 | 2581 |
| 2582 | 2582 |
| 2583 /* Initialize float allocation. */ | 2583 /* Initialize float allocation. */ |
| 2584 | 2584 |
| 2585 void | 2585 static void |
| 2586 init_float () | 2586 init_float () |
| 2587 { | 2587 { |
| 2588 float_block = NULL; | 2588 float_block = NULL; |
| 2589 float_block_index = FLOAT_BLOCK_SIZE; /* Force alloc of new float_block. */ | 2589 float_block_index = FLOAT_BLOCK_SIZE; /* Force alloc of new float_block. */ |
| 2590 float_free_list = 0; | 2590 float_free_list = 0; |
| 2592 } | 2592 } |
| 2593 | 2593 |
| 2594 | 2594 |
| 2595 /* Explicitly free a float cell by putting it on the free-list. */ | 2595 /* Explicitly free a float cell by putting it on the free-list. */ |
| 2596 | 2596 |
| 2597 void | 2597 static void |
| 2598 free_float (ptr) | 2598 free_float (ptr) |
| 2599 struct Lisp_Float *ptr; | 2599 struct Lisp_Float *ptr; |
| 2600 { | 2600 { |
| 2601 ptr->u.chain = float_free_list; | 2601 ptr->u.chain = float_free_list; |
| 2602 float_free_list = ptr; | 2602 float_free_list = ptr; |
| 2699 | 2699 |
| 2700 struct Lisp_Cons *cons_free_list; | 2700 struct Lisp_Cons *cons_free_list; |
| 2701 | 2701 |
| 2702 /* Total number of cons blocks now in use. */ | 2702 /* Total number of cons blocks now in use. */ |
| 2703 | 2703 |
| 2704 int n_cons_blocks; | 2704 static int n_cons_blocks; |
| 2705 | 2705 |
| 2706 | 2706 |
| 2707 /* Initialize cons allocation. */ | 2707 /* Initialize cons allocation. */ |
| 2708 | 2708 |
| 2709 void | 2709 static void |
| 2710 init_cons () | 2710 init_cons () |
| 2711 { | 2711 { |
| 2712 cons_block = NULL; | 2712 cons_block = NULL; |
| 2713 cons_block_index = CONS_BLOCK_SIZE; /* Force alloc of new cons_block. */ | 2713 cons_block_index = CONS_BLOCK_SIZE; /* Force alloc of new cons_block. */ |
| 2714 cons_free_list = 0; | 2714 cons_free_list = 0; |
| 2901 Vector Allocation | 2901 Vector Allocation |
| 2902 ***********************************************************************/ | 2902 ***********************************************************************/ |
| 2903 | 2903 |
| 2904 /* Singly-linked list of all vectors. */ | 2904 /* Singly-linked list of all vectors. */ |
| 2905 | 2905 |
| 2906 struct Lisp_Vector *all_vectors; | 2906 static struct Lisp_Vector *all_vectors; |
| 2907 | 2907 |
| 2908 /* Total number of vector-like objects now in use. */ | 2908 /* Total number of vector-like objects now in use. */ |
| 2909 | 2909 |
| 2910 int n_vectors; | 2910 static int n_vectors; |
| 2911 | 2911 |
| 2912 | 2912 |
| 2913 /* Value is a pointer to a newly allocated Lisp_Vector structure | 2913 /* Value is a pointer to a newly allocated Lisp_Vector structure |
| 2914 with room for LEN Lisp_Objects. */ | 2914 with room for LEN Lisp_Objects. */ |
| 2915 | 2915 |
| 3155 }; | 3155 }; |
| 3156 | 3156 |
| 3157 /* Current symbol block and index of first unused Lisp_Symbol | 3157 /* Current symbol block and index of first unused Lisp_Symbol |
| 3158 structure in it. */ | 3158 structure in it. */ |
| 3159 | 3159 |
| 3160 struct symbol_block *symbol_block; | 3160 static struct symbol_block *symbol_block; |
| 3161 int symbol_block_index; | 3161 static int symbol_block_index; |
| 3162 | 3162 |
| 3163 /* List of free symbols. */ | 3163 /* List of free symbols. */ |
| 3164 | 3164 |
| 3165 struct Lisp_Symbol *symbol_free_list; | 3165 static struct Lisp_Symbol *symbol_free_list; |
| 3166 | 3166 |
| 3167 /* Total number of symbol blocks now in use. */ | 3167 /* Total number of symbol blocks now in use. */ |
| 3168 | 3168 |
| 3169 int n_symbol_blocks; | 3169 static int n_symbol_blocks; |
| 3170 | 3170 |
| 3171 | 3171 |
| 3172 /* Initialize symbol allocation. */ | 3172 /* Initialize symbol allocation. */ |
| 3173 | 3173 |
| 3174 void | 3174 static void |
| 3175 init_symbol () | 3175 init_symbol () |
| 3176 { | 3176 { |
| 3177 symbol_block = NULL; | 3177 symbol_block = NULL; |
| 3178 symbol_block_index = SYMBOL_BLOCK_SIZE; | 3178 symbol_block_index = SYMBOL_BLOCK_SIZE; |
| 3179 symbol_free_list = 0; | 3179 symbol_free_list = 0; |
| 3251 /* Place `markers' first, to preserve alignment. */ | 3251 /* Place `markers' first, to preserve alignment. */ |
| 3252 union Lisp_Misc markers[MARKER_BLOCK_SIZE]; | 3252 union Lisp_Misc markers[MARKER_BLOCK_SIZE]; |
| 3253 struct marker_block *next; | 3253 struct marker_block *next; |
| 3254 }; | 3254 }; |
| 3255 | 3255 |
| 3256 struct marker_block *marker_block; | 3256 static struct marker_block *marker_block; |
| 3257 int marker_block_index; | 3257 static int marker_block_index; |
| 3258 | 3258 |
| 3259 union Lisp_Misc *marker_free_list; | 3259 static union Lisp_Misc *marker_free_list; |
| 3260 | 3260 |
| 3261 /* Total number of marker blocks now in use. */ | 3261 /* Total number of marker blocks now in use. */ |
| 3262 | 3262 |
| 3263 int n_marker_blocks; | 3263 static int n_marker_blocks; |
| 3264 | 3264 |
| 3265 void | 3265 static void |
| 3266 init_marker () | 3266 init_marker () |
| 3267 { | 3267 { |
| 3268 marker_block = NULL; | 3268 marker_block = NULL; |
| 3269 marker_block_index = MARKER_BLOCK_SIZE; | 3269 marker_block_index = MARKER_BLOCK_SIZE; |
| 3270 marker_free_list = 0; | 3270 marker_free_list = 0; |
| 4557 | 4557 |
| 4558 #endif /* GC_MARK_STACK != 0 */ | 4558 #endif /* GC_MARK_STACK != 0 */ |
| 4559 | 4559 |
| 4560 | 4560 |
| 4561 /* Determine whether it is safe to access memory at address P. */ | 4561 /* Determine whether it is safe to access memory at address P. */ |
| 4562 int | 4562 static int |
| 4563 valid_pointer_p (p) | 4563 valid_pointer_p (p) |
| 4564 void *p; | 4564 void *p; |
| 4565 { | 4565 { |
| 4566 #ifdef WINDOWSNT | 4566 #ifdef WINDOWSNT |
| 4567 return w32_valid_pointer_p (p, 16); | 4567 return w32_valid_pointer_p (p, 16); |
| 4853 } | 4853 } |
| 4854 | 4854 |
| 4855 | 4855 |
| 4856 /* Value is a float object with value NUM allocated from pure space. */ | 4856 /* Value is a float object with value NUM allocated from pure space. */ |
| 4857 | 4857 |
| 4858 Lisp_Object | 4858 static Lisp_Object |
| 4859 make_pure_float (num) | 4859 make_pure_float (num) |
| 4860 double num; | 4860 double num; |
| 4861 { | 4861 { |
| 4862 register Lisp_Object new; | 4862 register Lisp_Object new; |
| 4863 struct Lisp_Float *p; | 4863 struct Lisp_Float *p; |
| 5379 /* Mark reference to a Lisp_Object. | 5379 /* Mark reference to a Lisp_Object. |
| 5380 If the object referred to has not been seen yet, recursively mark | 5380 If the object referred to has not been seen yet, recursively mark |
| 5381 all the references contained in it. */ | 5381 all the references contained in it. */ |
| 5382 | 5382 |
| 5383 #define LAST_MARKED_SIZE 500 | 5383 #define LAST_MARKED_SIZE 500 |
| 5384 Lisp_Object last_marked[LAST_MARKED_SIZE]; | 5384 static Lisp_Object last_marked[LAST_MARKED_SIZE]; |
| 5385 int last_marked_index; | 5385 int last_marked_index; |
| 5386 | 5386 |
| 5387 /* For debugging--call abort when we cdr down this many | 5387 /* For debugging--call abort when we cdr down this many |
| 5388 links of a list, in mark_object. In debugging, | 5388 links of a list, in mark_object. In debugging, |
| 5389 the call to abort will hit a breakpoint. | 5389 the call to abort will hit a breakpoint. |
| 5390 Normally this is zero and the check never goes off. */ | 5390 Normally this is zero and the check never goes off. */ |
| 5391 int mark_object_loop_halt; | 5391 static int mark_object_loop_halt; |
| 5392 | 5392 |
| 5393 /* Return non-zero if the object was not yet marked. */ | 5393 /* Return non-zero if the object was not yet marked. */ |
| 5394 static int | 5394 static int |
| 5395 mark_vectorlike (ptr) | 5395 mark_vectorlike (ptr) |
| 5396 struct Lisp_Vector *ptr; | 5396 struct Lisp_Vector *ptr; |
| 5401 if (VECTOR_MARKED_P (ptr)) | 5401 if (VECTOR_MARKED_P (ptr)) |
| 5402 return 0; /* Already marked */ | 5402 return 0; /* Already marked */ |
| 5403 VECTOR_MARK (ptr); /* Else mark it */ | 5403 VECTOR_MARK (ptr); /* Else mark it */ |
| 5404 if (size & PSEUDOVECTOR_FLAG) | 5404 if (size & PSEUDOVECTOR_FLAG) |
| 5405 size &= PSEUDOVECTOR_SIZE_MASK; | 5405 size &= PSEUDOVECTOR_SIZE_MASK; |
| 5406 | 5406 |
| 5407 /* Note that this size is not the memory-footprint size, but only | 5407 /* Note that this size is not the memory-footprint size, but only |
| 5408 the number of Lisp_Object fields that we should trace. | 5408 the number of Lisp_Object fields that we should trace. |
| 5409 The distinction is used e.g. by Lisp_Process which places extra | 5409 The distinction is used e.g. by Lisp_Process which places extra |
| 5410 non-Lisp_Object fields at the end of the structure. */ | 5410 non-Lisp_Object fields at the end of the structure. */ |
| 5411 for (i = 0; i < size; i++) /* and then mark its elements */ | 5411 for (i = 0; i < size; i++) /* and then mark its elements */ |
| 6249 | 6249 |
| 6250 return Flist (8, consed); | 6250 return Flist (8, consed); |
| 6251 } | 6251 } |
| 6252 | 6252 |
| 6253 int suppress_checking; | 6253 int suppress_checking; |
| 6254 | |
| 6254 void | 6255 void |
| 6255 die (msg, file, line) | 6256 die (msg, file, line) |
| 6256 const char *msg; | 6257 const char *msg; |
| 6257 const char *file; | 6258 const char *file; |
| 6258 int line; | 6259 int line; |
