eric@snark.uu.net (08/19/89)
Here is a fix for the allocator bug I encountered. It separates the function of initializing the allocator from the function of setting the allocator warning hook (this is a good idea just on cleanliness grounds). The new malloc_set_warning() entry point is used to disable warnings during the very first malloc, preventing the lose. I'm still getting a bus error, but at least now it's an honest one due to the initial malloc() returning zero. Now I have to figure out why the *%$#!@ malloc code thinks it's run out of memory at *startup* time. Stay tuned... *** malloc.c-orig Sat Aug 19 10:38:56 1989 --- malloc.c Sat Aug 19 11:22:27 1989 *************** *** 286,300 **** /* Cause reinitialization based on job parameters; also declare where the end of pure storage is. */ void ! malloc_init (start, warnfun) char *start; - void (*warnfun) (); { if (start) data_space_start = start; lim_data = 0; warnlevel = 0; ! warnfunction = warnfun; } /* Return the maximum size to which MEM can be realloc'd --- 286,310 ---- /* Cause reinitialization based on job parameters; also declare where the end of pure storage is. */ void ! malloc_init (start) char *start; { if (start) data_space_start = start; lim_data = 0; + } + + typedef void whook_t(); + + whook_t + *malloc_set_warning(warnhook) + void (*warnhook)(); + { + void (*oldwarn)() = warnfunction; + warnlevel = 0; ! warnfunction = warnhook; ! return(oldwarn); } /* Return the maximum size to which MEM can be realloc'd *** alloc.c-orig Sat Aug 19 10:31:52 1989 --- alloc.c Sat Aug 19 11:09:28 1989 *************** *** 455,461 **** --- 455,465 ---- void init_strings () { + extern void (*malloc_set_warning())(); + void (*oldwarn)() = malloc_set_warning((void(*)())0); + current_string_block = (struct string_block *) malloc (sizeof (struct string_block)); + (void) malloc_set_warning(oldwarn); first_string_block = current_string_block; consing_since_gc += sizeof (struct string_block); current_string_block->next = 0; *** emacs.c-orig Sat Aug 19 10:42:03 1989 --- emacs.c Sat Aug 19 11:07:07 1989 *************** *** 173,178 **** --- 173,179 ---- int skip_args = 0; extern int errno; extern void malloc_warning (); + extern void (*malloc_set_warning())(); #ifdef VMS #ifdef LINK_CRTL_SHARE *************** *** 216,222 **** #ifndef SYSTEM_MALLOC /* Arrange for warnings when nearly out of space. */ ! malloc_init (0, malloc_warning); #endif #ifdef HIGHPRI --- 217,224 ---- #ifndef SYSTEM_MALLOC /* Arrange for warnings when nearly out of space. */ ! malloc_init (0); ! (void) malloc_set_warning(malloc_warning); #endif #ifdef HIGHPRI *************** *** 565,571 **** /* Tell malloc where start of impure now is */ /* Also arrange for warnings when nearly out of space. */ #ifndef SYSTEM_MALLOC ! malloc_init (&my_edata, malloc_warning); #endif unexec (XSTRING (intoname)->data, a_name, &my_edata, 0, 0); #endif /* not VMS */ --- 567,574 ---- /* Tell malloc where start of impure now is */ /* Also arrange for warnings when nearly out of space. */ #ifndef SYSTEM_MALLOC ! malloc_init (&my_edata); ! (void) malloc_set_warning(malloc_warning); #endif unexec (XSTRING (intoname)->data, a_name, &my_edata, 0, 0); #endif /* not VMS */ eric@snark.uu.net = eric%snark@uunet.uu.net --> Eric S. Raymond