#include extern int __isthreaded; int ffork(int flags, void(*fn)(void*), void *arg) { void *p; __isthreaded = 1; p = malloc(16384); if(p == nil) return -1; memset(p, 0xFE, 16384); return rfork_thread(RFPROC|flags, (char*)p+16000, (int(*)(void*))fn, arg); } /* * For FreeBSD libc. */ typedef struct { volatile long access_lock; volatile long lock_owner; volatile char *fname; volatile int lineno; } spinlock_t; void _spinlock(spinlock_t *lk) { lock((Lock*)&lk->access_lock); } int getfforkid(void) { return getpid(); }