itlibthread: add threadmaybackground - plan9port - [fork] Plan 9 from user space Err mx1.adamsgaard.dk 70 hgit clone git://src.adamsgaard.dk/plan9port URL:git://src.adamsgaard.dk/plan9port mx1.adamsgaard.dk 70 1Log /src/plan9port/log.gph mx1.adamsgaard.dk 70 1Files /src/plan9port/files.gph mx1.adamsgaard.dk 70 1Refs /src/plan9port/refs.gph mx1.adamsgaard.dk 70 1README /src/plan9port/file/README.md.gph mx1.adamsgaard.dk 70 1LICENSE /src/plan9port/file/LICENSE.gph mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1commit b3a20a96eb2b91a5b0b8a8fb506e20a2fb50ebe8 /src/plan9port/commit/b3a20a96eb2b91a5b0b8a8fb506e20a2fb50ebe8.gph mx1.adamsgaard.dk 70 1parent 5b37d9126474864b5299426e27b2af37fcc96dd0 /src/plan9port/commit/5b37d9126474864b5299426e27b2af37fcc96dd0.gph mx1.adamsgaard.dk 70 hAuthor: Russ Cox URL:mailto:rsc@swtch.com mx1.adamsgaard.dk 70 iDate: Wed, 30 Dec 2020 00:10:11 -0500 Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 ilibthread: add threadmaybackground Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iPrograms that want to background themselves now need Err mx1.adamsgaard.dk 70 itto define threadmaybackground returning 1. Err mx1.adamsgaard.dk 70 iThis avoids a confusing (to people and debuggers) Err mx1.adamsgaard.dk 70 iextra parent process for all the threaded programs Err mx1.adamsgaard.dk 70 itthat will never want to background themselves. Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iDiffstat: Err mx1.adamsgaard.dk 70 i M include/thread.h | 7 +++++-- Err mx1.adamsgaard.dk 70 i M man/man3/thread.3 | 34 ++++++++++++++++++++----------- Err mx1.adamsgaard.dk 70 i M src/cmd/9pfuse/main.c | 6 ++++++ Err mx1.adamsgaard.dk 70 i M src/cmd/9pserve.c | 6 ++++++ Err mx1.adamsgaard.dk 70 i M src/cmd/auth/factotum/main.c | 6 ++++++ Err mx1.adamsgaard.dk 70 i M src/cmd/auth/ssh-agent.c | 6 ++++++ Err mx1.adamsgaard.dk 70 i M src/cmd/fossil/fossil.c | 6 ++++++ Err mx1.adamsgaard.dk 70 i M src/cmd/import.c | 6 ++++++ Err mx1.adamsgaard.dk 70 i M src/cmd/ndb/dns.c | 6 ++++++ Err mx1.adamsgaard.dk 70 i M src/cmd/plumb/plumber.c | 6 ++++++ Err mx1.adamsgaard.dk 70 i M src/cmd/smugfs/main.c | 6 ++++++ Err mx1.adamsgaard.dk 70 i M src/cmd/upas/fs/fs.c | 6 ++++++ Err mx1.adamsgaard.dk 70 i M src/cmd/upas/nfs/main.c | 6 ++++++ Err mx1.adamsgaard.dk 70 i M src/cmd/venti/srv/venti.c | 6 ++++++ Err mx1.adamsgaard.dk 70 i M src/lib9p/ramfs.c | 6 ++++++ Err mx1.adamsgaard.dk 70 i A src/libthread/bg.c | 7 +++++++ Err mx1.adamsgaard.dk 70 i M src/libthread/daemonize.c | 12 ++++++------ Err mx1.adamsgaard.dk 70 i M src/libthread/mkfile | 1 + Err mx1.adamsgaard.dk 70 i M src/libthread/thread.c | 2 +- Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i19 files changed, 120 insertions(+), 21 deletions(-) Err mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1diff --git a/include/thread.h b/include/thread.h /src/plan9port/file/include/thread.h.gph mx1.adamsgaard.dk 70 it@@ -1,7 +1,7 @@ Err mx1.adamsgaard.dk 70 i #ifndef _THREAD_H_ Err mx1.adamsgaard.dk 70 i #define _THREAD_H_ 1 Err mx1.adamsgaard.dk 70 i #if defined(__cplusplus) Err mx1.adamsgaard.dk 70 i-extern "C" { Err mx1.adamsgaard.dk 70 i+extern "C" { Err mx1.adamsgaard.dk 70 i #endif Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i AUTOLIB(thread) Err mx1.adamsgaard.dk 70 it@@ -15,6 +15,7 @@ void threadexits(char *); Err mx1.adamsgaard.dk 70 i void threadexitsall(char *); Err mx1.adamsgaard.dk 70 i void threadsetname(char*, ...); Err mx1.adamsgaard.dk 70 i void threadsetstate(char*, ...); Err mx1.adamsgaard.dk 70 i+void threadneedbackground(void); Err mx1.adamsgaard.dk 70 i char *threadgetname(void); Err mx1.adamsgaard.dk 70 i int threadyield(void); Err mx1.adamsgaard.dk 70 i int threadidle(void); Err mx1.adamsgaard.dk 70 it@@ -60,6 +61,8 @@ void **threaddata(void); Err mx1.adamsgaard.dk 70 i void threadmain(int argc, char *argv[]); Err mx1.adamsgaard.dk 70 i extern int mainstacksize; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+int threadmaybackground(void); Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i /* Err mx1.adamsgaard.dk 70 i * channel communication Err mx1.adamsgaard.dk 70 i */ Err mx1.adamsgaard.dk 70 it@@ -180,7 +183,7 @@ int threadspawnl(int[3], char*, ...); Err mx1.adamsgaard.dk 70 i Channel* threadwaitchan(void); Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i /* Err mx1.adamsgaard.dk 70 i- * alternate interface to threadwaitchan - don't use both! Err mx1.adamsgaard.dk 70 i+ * alternate interface to threadwaitchan - don't use both! Err mx1.adamsgaard.dk 70 i */ Err mx1.adamsgaard.dk 70 i Waitmsg* procwait(int pid); Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 1diff --git a/man/man3/thread.3 b/man/man3/thread.3 /src/plan9port/file/man/man3/thread.3.gph mx1.adamsgaard.dk 70 it@@ -33,6 +33,7 @@ threadintgrp, Err mx1.adamsgaard.dk 70 i threadkill, Err mx1.adamsgaard.dk 70 i threadkillgrp, Err mx1.adamsgaard.dk 70 i threadmain, Err mx1.adamsgaard.dk 70 i+threadmaybackground, Err mx1.adamsgaard.dk 70 i threadnotify, Err mx1.adamsgaard.dk 70 i threadid, Err mx1.adamsgaard.dk 70 i threadpid, Err mx1.adamsgaard.dk 70 it@@ -80,6 +81,7 @@ struct Alt { Err mx1.adamsgaard.dk 70 i .ft L Err mx1.adamsgaard.dk 70 i .ta \w'\fLChannel* 'u +4n +4n +4n +4n Err mx1.adamsgaard.dk 70 i void threadmain(int argc, char *argv[]) Err mx1.adamsgaard.dk 70 i+int threadmaybackground(void) Err mx1.adamsgaard.dk 70 i int mainstacksize Err mx1.adamsgaard.dk 70 i int proccreate(void (*fn)(void*), void *arg, uint stacksize) Err mx1.adamsgaard.dk 70 i int threadcreate(void (*fn)(void*), void *arg, uint stacksize) Err mx1.adamsgaard.dk 70 it@@ -171,7 +173,7 @@ initialized to the desired value Err mx1.adamsgaard.dk 70 i .BR 1024 ). Err mx1.adamsgaard.dk 70 i When using the Err mx1.adamsgaard.dk 70 i .I pthread Err mx1.adamsgaard.dk 70 i-library, Err mx1.adamsgaard.dk 70 i+library, Err mx1.adamsgaard.dk 70 i .B mainstacksize Err mx1.adamsgaard.dk 70 i is ignored, as is the stack size argument to Err mx1.adamsgaard.dk 70 i .BR proccreate : Err mx1.adamsgaard.dk 70 it@@ -185,7 +187,7 @@ executes Err mx1.adamsgaard.dk 70 i .I fn(arg) Err mx1.adamsgaard.dk 70 i on a stack of size Err mx1.adamsgaard.dk 70 i .IR stacksize . Err mx1.adamsgaard.dk 70 i-Thread stacks are allocated in shared memory, making it valid to pass Err mx1.adamsgaard.dk 70 i+Thread stacks are allocated in shared memory, making it valid to pass Err mx1.adamsgaard.dk 70 i pointers to stack variables between threads and procs. Err mx1.adamsgaard.dk 70 i .I Proccreate Err mx1.adamsgaard.dk 70 i creates a new proc, and inside that proc creates Err mx1.adamsgaard.dk 70 it@@ -207,7 +209,7 @@ returning the id of the created thread. Err mx1.adamsgaard.dk 70 i .\" in Err mx1.adamsgaard.dk 70 i .\" .IR rforkflag .) Err mx1.adamsgaard.dk 70 i .\" .I Proccreate Err mx1.adamsgaard.dk 70 i-.\" is identical to Err mx1.adamsgaard.dk 70 i+.\" is identical to Err mx1.adamsgaard.dk 70 i .\" .I procrfork Err mx1.adamsgaard.dk 70 i .\" with Err mx1.adamsgaard.dk 70 i .\" .I rforkflag Err mx1.adamsgaard.dk 70 it@@ -238,6 +240,14 @@ When the last thread in Err mx1.adamsgaard.dk 70 i .IR threadmain 's Err mx1.adamsgaard.dk 70 i proc exits, the program will appear to its parent to have exited. Err mx1.adamsgaard.dk 70 i The remaining procs will still run together, but as a background program. Err mx1.adamsgaard.dk 70 i+This functionality can only be relied upon if the program defines a function Err mx1.adamsgaard.dk 70 i+.I threadmaybackground Err mx1.adamsgaard.dk 70 i+returning a non-zero result. Err mx1.adamsgaard.dk 70 i+Programs that do not define such a Err mx1.adamsgaard.dk 70 i+.I threadmaybackground Err mx1.adamsgaard.dk 70 i+will crash instead should the last thread in Err mx1.adamsgaard.dk 70 i+.IR threadmain 's Err mx1.adamsgaard.dk 70 i+proc exit leaving behind other running procs. Err mx1.adamsgaard.dk 70 i .PP Err mx1.adamsgaard.dk 70 i The threads in a proc are coroutines, scheduled nonpreemptively Err mx1.adamsgaard.dk 70 i in a round-robin fashion. Err mx1.adamsgaard.dk 70 it@@ -341,18 +351,18 @@ Also for debugging, Err mx1.adamsgaard.dk 70 i threads have a string state associated with them. Err mx1.adamsgaard.dk 70 i .I Threadsetstate Err mx1.adamsgaard.dk 70 i sets the state string. Err mx1.adamsgaard.dk 70 i-There is no Err mx1.adamsgaard.dk 70 i+There is no Err mx1.adamsgaard.dk 70 i .IR threadgetstate ; Err mx1.adamsgaard.dk 70 i since the thread scheduler resets the state to Err mx1.adamsgaard.dk 70 i .B Running Err mx1.adamsgaard.dk 70 i-every time it runs the thread, Err mx1.adamsgaard.dk 70 i+every time it runs the thread, Err mx1.adamsgaard.dk 70 i it is only useful for debuggers to inspect the state. Err mx1.adamsgaard.dk 70 i .PP Err mx1.adamsgaard.dk 70 i .I Threaddata Err mx1.adamsgaard.dk 70 i returns a pointer to a per-thread pointer Err mx1.adamsgaard.dk 70 i that may be modified by threaded programs for Err mx1.adamsgaard.dk 70 i per-thread storage. Err mx1.adamsgaard.dk 70 i-Similarly, Err mx1.adamsgaard.dk 70 i+Similarly, Err mx1.adamsgaard.dk 70 i .I procdata Err mx1.adamsgaard.dk 70 i returns a pointer to a per-proc pointer. Err mx1.adamsgaard.dk 70 i .PP Err mx1.adamsgaard.dk 70 it@@ -398,11 +408,11 @@ response. Err mx1.adamsgaard.dk 70 i .I Threadexecl Err mx1.adamsgaard.dk 70 i and Err mx1.adamsgaard.dk 70 i .I threadexec Err mx1.adamsgaard.dk 70 i-will duplicate Err mx1.adamsgaard.dk 70 i+will duplicate Err mx1.adamsgaard.dk 70 i (see Err mx1.adamsgaard.dk 70 i .MR dup (3) ) Err mx1.adamsgaard.dk 70 i the three file descriptors in Err mx1.adamsgaard.dk 70 i-.I fd Err mx1.adamsgaard.dk 70 i+.I fd Err mx1.adamsgaard.dk 70 i onto standard input, output, and error for the external program Err mx1.adamsgaard.dk 70 i and then close them in the calling thread. Err mx1.adamsgaard.dk 70 i Beware of code that sets Err mx1.adamsgaard.dk 70 it@@ -467,9 +477,9 @@ operation blocks until the corresponding Err mx1.adamsgaard.dk 70 i operation occurs and Err mx1.adamsgaard.dk 70 i .IR "vice versa" . Err mx1.adamsgaard.dk 70 i .IR Chancreate Err mx1.adamsgaard.dk 70 i-allocates a new channel Err mx1.adamsgaard.dk 70 i+allocates a new channel Err mx1.adamsgaard.dk 70 i for messages of size Err mx1.adamsgaard.dk 70 i-.I elsize Err mx1.adamsgaard.dk 70 i+.I elsize Err mx1.adamsgaard.dk 70 i and with a buffer holding Err mx1.adamsgaard.dk 70 i .I nel Err mx1.adamsgaard.dk 70 i messages. Err mx1.adamsgaard.dk 70 it@@ -645,7 +655,7 @@ from the main proc before any other procs have been created. Err mx1.adamsgaard.dk 70 i To create new processes, use Err mx1.adamsgaard.dk 70 i .IR proccreate . Err mx1.adamsgaard.dk 70 i .\" .PP Err mx1.adamsgaard.dk 70 i-.\" It is safe to use Err mx1.adamsgaard.dk 70 i+.\" It is safe to use Err mx1.adamsgaard.dk 70 i .\" .IR rfork Err mx1.adamsgaard.dk 70 i .\" (see Err mx1.adamsgaard.dk 70 i .\" .IR fork (3)) Err mx1.adamsgaard.dk 70 it@@ -663,7 +673,7 @@ To create new processes, use Err mx1.adamsgaard.dk 70 i .\" .BR RFCENVG. Err mx1.adamsgaard.dk 70 i .\" (To create new processes, use Err mx1.adamsgaard.dk 70 i .\" .I proccreate Err mx1.adamsgaard.dk 70 i-.\" and Err mx1.adamsgaard.dk 70 i+.\" and Err mx1.adamsgaard.dk 70 i .\" .IR procrfork .) Err mx1.adamsgaard.dk 70 i .\" As mentioned above, Err mx1.adamsgaard.dk 70 i .\" the thread library depends on all procs being in the Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/9pfuse/main.c b/src/cmd/9pfuse/main.c /src/plan9port/file/src/cmd/9pfuse/main.c.gph mx1.adamsgaard.dk 70 it@@ -98,6 +98,12 @@ usage(void) Err mx1.adamsgaard.dk 70 i void fusereader(void*); Err mx1.adamsgaard.dk 70 i void watchfd(void*); Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+int Err mx1.adamsgaard.dk 70 i+threadmaybackground(void) Err mx1.adamsgaard.dk 70 i+{ Err mx1.adamsgaard.dk 70 i+ return 1; Err mx1.adamsgaard.dk 70 i+} Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i void Err mx1.adamsgaard.dk 70 i threadmain(int argc, char **argv) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/9pserve.c b/src/cmd/9pserve.c /src/plan9port/file/src/cmd/9pserve.c.gph mx1.adamsgaard.dk 70 it@@ -137,6 +137,12 @@ usage(void) Err mx1.adamsgaard.dk 70 i threadexitsall("usage"); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+int Err mx1.adamsgaard.dk 70 i+threadmaybackground(void) Err mx1.adamsgaard.dk 70 i+{ Err mx1.adamsgaard.dk 70 i+ return 1; Err mx1.adamsgaard.dk 70 i+} Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i uchar vbuf[128]; Err mx1.adamsgaard.dk 70 i extern int _threaddebuglevel; Err mx1.adamsgaard.dk 70 i void Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/auth/factotum/main.c b/src/cmd/auth/factotum/main.c /src/plan9port/file/src/cmd/auth/factotum/main.c.gph mx1.adamsgaard.dk 70 it@@ -20,6 +20,12 @@ usage(void) Err mx1.adamsgaard.dk 70 i threadexitsall("usage"); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+int Err mx1.adamsgaard.dk 70 i+threadmaybackground(void) Err mx1.adamsgaard.dk 70 i+{ Err mx1.adamsgaard.dk 70 i+ return 1; Err mx1.adamsgaard.dk 70 i+} Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i void Err mx1.adamsgaard.dk 70 i threadmain(int argc, char *argv[]) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/auth/ssh-agent.c b/src/cmd/auth/ssh-agent.c /src/plan9port/file/src/cmd/auth/ssh-agent.c.gph mx1.adamsgaard.dk 70 it@@ -90,6 +90,12 @@ usage(void) Err mx1.adamsgaard.dk 70 i threadexitsall("usage"); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+int Err mx1.adamsgaard.dk 70 i+threadmaybackground(void) Err mx1.adamsgaard.dk 70 i+{ Err mx1.adamsgaard.dk 70 i+ return 1; Err mx1.adamsgaard.dk 70 i+} Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i void Err mx1.adamsgaard.dk 70 i threadmain(int argc, char **argv) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/fossil/fossil.c b/src/cmd/fossil/fossil.c /src/plan9port/file/src/cmd/fossil/fossil.c.gph mx1.adamsgaard.dk 70 it@@ -59,6 +59,12 @@ readCmdPart(char *file, char ***pcmd, int *pncmd) Err mx1.adamsgaard.dk 70 i *pncmd = ncmd; Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+int Err mx1.adamsgaard.dk 70 i+threadmaybackground(void) Err mx1.adamsgaard.dk 70 i+{ Err mx1.adamsgaard.dk 70 i+ return 1; Err mx1.adamsgaard.dk 70 i+} Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i void Err mx1.adamsgaard.dk 70 i threadmain(int argc, char* argv[]) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/import.c b/src/cmd/import.c /src/plan9port/file/src/cmd/import.c.gph mx1.adamsgaard.dk 70 it@@ -51,6 +51,12 @@ fatal(char *fmt, ...) Err mx1.adamsgaard.dk 70 i threadexitsall("fatal"); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+int Err mx1.adamsgaard.dk 70 i+threadmaybackground(void) Err mx1.adamsgaard.dk 70 i+{ Err mx1.adamsgaard.dk 70 i+ return 1; Err mx1.adamsgaard.dk 70 i+} Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i void Err mx1.adamsgaard.dk 70 i threadmain(int argc, char *argv[]) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/ndb/dns.c b/src/cmd/ndb/dns.c /src/plan9port/file/src/cmd/ndb/dns.c.gph mx1.adamsgaard.dk 70 it@@ -121,6 +121,12 @@ checkaddress(void) Err mx1.adamsgaard.dk 70 i fprint(2, "warning: announce mismatch %s %s\n", udpaddr, tcpaddr); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+int Err mx1.adamsgaard.dk 70 i+threadmaybackground(void) Err mx1.adamsgaard.dk 70 i+{ Err mx1.adamsgaard.dk 70 i+ return 1; Err mx1.adamsgaard.dk 70 i+} Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i void Err mx1.adamsgaard.dk 70 i threadmain(int argc, char *argv[]) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/plumb/plumber.c b/src/cmd/plumb/plumber.c /src/plan9port/file/src/cmd/plumb/plumber.c.gph mx1.adamsgaard.dk 70 it@@ -26,6 +26,12 @@ makeports(Ruleset *rules[]) Err mx1.adamsgaard.dk 70 i addport(rules[i]->port); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+int Err mx1.adamsgaard.dk 70 i+threadmaybackground(void) Err mx1.adamsgaard.dk 70 i+{ Err mx1.adamsgaard.dk 70 i+ return 1; Err mx1.adamsgaard.dk 70 i+} Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i void Err mx1.adamsgaard.dk 70 i threadmain(int argc, char *argv[]) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/smugfs/main.c b/src/cmd/smugfs/main.c /src/plan9port/file/src/cmd/smugfs/main.c.gph mx1.adamsgaard.dk 70 it@@ -51,6 +51,12 @@ smuglogin(void) Err mx1.adamsgaard.dk 70 i printerrors = 0; Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+int Err mx1.adamsgaard.dk 70 i+threadmaybackground(void) Err mx1.adamsgaard.dk 70 i+{ Err mx1.adamsgaard.dk 70 i+ return 1; Err mx1.adamsgaard.dk 70 i+} Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i void Err mx1.adamsgaard.dk 70 i threadmain(int argc, char **argv) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/upas/fs/fs.c b/src/cmd/upas/fs/fs.c /src/plan9port/file/src/cmd/upas/fs/fs.c.gph mx1.adamsgaard.dk 70 it@@ -155,6 +155,12 @@ notifyf(void *a, char *s) Err mx1.adamsgaard.dk 70 i noted(NDFLT); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+int Err mx1.adamsgaard.dk 70 i+threadmaybackground(void) Err mx1.adamsgaard.dk 70 i+{ Err mx1.adamsgaard.dk 70 i+ return 1; Err mx1.adamsgaard.dk 70 i+} Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i void Err mx1.adamsgaard.dk 70 i threadmain(int argc, char *argv[]) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/upas/nfs/main.c b/src/cmd/upas/nfs/main.c /src/plan9port/file/src/cmd/upas/nfs/main.c.gph mx1.adamsgaard.dk 70 it@@ -26,6 +26,12 @@ usage(void) Err mx1.adamsgaard.dk 70 i threadexitsall("usage"); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+int Err mx1.adamsgaard.dk 70 i+threadmaybackground(void) Err mx1.adamsgaard.dk 70 i+{ Err mx1.adamsgaard.dk 70 i+ return 1; Err mx1.adamsgaard.dk 70 i+} Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i void Err mx1.adamsgaard.dk 70 i threadmain(int argc, char **argv) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 1diff --git a/src/cmd/venti/srv/venti.c b/src/cmd/venti/srv/venti.c /src/plan9port/file/src/cmd/venti/srv/venti.c.gph mx1.adamsgaard.dk 70 it@@ -23,6 +23,12 @@ usage(void) Err mx1.adamsgaard.dk 70 i threadexitsall("usage"); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+int Err mx1.adamsgaard.dk 70 i+threadmaybackground(void) Err mx1.adamsgaard.dk 70 i+{ Err mx1.adamsgaard.dk 70 i+ return 1; Err mx1.adamsgaard.dk 70 i+} Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i void Err mx1.adamsgaard.dk 70 i threadmain(int argc, char *argv[]) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 1diff --git a/src/lib9p/ramfs.c b/src/lib9p/ramfs.c /src/plan9port/file/src/lib9p/ramfs.c.gph mx1.adamsgaard.dk 70 it@@ -125,6 +125,12 @@ usage(void) Err mx1.adamsgaard.dk 70 i threadexitsall("usage"); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+int Err mx1.adamsgaard.dk 70 i+threadmaybackground(void) Err mx1.adamsgaard.dk 70 i+{ Err mx1.adamsgaard.dk 70 i+ return 1; Err mx1.adamsgaard.dk 70 i+} Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i void Err mx1.adamsgaard.dk 70 i threadmain(int argc, char **argv) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/bg.c b/src/libthread/bg.c /src/plan9port/file/src/libthread/bg.c.gph mx1.adamsgaard.dk 70 it@@ -0,0 +1,7 @@ Err mx1.adamsgaard.dk 70 i+#include "threadimpl.h" Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i+int Err mx1.adamsgaard.dk 70 i+threadmaybackground(void) Err mx1.adamsgaard.dk 70 i+{ Err mx1.adamsgaard.dk 70 i+ return 0; Err mx1.adamsgaard.dk 70 i+} Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/daemonize.c b/src/libthread/daemonize.c /src/plan9port/file/src/libthread/daemonize.c.gph mx1.adamsgaard.dk 70 it@@ -8,7 +8,7 @@ Err mx1.adamsgaard.dk 70 i #undef wait Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i static int sigpid; Err mx1.adamsgaard.dk 70 i-static int threadpassfd; Err mx1.adamsgaard.dk 70 i+static int threadpassfd = -1; Err mx1.adamsgaard.dk 70 i static int gotsigchld; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i static void Err mx1.adamsgaard.dk 70 it@@ -163,9 +163,9 @@ _threadsetupdaemonize(void) Err mx1.adamsgaard.dk 70 i void Err mx1.adamsgaard.dk 70 i _threaddaemonize(void) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i- if(threadpassfd >= 0){ Err mx1.adamsgaard.dk 70 i- write(threadpassfd, "0", 1); Err mx1.adamsgaard.dk 70 i- close(threadpassfd); Err mx1.adamsgaard.dk 70 i- threadpassfd = -1; Err mx1.adamsgaard.dk 70 i- } Err mx1.adamsgaard.dk 70 i+ if(threadpassfd < 0) Err mx1.adamsgaard.dk 70 i+ sysfatal("threads in main proc exited w/o threadmaybackground"); Err mx1.adamsgaard.dk 70 i+ write(threadpassfd, "0", 1); Err mx1.adamsgaard.dk 70 i+ close(threadpassfd); Err mx1.adamsgaard.dk 70 i+ threadpassfd = -1; Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/mkfile b/src/libthread/mkfile /src/plan9port/file/src/libthread/mkfile.gph mx1.adamsgaard.dk 70 it@@ -4,6 +4,7 @@ SYSOFILES=`{sh ./sysofiles.sh} Err mx1.adamsgaard.dk 70 i LIB=libthread.a Err mx1.adamsgaard.dk 70 i OFILES=\ Err mx1.adamsgaard.dk 70 i $SYSOFILES\ Err mx1.adamsgaard.dk 70 i+ bg.$O\ Err mx1.adamsgaard.dk 70 i channel.$O\ Err mx1.adamsgaard.dk 70 i daemonize.$O\ Err mx1.adamsgaard.dk 70 i exec.$O\ Err mx1.adamsgaard.dk 70 1diff --git a/src/libthread/thread.c b/src/libthread/thread.c /src/plan9port/file/src/libthread/thread.c.gph mx1.adamsgaard.dk 70 it@@ -844,7 +844,7 @@ main(int argc, char **argv) Err mx1.adamsgaard.dk 70 i // Easier to just run in pthread-per-thread mode. Err mx1.adamsgaard.dk 70 i pthreadperthread = 1; Err mx1.adamsgaard.dk 70 i #endif Err mx1.adamsgaard.dk 70 i- if(strstr(opts, "nodaemon") == nil && getenv("NOLIBTHREADDAEMONIZE") == nil) Err mx1.adamsgaard.dk 70 i+ if(threadmaybackground() && strstr(opts, "nodaemon") == nil && getenv("NOLIBTHREADDAEMONIZE") == nil) Err mx1.adamsgaard.dk 70 i _threadsetupdaemonize(); Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i threadargc = argc; Err mx1.adamsgaard.dk 70 .