summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/malloc_wrapper.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/malloc_wrapper.cc')
-rw-r--r--winsup/cygwin/malloc_wrapper.cc32
1 files changed, 30 insertions, 2 deletions
diff --git a/winsup/cygwin/malloc_wrapper.cc b/winsup/cygwin/malloc_wrapper.cc
index 90689ffee..086c43d36 100644
--- a/winsup/cygwin/malloc_wrapper.cc
+++ b/winsup/cygwin/malloc_wrapper.cc
@@ -1,7 +1,7 @@
/* malloc_wrapper.cc
- Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
- Red Hat, Inc.
+ Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ 2006, 2007 Red Hat, Inc.
Originally written by Steve Chamberlain of Cygnus Support
sac@cygnus.com
@@ -70,6 +70,8 @@ malloc (size_t size)
__malloc_unlock ();
}
malloc_printf ("(%d) = %x, called by %p", size, res, __builtin_return_address (0));
+ if (!res)
+ set_errno (ENOMEM);
return res;
}
@@ -86,6 +88,8 @@ realloc (void *p, size_t size)
__malloc_unlock ();
}
malloc_printf ("(%x, %d) = %x, called by %x", p, size, res, __builtin_return_address (0));
+ if (!res)
+ set_errno (ENOMEM);
return res;
}
@@ -102,9 +106,29 @@ calloc (size_t nmemb, size_t size)
__malloc_unlock ();
}
malloc_printf ("(%d, %d) = %x, called by %x", nmemb, size, res, __builtin_return_address (0));
+ if (!res)
+ set_errno (ENOMEM);
return res;
}
+extern "C" int
+posix_memalign (void **memptr, size_t alignment, size_t bytes)
+{
+ void *res;
+ if (!use_internal_malloc)
+ return ENOSYS;
+ if ((alignment & (alignment - 1)) != 0)
+ return EINVAL;
+ __malloc_lock ();
+ res = dlmemalign (alignment, bytes);
+ __malloc_unlock ();
+ if (!res)
+ return ENOMEM;
+ if (memptr)
+ *memptr = res;
+ return 0;
+}
+
extern "C" void *
memalign (size_t alignment, size_t bytes)
{
@@ -119,6 +143,8 @@ memalign (size_t alignment, size_t bytes)
__malloc_lock ();
res = dlmemalign (alignment, bytes);
__malloc_unlock ();
+ if (!res)
+ set_errno (ENOMEM);
}
return res;
@@ -138,6 +164,8 @@ valloc (size_t bytes)
__malloc_lock ();
res = dlvalloc (bytes);
__malloc_unlock ();
+ if (!res)
+ set_errno (ENOMEM);
}
return res;