Blame


1 b2cfc4e2 2003-09-30 devnull #include <lib9.h>
2 b2cfc4e2 2003-09-30 devnull
3 b2cfc4e2 2003-09-30 devnull extern int __isthreaded;
4 b2cfc4e2 2003-09-30 devnull int
5 b2cfc4e2 2003-09-30 devnull ffork(int flags, void(*fn)(void*), void *arg)
6 b2cfc4e2 2003-09-30 devnull {
7 b2cfc4e2 2003-09-30 devnull void *p;
8 b2cfc4e2 2003-09-30 devnull
9 b2cfc4e2 2003-09-30 devnull __isthreaded = 1;
10 b2cfc4e2 2003-09-30 devnull p = malloc(16384);
11 b2cfc4e2 2003-09-30 devnull if(p == nil)
12 b2cfc4e2 2003-09-30 devnull return -1;
13 b2cfc4e2 2003-09-30 devnull memset(p, 0xFE, 16384);
14 b2cfc4e2 2003-09-30 devnull return rfork_thread(RFPROC|flags, (char*)p+16000, (int(*)(void*))fn, arg);
15 b2cfc4e2 2003-09-30 devnull }
16 b2cfc4e2 2003-09-30 devnull
17 b2cfc4e2 2003-09-30 devnull /*
18 b2cfc4e2 2003-09-30 devnull * For FreeBSD libc.
19 b2cfc4e2 2003-09-30 devnull */
20 b2cfc4e2 2003-09-30 devnull
21 b2cfc4e2 2003-09-30 devnull typedef struct {
22 b2cfc4e2 2003-09-30 devnull volatile long access_lock;
23 b2cfc4e2 2003-09-30 devnull volatile long lock_owner;
24 b2cfc4e2 2003-09-30 devnull volatile char *fname;
25 b2cfc4e2 2003-09-30 devnull volatile int lineno;
26 b2cfc4e2 2003-09-30 devnull } spinlock_t;
27 b2cfc4e2 2003-09-30 devnull
28 b2cfc4e2 2003-09-30 devnull void
29 b2cfc4e2 2003-09-30 devnull _spinlock(spinlock_t *lk)
30 b2cfc4e2 2003-09-30 devnull {
31 b2cfc4e2 2003-09-30 devnull lock((Lock*)&lk->access_lock);
32 b2cfc4e2 2003-09-30 devnull }
33 b2cfc4e2 2003-09-30 devnull
34 a995e477 2003-10-01 devnull int
35 a995e477 2003-10-01 devnull getfforkid(void)
36 a995e477 2003-10-01 devnull {
37 a995e477 2003-10-01 devnull return getpid();
38 a995e477 2003-10-01 devnull }
39 a995e477 2003-10-01 devnull