mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-11-25 07:28:20 +00:00
Ensure 8-byte aligned memory allocation on MS-Windows 9X
* src/w32heap.c (init_heap): Redirect malloc, realloc, and free to special functions on Windows 9X. Refuse to dump Emacs on Windows 9X. (malloc_after_dump_9x, realloc_after_dump_9x) (free_after_dump_9x): New functions. (Bug#22379) See also http://lists.gnu.org/archive/html/emacs-devel/2016-01/msg00852.html for more details about the original problem. * nt/inc/ms-w32.h (malloc_after_dump_9x, realloc_after_dump_9x) (free_after_dump_9x): Add prototypes. Copyright-paperwork-exempt: yes
This commit is contained in:
parent
39afa422ad
commit
15c23aaf83
@ -457,6 +457,10 @@ extern void *malloc_after_dump(size_t);
|
|||||||
extern void *realloc_after_dump(void *, size_t);
|
extern void *realloc_after_dump(void *, size_t);
|
||||||
extern void free_after_dump(void *);
|
extern void free_after_dump(void *);
|
||||||
|
|
||||||
|
extern void *malloc_after_dump_9x(size_t);
|
||||||
|
extern void *realloc_after_dump_9x(void *, size_t);
|
||||||
|
extern void free_after_dump_9x(void *);
|
||||||
|
|
||||||
extern malloc_fn the_malloc_fn;
|
extern malloc_fn the_malloc_fn;
|
||||||
extern realloc_fn the_realloc_fn;
|
extern realloc_fn the_realloc_fn;
|
||||||
extern free_fn the_free_fn;
|
extern free_fn the_free_fn;
|
||||||
|
@ -258,9 +258,18 @@ init_heap (void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
the_malloc_fn = malloc_after_dump;
|
if (os_subtype == OS_9X)
|
||||||
the_realloc_fn = realloc_after_dump;
|
{
|
||||||
the_free_fn = free_after_dump;
|
the_malloc_fn = malloc_after_dump_9x;
|
||||||
|
the_realloc_fn = realloc_after_dump_9x;
|
||||||
|
the_free_fn = free_after_dump_9x;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
the_malloc_fn = malloc_after_dump;
|
||||||
|
the_realloc_fn = realloc_after_dump;
|
||||||
|
the_free_fn = free_after_dump;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -291,9 +300,18 @@ init_heap (void)
|
|||||||
exit (-1);
|
exit (-1);
|
||||||
}
|
}
|
||||||
heap = s_pfn_Rtl_Create_Heap (0, data_region_base, 0, 0, NULL, ¶ms);
|
heap = s_pfn_Rtl_Create_Heap (0, data_region_base, 0, 0, NULL, ¶ms);
|
||||||
the_malloc_fn = malloc_before_dump;
|
|
||||||
the_realloc_fn = realloc_before_dump;
|
if (os_subtype == OS_9X)
|
||||||
the_free_fn = free_before_dump;
|
{
|
||||||
|
fprintf (stderr, "Cannot dump Emacs on Windows 9X; exiting.\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
the_malloc_fn = malloc_before_dump;
|
||||||
|
the_realloc_fn = realloc_before_dump;
|
||||||
|
the_free_fn = free_before_dump;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update system version information to match current system. */
|
/* Update system version information to match current system. */
|
||||||
@ -504,6 +522,65 @@ free_before_dump (void *ptr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* On Windows 9X, HeapAlloc may return pointers that are not aligned
|
||||||
|
on 8-byte boundary, alignment which is required by the Lisp memory
|
||||||
|
management. To circumvent this problem, manually enforce alignment
|
||||||
|
on Windows 9X. */
|
||||||
|
|
||||||
|
void *
|
||||||
|
malloc_after_dump_9x (size_t size)
|
||||||
|
{
|
||||||
|
void *p = malloc_after_dump (size + 8);
|
||||||
|
void *pa;
|
||||||
|
if (p == NULL)
|
||||||
|
return p;
|
||||||
|
pa = (void*)(((intptr_t)p + 8) & ~7);
|
||||||
|
*((void**)pa-1) = p;
|
||||||
|
return pa;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
realloc_after_dump_9x (void *ptr, size_t size)
|
||||||
|
{
|
||||||
|
if (FREEABLE_P (ptr))
|
||||||
|
{
|
||||||
|
void *po = *((void**)ptr-1);
|
||||||
|
void *p;
|
||||||
|
void *pa;
|
||||||
|
p = realloc_after_dump (po, size + 8);
|
||||||
|
if (p == NULL)
|
||||||
|
return p;
|
||||||
|
pa = (void*)(((intptr_t)p + 8) & ~7);
|
||||||
|
if (ptr != NULL &&
|
||||||
|
(char*)pa - (char*)p != (char*)ptr - (char*)po)
|
||||||
|
{
|
||||||
|
/* Handle the case where alignment in pre-realloc and
|
||||||
|
post-realloc blocks does not match. */
|
||||||
|
MoveMemory (pa, (void*)((char*)p + ((char*)ptr - (char*)po)), size);
|
||||||
|
}
|
||||||
|
*((void**)pa-1) = p;
|
||||||
|
return pa;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Non-freeable pointers have no alignment-enforcing header
|
||||||
|
(since dumping is not allowed on Windows 9X). */
|
||||||
|
void* p = malloc_after_dump_9x (size);
|
||||||
|
if (p != NULL)
|
||||||
|
CopyMemory (p, ptr, size);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
free_after_dump_9x (void *ptr)
|
||||||
|
{
|
||||||
|
if (FREEABLE_P (ptr))
|
||||||
|
{
|
||||||
|
free_after_dump (*((void**)ptr-1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_CHECKING
|
#ifdef ENABLE_CHECKING
|
||||||
void
|
void
|
||||||
report_temacs_memory_usage (void)
|
report_temacs_memory_usage (void)
|
||||||
|
Loading…
Reference in New Issue
Block a user