1998-05-03 16:43:39 +00:00
|
|
|
/*
|
|
|
|
* BIRD Library -- malloc() With Checking
|
|
|
|
*
|
2000-06-04 18:34:39 +00:00
|
|
|
* (c) 1998--2000 Martin Mares <mj@ucw.cz>
|
1998-05-03 16:43:39 +00:00
|
|
|
*
|
|
|
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
#include "nest/bird.h"
|
|
|
|
#include "lib/resource.h"
|
2024-05-31 13:16:41 +00:00
|
|
|
#include "lib/timer.h"
|
1998-05-03 16:43:39 +00:00
|
|
|
|
1999-03-04 11:36:26 +00:00
|
|
|
#ifndef HAVE_LIBDMALLOC
|
|
|
|
|
2024-10-01 13:30:00 +00:00
|
|
|
#if DEBUG_ALLOCATOR
|
2024-05-31 13:16:41 +00:00
|
|
|
struct minfo {
|
|
|
|
void *ptr;
|
|
|
|
uint size;
|
|
|
|
uint action;
|
|
|
|
uint thread_id;
|
|
|
|
btime time;
|
|
|
|
} minfo_block[65536];
|
|
|
|
_Atomic uint minfo_pos;
|
|
|
|
|
|
|
|
#define MINFO(p, s, a) minfo_block[atomic_fetch_add_explicit(&minfo_pos, 1, memory_order_acq_rel) % 65536] = (struct minfo) { .ptr = p, .size = s, .action = a, .thread_id = THIS_THREAD_ID, .time = current_time_now(), }
|
|
|
|
#else
|
|
|
|
#define MINFO(...)
|
|
|
|
#endif
|
|
|
|
|
2000-06-04 18:34:39 +00:00
|
|
|
/**
|
|
|
|
* xmalloc - malloc with checking
|
|
|
|
* @size: block size
|
|
|
|
*
|
|
|
|
* This function is equivalent to malloc() except that in case of
|
|
|
|
* failure it calls die() to quit the program instead of returning
|
|
|
|
* a %NULL pointer.
|
|
|
|
*
|
2000-06-07 12:29:08 +00:00
|
|
|
* Wherever possible, please use the memory resources instead.
|
2000-06-04 18:34:39 +00:00
|
|
|
*/
|
1998-05-03 16:43:39 +00:00
|
|
|
void *
|
2015-05-19 06:53:34 +00:00
|
|
|
xmalloc(uint size)
|
1998-05-03 16:43:39 +00:00
|
|
|
{
|
2024-05-31 13:16:41 +00:00
|
|
|
|
1998-05-03 16:43:39 +00:00
|
|
|
void *p = malloc(size);
|
2024-05-31 13:16:41 +00:00
|
|
|
MINFO(p, size, 1);
|
|
|
|
|
1998-05-03 16:43:39 +00:00
|
|
|
if (p)
|
|
|
|
return p;
|
|
|
|
die("Unable to allocate %d bytes of memory", size);
|
|
|
|
}
|
1999-03-04 11:36:26 +00:00
|
|
|
|
2009-06-10 21:45:08 +00:00
|
|
|
/**
|
|
|
|
* xrealloc - realloc with checking
|
|
|
|
* @ptr: original memory block
|
|
|
|
* @size: block size
|
|
|
|
*
|
|
|
|
* This function is equivalent to realloc() except that in case of
|
|
|
|
* failure it calls die() to quit the program instead of returning
|
|
|
|
* a %NULL pointer.
|
|
|
|
*
|
|
|
|
* Wherever possible, please use the memory resources instead.
|
|
|
|
*/
|
|
|
|
void *
|
2015-05-19 06:53:34 +00:00
|
|
|
xrealloc(void *ptr, uint size)
|
2009-06-10 21:45:08 +00:00
|
|
|
{
|
2024-05-31 13:16:41 +00:00
|
|
|
MINFO(ptr, 0, 2);
|
2024-06-26 15:21:26 +00:00
|
|
|
void *p = realloc(ptr, size);
|
2024-05-31 13:16:41 +00:00
|
|
|
MINFO(p, size, 3);
|
|
|
|
|
2009-06-10 21:45:08 +00:00
|
|
|
if (p)
|
|
|
|
return p;
|
|
|
|
die("Unable to allocate %d bytes of memory", size);
|
|
|
|
}
|
|
|
|
|
2024-05-31 13:16:41 +00:00
|
|
|
|
|
|
|
void xfree(void *p)
|
|
|
|
{
|
|
|
|
MINFO(p, 0, 4);
|
|
|
|
free(p);
|
|
|
|
}
|
1999-03-04 11:36:26 +00:00
|
|
|
#endif
|