added fault tolerant malloc/realloc wrapper

This commit is contained in:
overflowerror 2018-02-08 22:16:26 +01:00
parent e441b19838
commit 20dab3655b
3 changed files with 34 additions and 3 deletions

View file

@ -28,7 +28,6 @@ The compiled files are in `./bin/`.
## TODO
- fail-tollerant wrappers for malloc/realloc
- automated getopt-wrapper (ev with help message generator)
- simplified socket-management
- simplified process-management (fork/exec, shm, semaphores, pthread, ...)

View file

@ -42,6 +42,9 @@ static void deleteTimer(timer_t);
static void eventHandler(event_t);
static void* allocate(size_t);
static void* reallocate(void*, size_t);
struct boot boot = {
.addEventListener = addEventListener,
.removeEventListener = removeEventListener,
@ -61,6 +64,9 @@ struct boot boot = {
.stopTimer = stopTimer,
.deleteTimer = deleteTimer,
.allocate = allocate,
.reallocate = reallocate,
.mode = STANDARD,
.debug = false
};
@ -103,7 +109,9 @@ bool addEventListener(event_t event, eventListener_t listener) {
events[event].override = false;
events[event].number = 0;
}
events[event].listeners = realloc(events[event].listeners, (events[event].number + 1) * sizeof(eventListener_t)); // TODO replace with own function
events[event].listeners = reallocate(events[event].listeners, (events[event].number + 1) * sizeof(eventListener_t));
if (events[event].listeners == NULL)
return false;
events[event].listeners[events[event].number] = listener;
debug("New event listener for event %d (%s) on position %d.\n", event, getEventName(event), events[event].number);
events[event].number++;
@ -306,11 +314,32 @@ static void errorHandler(event_t event) {
exit(EXIT_ERROR);
}
void* allocate(size_t size) {
void* result = malloc(size);
if (result == NULL) {
boot.error = strerror(errno);
eventHandler(LIBERROR);
}
return result;
}
void* reallocate(void* pointer, size_t size) {
void* result = realloc(pointer, size);
if (result == NULL) {
boot.error = strerror(errno);
eventHandler(LIBERROR);
result = pointer;
}
return result;
}
int main(char** argv, int argc) {
for(int i = 0; i < NUMBER_OF_EVENTS; i++) {
debug("Setup %s %d (%s)...\n", IS_SIGNAL(i) ? "signal" : "event", i, getEventName(i));
events[i].number = 0;
events[i].listeners = malloc(1 * sizeof(eventListener_t)); // TODO replace by own function
events[i].listeners = allocate(1 * sizeof(eventListener_t));
if (events[i].listeners == NULL)
exit(EXIT_ERROR); // just to make sure
events[i].listeners[0] = NULL;
events[i].override = false;
events[i].isSignalHandler = false;

View file

@ -86,6 +86,9 @@ extern struct boot {
void (*stopTimer)(timer_t);
void (*deleteTimer)(timer_t);
void* (*allocate)(size_t);
void* (*reallocate)(void*, size_t);
bootmode_t mode;
bool debug;