mirror of
https://github.com/sigmasternchen/seaboot
synced 2025-03-15 20:28:55 +00:00
added fault tolerant malloc/realloc wrapper
This commit is contained in:
parent
e441b19838
commit
20dab3655b
3 changed files with 34 additions and 3 deletions
|
@ -28,7 +28,6 @@ The compiled files are in `./bin/`.
|
||||||
|
|
||||||
## TODO
|
## TODO
|
||||||
|
|
||||||
- fail-tollerant wrappers for malloc/realloc
|
|
||||||
- automated getopt-wrapper (ev with help message generator)
|
- automated getopt-wrapper (ev with help message generator)
|
||||||
- simplified socket-management
|
- simplified socket-management
|
||||||
- simplified process-management (fork/exec, shm, semaphores, pthread, ...)
|
- simplified process-management (fork/exec, shm, semaphores, pthread, ...)
|
||||||
|
|
|
@ -42,6 +42,9 @@ static void deleteTimer(timer_t);
|
||||||
|
|
||||||
static void eventHandler(event_t);
|
static void eventHandler(event_t);
|
||||||
|
|
||||||
|
static void* allocate(size_t);
|
||||||
|
static void* reallocate(void*, size_t);
|
||||||
|
|
||||||
struct boot boot = {
|
struct boot boot = {
|
||||||
.addEventListener = addEventListener,
|
.addEventListener = addEventListener,
|
||||||
.removeEventListener = removeEventListener,
|
.removeEventListener = removeEventListener,
|
||||||
|
@ -61,6 +64,9 @@ struct boot boot = {
|
||||||
.stopTimer = stopTimer,
|
.stopTimer = stopTimer,
|
||||||
.deleteTimer = deleteTimer,
|
.deleteTimer = deleteTimer,
|
||||||
|
|
||||||
|
.allocate = allocate,
|
||||||
|
.reallocate = reallocate,
|
||||||
|
|
||||||
.mode = STANDARD,
|
.mode = STANDARD,
|
||||||
.debug = false
|
.debug = false
|
||||||
};
|
};
|
||||||
|
@ -103,7 +109,9 @@ bool addEventListener(event_t event, eventListener_t listener) {
|
||||||
events[event].override = false;
|
events[event].override = false;
|
||||||
events[event].number = 0;
|
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;
|
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);
|
debug("New event listener for event %d (%s) on position %d.\n", event, getEventName(event), events[event].number);
|
||||||
events[event].number++;
|
events[event].number++;
|
||||||
|
@ -306,11 +314,32 @@ static void errorHandler(event_t event) {
|
||||||
exit(EXIT_ERROR);
|
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) {
|
int main(char** argv, int argc) {
|
||||||
for(int i = 0; i < NUMBER_OF_EVENTS; i++) {
|
for(int i = 0; i < NUMBER_OF_EVENTS; i++) {
|
||||||
debug("Setup %s %d (%s)...\n", IS_SIGNAL(i) ? "signal" : "event", i, getEventName(i));
|
debug("Setup %s %d (%s)...\n", IS_SIGNAL(i) ? "signal" : "event", i, getEventName(i));
|
||||||
events[i].number = 0;
|
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].listeners[0] = NULL;
|
||||||
events[i].override = false;
|
events[i].override = false;
|
||||||
events[i].isSignalHandler = false;
|
events[i].isSignalHandler = false;
|
||||||
|
|
|
@ -86,6 +86,9 @@ extern struct boot {
|
||||||
void (*stopTimer)(timer_t);
|
void (*stopTimer)(timer_t);
|
||||||
void (*deleteTimer)(timer_t);
|
void (*deleteTimer)(timer_t);
|
||||||
|
|
||||||
|
void* (*allocate)(size_t);
|
||||||
|
void* (*reallocate)(void*, size_t);
|
||||||
|
|
||||||
bootmode_t mode;
|
bootmode_t mode;
|
||||||
bool debug;
|
bool debug;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue