1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
|
/*
* Copyright (C) 1999-2002 Stijn van Dongen.
*/
#include "alloc.h"
#include "compile.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
void* mcxRealloc
( void* object
, int new_size
, mcxOnFail ON_FAIL
)
{ void* mblock = NULL
; int status = 0
;
if (new_size < 0)
{ fprintf
( stderr
, "[mcxRealloc PBD] negative amount [%d] requested\n"
, new_size
)
; status = 1
; }
else
{ mblock
= (object && new_size)
? realloc(object, new_size)
: new_size
? malloc(new_size)
: NULL
; }
if (new_size && (!mblock))
mcxMemDenied(stderr, "mcxRealloc", "byte", new_size)
, status = 1
;
if (status)
{ if (ON_FAIL == SLEEP_ON_FAIL)
{ fprintf(stderr, "[mcxRealloc] entering sleep mode\n")
; while(1) sleep(1000)
; }
; if (ON_FAIL == EXIT_ON_FAIL)
{ fprintf(stderr, "[mcxRealloc] entering sleep mode\n")
; while(1) sleep(1000)
; }
; }
return mblock
; }
void* mcxNAlloc
( int n_elem
, int elem_size
, void* (*obInit) (void *)
, mcxOnFail ON_FAIL
)
{ char* ob
; void* mblock = mcxRealloc(NULL, n_elem * elem_size, ON_FAIL)
;
if (!mblock)
return NULL
;
if (obInit)
{ ob = mblock
; while (--n_elem >= 0)
{ obInit(ob)
; ob += elem_size
; }
; }
return (mblock)
; }
void mcxMemDenied
( FILE* channel
, const char* requestee
, const char* unittype
, int n
)
{ fprintf
( channel
, "[%s: Memory shortage] could not alloc [%d] instances of [%s]\n"
, requestee
, n
, unittype
)
; }
void mcxFree
( void* object
)
{ if (object) free(object)
; }
my_inline void* mcxAlloc
( int size
, mcxOnFail ON_FAIL
)
{ return mcxRealloc(NULL, size, ON_FAIL)
; }
|