Merge branch 'np/malloc-threading'

* np/malloc-threading:
  Thread-safe xmalloc and xrealloc needs a recursive mutex
  Make xmalloc and xrealloc thread-safe
This commit is contained in:
Junio C Hamano
2010-05-21 04:02:16 -07:00
7 changed files with 54 additions and 8 deletions

View File

@ -3,11 +3,23 @@
*/
#include "cache.h"
static void try_to_free_builtin(size_t size)
{
release_pack_memory(size, -1);
}
static void (*try_to_free_routine)(size_t size) = try_to_free_builtin;
void set_try_to_free_routine(void (*routine)(size_t))
{
try_to_free_routine = (routine) ? routine : try_to_free_builtin;
}
char *xstrdup(const char *str)
{
char *ret = strdup(str);
if (!ret) {
release_pack_memory(strlen(str) + 1, -1);
try_to_free_routine(strlen(str) + 1);
ret = strdup(str);
if (!ret)
die("Out of memory, strdup failed");
@ -21,7 +33,7 @@ void *xmalloc(size_t size)
if (!ret && !size)
ret = malloc(1);
if (!ret) {
release_pack_memory(size, -1);
try_to_free_routine(size);
ret = malloc(size);
if (!ret && !size)
ret = malloc(1);
@ -67,7 +79,7 @@ void *xrealloc(void *ptr, size_t size)
if (!ret && !size)
ret = realloc(ptr, 1);
if (!ret) {
release_pack_memory(size, -1);
try_to_free_routine(size);
ret = realloc(ptr, size);
if (!ret && !size)
ret = realloc(ptr, 1);
@ -83,7 +95,7 @@ void *xcalloc(size_t nmemb, size_t size)
if (!ret && (!nmemb || !size))
ret = calloc(1, 1);
if (!ret) {
release_pack_memory(nmemb * size, -1);
try_to_free_routine(nmemb * size);
ret = calloc(nmemb, size);
if (!ret && (!nmemb || !size))
ret = calloc(1, 1);