diff options
Diffstat (limited to 'src/libthread/test')
-rw-r--r-- | src/libthread/test/rdaemon.c | 96 | ||||
-rw-r--r-- | src/libthread/test/tdaemon.c | 9 | ||||
-rw-r--r-- | src/libthread/test/texit.c | 18 | ||||
-rw-r--r-- | src/libthread/test/tprimes.c | 8 | ||||
-rw-r--r-- | src/libthread/test/tspawnloop.c | 2 |
5 files changed, 130 insertions, 3 deletions
diff --git a/src/libthread/test/rdaemon.c b/src/libthread/test/rdaemon.c new file mode 100644 index 00000000..dcb77279 --- /dev/null +++ b/src/libthread/test/rdaemon.c @@ -0,0 +1,96 @@ +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> +#include <sys/wait.h> +#include <pthread.h> + +#undef waitpid +#undef pipe +#undef wait + +static int sigpid; +static void +sigenable(int sig, int enabled) +{ + sigset_t mask; + sigemptyset(&mask); + sigaddset(&mask, sig); + sigprocmask(enabled ? SIG_UNBLOCK : SIG_BLOCK, &mask, 0); +} + +static void +child(void) +{ + int status, pid; +printf("wait %d in %d\n", sigpid, getpid()); + pid = waitpid(sigpid, &status, __WALL); + if(pid < 0) + perror("wait"); + else if(WIFEXITED(status)) + _exit(WEXITSTATUS(status)); +printf("pid %d if %d %d\n", pid, WIFEXITED(status), WEXITSTATUS(status)); + _exit(97); +} + +static void +sigpass(int sig) +{ + if(sig == SIGCHLD){ +print("sig\n"); + child(); + }else + kill(sigpid, sig); +} + +void +_threadsetupdaemonize(void) +{ + int i, n, pid; + int p[2]; + char buf[20]; + + sigpid = 1; + + if(pipe(p) < 0) + abort(); + + signal(SIGCHLD, sigpass); + switch(pid = fork()){ + case -1: + abort(); + default: + close(p[1]); + break; + case 0: + close(p[0]); + return; + } + + sigpid = pid; + + read(p[0], buf, sizeof buf-1); +print("pipe\n"); + child(); +} + +void* +sleeper(void *v) +{ + pthread_mutex_t m; + pthread_cond_t c; + + pthread_mutex_init(&m, 0); + pthread_cond_init(&c, 0); + pthread_cond_wait(&c, &m); + return 0; +} + +void +main(int argc, char **argv) +{ + pthread_t pid; + + _threadsetupdaemonize(); + pthread_create(&pid, 0, sleeper, 0); + exit(1); +} diff --git a/src/libthread/test/tdaemon.c b/src/libthread/test/tdaemon.c index 5ac9768f..d492c48b 100644 --- a/src/libthread/test/tdaemon.c +++ b/src/libthread/test/tdaemon.c @@ -3,9 +3,14 @@ #include <thread.h> void -threadmain(int argc, char **argv) +proc(void *v) { - threaddaemonize(); sleep(5*1000); print("still running\n"); } + +void +threadmain(int argc, char **argv) +{ + proccreate(proc, nil, 32768); +} diff --git a/src/libthread/test/texit.c b/src/libthread/test/texit.c new file mode 100644 index 00000000..fc2ebb52 --- /dev/null +++ b/src/libthread/test/texit.c @@ -0,0 +1,18 @@ +#include <u.h> +#include <libc.h> +#include <thread.h> + +void +f(void *v) +{ + USED(v); + + recvp(chancreate(sizeof(void*), 0)); +} + +void +threadmain(int argc, char **argv) +{ + proccreate(f, nil, 32000); + exit(1); +} diff --git a/src/libthread/test/tprimes.c b/src/libthread/test/tprimes.c index 8fcfa2e2..56744984 100644 --- a/src/libthread/test/tprimes.c +++ b/src/libthread/test/tprimes.c @@ -9,6 +9,7 @@ enum int max = 10000; int (*mk)(void (*fn)(void*), void *arg, uint stack); +void printmsg(void*, char*); void countthread(void *v) @@ -55,6 +56,7 @@ threadmain(int argc, char **argv) Channel *c; int nbuf; + notify(printmsg); nbuf = 0; mk = threadcreate; ARGBEGIN{ @@ -79,3 +81,9 @@ threadmain(int argc, char **argv) mk(filterthread, c, STACK); recvp(chancreate(sizeof(void*), 0)); } + +void +printmsg(void *v, char *msg) +{ + print("note: %s\n", msg); +} diff --git a/src/libthread/test/tspawnloop.c b/src/libthread/test/tspawnloop.c index 8835267f..05636dc9 100644 --- a/src/libthread/test/tspawnloop.c +++ b/src/libthread/test/tspawnloop.c @@ -18,7 +18,7 @@ execproc(void *v) args[2] = nil; threadexec(nil, fd, args[0], args); } - + void threadmain(int argc, char **argv) { |