more tests
This commit is contained in:
parent
ed01060152
commit
f6127ed209
5 changed files with 130 additions and 3 deletions
96
src/libthread/test/rdaemon.c
Normal file
96
src/libthread/test/rdaemon.c
Normal file
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
@ -3,9 +3,14 @@
|
||||||
#include <thread.h>
|
#include <thread.h>
|
||||||
|
|
||||||
void
|
void
|
||||||
threadmain(int argc, char **argv)
|
proc(void *v)
|
||||||
{
|
{
|
||||||
threaddaemonize();
|
|
||||||
sleep(5*1000);
|
sleep(5*1000);
|
||||||
print("still running\n");
|
print("still running\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
threadmain(int argc, char **argv)
|
||||||
|
{
|
||||||
|
proccreate(proc, nil, 32768);
|
||||||
|
}
|
||||||
|
|
|
||||||
18
src/libthread/test/texit.c
Normal file
18
src/libthread/test/texit.c
Normal file
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
@ -9,6 +9,7 @@ enum
|
||||||
|
|
||||||
int max = 10000;
|
int max = 10000;
|
||||||
int (*mk)(void (*fn)(void*), void *arg, uint stack);
|
int (*mk)(void (*fn)(void*), void *arg, uint stack);
|
||||||
|
void printmsg(void*, char*);
|
||||||
|
|
||||||
void
|
void
|
||||||
countthread(void *v)
|
countthread(void *v)
|
||||||
|
|
@ -55,6 +56,7 @@ threadmain(int argc, char **argv)
|
||||||
Channel *c;
|
Channel *c;
|
||||||
int nbuf;
|
int nbuf;
|
||||||
|
|
||||||
|
notify(printmsg);
|
||||||
nbuf = 0;
|
nbuf = 0;
|
||||||
mk = threadcreate;
|
mk = threadcreate;
|
||||||
ARGBEGIN{
|
ARGBEGIN{
|
||||||
|
|
@ -79,3 +81,9 @@ threadmain(int argc, char **argv)
|
||||||
mk(filterthread, c, STACK);
|
mk(filterthread, c, STACK);
|
||||||
recvp(chancreate(sizeof(void*), 0));
|
recvp(chancreate(sizeof(void*), 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
printmsg(void *v, char *msg)
|
||||||
|
{
|
||||||
|
print("note: %s\n", msg);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ execproc(void *v)
|
||||||
args[2] = nil;
|
args[2] = nil;
|
||||||
threadexec(nil, fd, args[0], args);
|
threadexec(nil, fd, args[0], args);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
threadmain(int argc, char **argv)
|
threadmain(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue