mirror of
https://github.com/sigmasternchen/seaboot
synced 2025-03-15 04:08:54 +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
|
||||
|
||||
- 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, ...)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue