summaryrefslogtreecommitdiff
path: root/src/w32heap.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2021-10-04 12:11:39 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2021-10-04 15:21:43 -0700
commit1a65d49931ebc37adc48cd2406220b586e62f778 (patch)
tree3f5d496d1a5241b91c7ad61cbe8a32e942da18b1 /src/w32heap.c
parent68a256c89270ef9e97bca6097967a9ed2b050f4a (diff)
downloademacs-1a65d49931ebc37adc48cd2406220b586e62f778.tar.gz
Port recent Gnulib changes to MS-Windows
* nt/gnulib-cfg.mk (OMIT_GNULIB_MODULE_free-posix) (OMIT_GNULIB_MODULE_malloc-posix) (OMIT_GNULIB_MODULE_realloc-gnu) (OMIT_GNULIB_MODULE_realloc-posix): New macros, since we don’t want these modules on MS-Windows. * src/w32heap.c (heap_alloc, heap_realloc): New functions. (malloc_after_dump, realloc_after_dump, realloc_before_dump): Use them.
Diffstat (limited to 'src/w32heap.c')
-rw-r--r--src/w32heap.c42
1 files changed, 26 insertions, 16 deletions
diff --git a/src/w32heap.c b/src/w32heap.c
index 0f228bfb221..a0d4c070be3 100644
--- a/src/w32heap.c
+++ b/src/w32heap.c
@@ -189,6 +189,26 @@ malloc_fn the_malloc_fn;
realloc_fn the_realloc_fn;
free_fn the_free_fn;
+static void *
+heap_alloc (size_t size)
+{
+ void *p = size <= PTRDIFF_MAX ? HeapAlloc (heap, 0, size | !size) : NULL;
+ if (!p)
+ errno = ENOMEM;
+ return p;
+}
+
+static void *
+heap_realloc (void *ptr, size_t size)
+{
+ void *p = (size <= PTRDIFF_MAX
+ ? HeapReAlloc (heap, 0, ptr, size | !size)
+ : NULL);
+ if (!p)
+ errno = ENOMEM;
+ return p;
+}
+
/* It doesn't seem to be useful to allocate from a file mapping.
It would be if the memory was shared.
https://stackoverflow.com/questions/307060/what-is-the-purpose-of-allocating-pages-in-the-pagefile-with-createfilemapping */
@@ -346,7 +366,7 @@ void *
malloc_after_dump (size_t size)
{
/* Use the new private heap. */
- void *p = HeapAlloc (heap, 0, size);
+ void *p = heap_alloc (size);
/* After dump, keep track of the "brk value" for sbrk(0). */
if (p)
@@ -356,8 +376,6 @@ malloc_after_dump (size_t size)
if (new_brk > data_region_end)
data_region_end = new_brk;
}
- else
- errno = ENOMEM;
return p;
}
@@ -373,9 +391,7 @@ malloc_before_dump (size_t size)
if (size < MaxBlockSize)
{
/* Use the private heap if possible. */
- p = HeapAlloc (heap, 0, size);
- if (!p)
- errno = ENOMEM;
+ p = heap_alloc (size);
}
else
{
@@ -433,18 +449,14 @@ realloc_after_dump (void *ptr, size_t size)
if (FREEABLE_P (ptr))
{
/* Reallocate the block since it lies in the new heap. */
- p = HeapReAlloc (heap, 0, ptr, size);
- if (!p)
- errno = ENOMEM;
+ p = heap_realloc (ptr, size);
}
else
{
/* If the block lies in the dumped data, do not free it. Only
allocate a new one. */
- p = HeapAlloc (heap, 0, size);
- if (!p)
- errno = ENOMEM;
- else if (ptr)
+ p = heap_alloc (size);
+ if (p && ptr)
CopyMemory (p, ptr, size);
}
/* After dump, keep track of the "brk value" for sbrk(0). */
@@ -467,9 +479,7 @@ realloc_before_dump (void *ptr, size_t size)
if (dumped_data < (unsigned char *)ptr
&& (unsigned char *)ptr < bc_limit && size <= MaxBlockSize)
{
- p = HeapReAlloc (heap, 0, ptr, size);
- if (!p)
- errno = ENOMEM;
+ p = heap_realloc (ptr, size);
}
else
{