Blame


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