blob: 25f99a7072548dc9f43fdfb3a65e311e3f602818 [file] [log] [blame]
#include "mpdecimal.h"
#include <stdlib.h>
#include <windows.h>
#include "malloc_fail.h"
/* Test allocation failures */
int alloc_count;
int alloc_fail;
int alloc_idx;
static void * default_mpd_malloc (size_t size){
return HeapAlloc(GetProcessHeap(),0,size);
}
static void * default_mpd_realloc (void *ptr, size_t size){
if(size == 0) {
HeapFree(GetProcessHeap(),0,ptr);
return NULL;
}
return HeapReAlloc(GetProcessHeap(),0,ptr,size);
}
static void * default_mpd_calloc (size_t nmemb, size_t size){
return HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,nmemb * size);
}
static void default_mpd_free (void *ptr){
HeapFree(GetProcessHeap(),0,ptr);
}
void *
mpd_malloc_count(size_t size)
{
++alloc_count;
return default_mpd_malloc(size);
}
void *
mpd_calloc_count(size_t nmemb, size_t size)
{
++alloc_count;
return default_mpd_calloc(nmemb, size);
}
void *
mpd_realloc_count(void *ptr, size_t size)
{
++alloc_count;
return default_mpd_realloc(ptr, size);
}
void *
mpd_malloc_fail(size_t size)
{
if (++alloc_idx >= alloc_fail) {
return NULL;
}
return default_mpd_malloc(size);
}
void *
mpd_calloc_fail(size_t nmemb, size_t size)
{
if (++alloc_idx >= alloc_fail) {
return NULL;
}
return default_mpd_calloc(nmemb, size);
}
void *
mpd_realloc_fail(void *ptr, size_t size)
{
if (++alloc_idx >= alloc_fail) {
return NULL;
}
return default_mpd_realloc(ptr, size);
}
void
mpd_set_alloc_count(mpd_context_t *ctx)
{
__mingw_dfp_get_globals()->mpd_mallocfunc = mpd_malloc_count;
__mingw_dfp_get_globals()->mpd_callocfunc = mpd_calloc_count;
__mingw_dfp_get_globals()->mpd_reallocfunc = mpd_realloc_count;
__mingw_dfp_get_globals()->mpd_free = default_mpd_free;
ctx->traps = MPD_Malloc_error;
alloc_count = 0;
}
void
mpd_set_alloc_fail(mpd_context_t *ctx)
{
__mingw_dfp_get_globals()->mpd_mallocfunc = mpd_malloc_fail;
__mingw_dfp_get_globals()->mpd_callocfunc = mpd_calloc_fail;
__mingw_dfp_get_globals()->mpd_reallocfunc = mpd_realloc_fail;
__mingw_dfp_get_globals()->mpd_free = default_mpd_free;
ctx->traps = 0;
alloc_idx = 0;
}
void
mpd_set_alloc(mpd_context_t *ctx)
{
__mingw_dfp_get_globals()->mpd_mallocfunc = default_mpd_malloc;
__mingw_dfp_get_globals()->mpd_callocfunc = default_mpd_calloc;
__mingw_dfp_get_globals()->mpd_reallocfunc = default_mpd_realloc;
__mingw_dfp_get_globals()->mpd_free = default_mpd_free;
ctx->traps = MPD_Malloc_error;
}