#include "db_config.h"
#ifndef lint
static const char revid[] = "$Id: os_alloc.c,v 1.2 2004/03/30 01:23:45 jtownsen Exp $";
#endif
#ifndef NO_SYSTEM_INCLUDES
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#endif
#include "db_int.h"
#ifdef DIAGNOSTIC
static void __os_guard __P((DB_ENV *));
union __db_alloc {
size_t size;
double align;
};
#endif
int
__os_umalloc(dbenv, size, storep)
DB_ENV *dbenv;
size_t size;
void *storep;
{
int ret;
if (size == 0)
++size;
if (dbenv == NULL || dbenv->db_malloc == NULL) {
if (DB_GLOBAL(j_malloc) != NULL)
*(void **)storep = DB_GLOBAL(j_malloc)(size);
else
*(void **)storep = malloc(size);
if (*(void **)storep == NULL) {
if ((ret = __os_get_errno()) == 0) {
ret = ENOMEM;
__os_set_errno(ENOMEM);
}
__db_err(dbenv,
"malloc: %s: %lu", strerror(ret), (u_long)size);
return (ret);
}
return (0);
}
if ((*(void **)storep = dbenv->db_malloc(size)) == NULL) {
__db_err(dbenv, "User-specified malloc function returned NULL");
return (ENOMEM);
}
return (0);
}
int
__os_urealloc(dbenv, size, storep)
DB_ENV *dbenv;
size_t size;
void *storep;
{
int ret;
void *ptr;
ptr = *(void **)storep;
if (size == 0)
++size;
if (dbenv == NULL || dbenv->db_realloc == NULL) {
if (ptr == NULL)
return (__os_umalloc(dbenv, size, storep));
if (DB_GLOBAL(j_realloc) != NULL)
*(void **)storep = DB_GLOBAL(j_realloc)(ptr, size);
else
*(void **)storep = realloc(ptr, size);
if (*(void **)storep == NULL) {
if ((ret = __os_get_errno()) == 0) {
ret = ENOMEM;
__os_set_errno(ENOMEM);
}
__db_err(dbenv,
"realloc: %s: %lu", strerror(ret), (u_long)size);
return (ret);
}
return (0);
}
if ((*(void **)storep = dbenv->db_realloc(ptr, size)) == NULL) {
__db_err(dbenv,
"User-specified realloc function returned NULL");
return (ENOMEM);
}
return (0);
}
void
__os_ufree(dbenv, ptr)
DB_ENV *dbenv;
void *ptr;
{
if (dbenv != NULL && dbenv->db_free != NULL)
dbenv->db_free(ptr);
else if (DB_GLOBAL(j_free) != NULL)
DB_GLOBAL(j_free)(ptr);
else
free(ptr);
}
int
__os_strdup(dbenv, str, storep)
DB_ENV *dbenv;
const char *str;
void *storep;
{
size_t size;
int ret;
void *p;
*(void **)storep = NULL;
size = strlen(str) + 1;
if ((ret = __os_malloc(dbenv, size, &p)) != 0)
return (ret);
memcpy(p, str, size);
*(void **)storep = p;
return (0);
}
int
__os_calloc(dbenv, num, size, storep)
DB_ENV *dbenv;
size_t num, size;
void *storep;
{
void *p;
int ret;
size *= num;
if ((ret = __os_malloc(dbenv, size, &p)) != 0)
return (ret);
memset(p, 0, size);
*(void **)storep = p;
return (0);
}
int
__os_malloc(dbenv, size, storep)
DB_ENV *dbenv;
size_t size;
void *storep;
{
int ret;
void *p;
*(void **)storep = NULL;
if (size == 0)
++size;
#ifdef DIAGNOSTIC
size += sizeof(union __db_alloc) + 1;
#endif
if (DB_GLOBAL(j_malloc) != NULL)
p = DB_GLOBAL(j_malloc)(size);
else
p = malloc(size);
if (p == NULL) {
if ((ret = __os_get_errno()) == 0) {
ret = ENOMEM;
__os_set_errno(ENOMEM);
}
__db_err(dbenv,
"malloc: %s: %lu", strerror(ret), (u_long)size);
return (ret);
}
#ifdef DIAGNOSTIC
memset(p, CLEAR_BYTE, size);
((u_int8_t *)p)[size - 1] = CLEAR_BYTE;
((union __db_alloc *)p)->size = size;
p = &((union __db_alloc *)p)[1];
#endif
*(void **)storep = p;
return (0);
}
int
__os_realloc(dbenv, size, storep)
DB_ENV *dbenv;
size_t size;
void *storep;
{
int ret;
void *p, *ptr;
ptr = *(void **)storep;
if (size == 0)
++size;
if (ptr == NULL)
return (__os_malloc(dbenv, size, storep));
#ifdef DIAGNOSTIC
size += sizeof(union __db_alloc) + 1;
ptr = &((union __db_alloc *)ptr)[-1];
#endif
if (DB_GLOBAL(j_realloc) != NULL)
p = DB_GLOBAL(j_realloc)(ptr, size);
else
p = realloc(ptr, size);
if (p == NULL) {
if ((ret = __os_get_errno()) == 0) {
ret = ENOMEM;
__os_set_errno(ENOMEM);
}
__db_err(dbenv,
"realloc: %s: %lu", strerror(ret), (u_long)size);
return (ret);
}
#ifdef DIAGNOSTIC
((u_int8_t *)p)[size - 1] = CLEAR_BYTE;
((union __db_alloc *)p)->size = size;
p = &((union __db_alloc *)p)[1];
#endif
*(void **)storep = p;
return (0);
}
void
__os_free(dbenv, ptr)
DB_ENV *dbenv;
void *ptr;
{
#ifdef DIAGNOSTIC
int size;
if (ptr == NULL)
return;
ptr = &((union __db_alloc *)ptr)[-1];
size = ((union __db_alloc *)ptr)->size;
if (((u_int8_t *)ptr)[size - 1] != CLEAR_BYTE)
__os_guard(dbenv);
if (size != 0)
memset(ptr, CLEAR_BYTE, size);
#endif
COMPQUIET(dbenv, NULL);
if (DB_GLOBAL(j_free) != NULL)
DB_GLOBAL(j_free)(ptr);
else
free(ptr);
}
#ifdef DIAGNOSTIC
static void
__os_guard(dbenv)
DB_ENV *dbenv;
{
__db_err(dbenv, "Guard byte incorrect during free");
abort();
}
#endif
void *
__ua_memcpy(dst, src, len)
void *dst;
const void *src;
size_t len;
{
return ((void *)memcpy(dst, src, len));
}