#include #include #include #include #include #include #include #include void _clone_tramp (void); struct process_data* process_spawn (process_func_t func, void* argument_ptr) { void* stack = malloc (STACK_SIZE); if (stack == NULL) return NULL; struct process_data* pdata = malloc (sizeof (*pdata)); if (pdata == NULL) { free (stack); return NULL; } pdata->arg_ptr = argument_ptr; pdata->fn = func; uintptr_t top = (uintptr_t)stack + STACK_SIZE; int pid = clone (top, &_clone_tramp, (void*)pdata); if (pid < 0) { free (stack); free (pdata); return NULL; } pdata->pid = pid; return pdata; }