diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2021-05-01 16:37:00 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2021-05-01 16:37:00 +0200 |
commit | f6509078ed9d03b71c945b19cdda5c882cb1e78d (patch) | |
tree | f060fbb137179f248898f62e3b81c882a6f493e8 /sys/src/lib9p | |
parent | 013b4983140cc2fbb7df9e3647e2e7c5d575a9dd (diff) |
lib9p: expose Srv.forker handler and srvforker(), threadsrvforker() and threadsrv() functions
To use srvrease()/srvaquire() we need to have a way to spawn
new processes to handle the service loop. This functionality
was provided by the internal _forker() function which was
eigther rfork or libthread based implementation depending on
if postmountsrv() or threadpostmountsrv() where called.
For servers who want to use srv() directly, _forker would not
be initialized so srvrelease() could not be used.
To untangle this, we get rid of the global _forker handler
and put the handler in the Srv structure. Which will get
initialized (when nil) to eigther srvforker() or threadsrvforker()
depending on if the thread or non-thread entry points where used.
For symmetry, we provde new threadsrv() and threadpostsrv()
functions which handle the default initialization of Srv.forker.
This also allows a user to provide his own forker function,
maybe to conserve stack space.
To avoid dead code, we put each of these function in their
own object file. Note, this also allows a user to define its
own srvforker() symbol.
Diffstat (limited to 'sys/src/lib9p')
-rw-r--r-- | sys/src/lib9p/listen.c | 10 | ||||
-rw-r--r-- | sys/src/lib9p/mkfile | 17 | ||||
-rw-r--r-- | sys/src/lib9p/mount.c | 19 | ||||
-rw-r--r-- | sys/src/lib9p/post.c | 52 | ||||
-rw-r--r-- | sys/src/lib9p/rfork.c | 25 | ||||
-rw-r--r-- | sys/src/lib9p/share.c | 33 | ||||
-rw-r--r-- | sys/src/lib9p/srv.c | 7 | ||||
-rw-r--r-- | sys/src/lib9p/thread.c | 25 | ||||
-rw-r--r-- | sys/src/lib9p/threadlistensrv.c | 13 | ||||
-rw-r--r-- | sys/src/lib9p/threadpostmountsrv.c | 13 | ||||
-rw-r--r-- | sys/src/lib9p/threadpostsharesrv.c | 13 | ||||
-rw-r--r-- | sys/src/lib9p/threadpostsrv.c | 13 | ||||
-rw-r--r-- | sys/src/lib9p/threadsrv.c | 13 |
13 files changed, 147 insertions, 106 deletions
diff --git a/sys/src/lib9p/listen.c b/sys/src/lib9p/listen.c index 89b2f322d..59082f594 100644 --- a/sys/src/lib9p/listen.c +++ b/sys/src/lib9p/listen.c @@ -11,7 +11,7 @@ static void srvfree(Srv *); static char *getremotesys(char*); void -_listensrv(Srv *os, char *addr) +listensrv(Srv *os, char *addr) { Srv *s; @@ -33,9 +33,9 @@ _listensrv(Srv *os, char *addr) s->spid = 0; s->free = nil; - if(_forker == nil) - sysfatal("no forker"); - _forker(listenproc, s, 0); + if(s->forker == nil) + s->forker = srvforker; + (*s->forker)(listenproc, s, 0); } static void @@ -72,7 +72,7 @@ listenproc(void *v) s->addr = getremotesys(ndir); s->infd = s->outfd = data; s->free = srvfree; - _forker(srvproc, s, 0); + (*s->forker)(srvproc, s, 0); } free(os->addr); free(os); diff --git a/sys/src/lib9p/mkfile b/sys/src/lib9p/mkfile index 78129109b..6ec968a88 100644 --- a/sys/src/lib9p/mkfile +++ b/sys/src/lib9p/mkfile @@ -7,17 +7,24 @@ OFILES=\ fid.$O\ file.$O\ intmap.$O\ - listen.$O\ mem.$O\ req.$O\ parse.$O\ - post.$O\ queue.$O\ - rfork.$O\ - srv.$O\ - thread.$O\ uid.$O\ util.$O\ + srv.$O\ + post.$O\ + mount.$O\ + share.$O\ + listen.$O\ + rfork.$O\ + thread.$O\ + threadsrv.$O\ + threadpostsrv.$O\ + threadpostmountsrv.$O\ + threadpostsharesrv.$O\ + threadlistensrv.$O\ HFILES=/sys/include/9p.h diff --git a/sys/src/lib9p/mount.c b/sys/src/lib9p/mount.c new file mode 100644 index 000000000..1adc90bed --- /dev/null +++ b/sys/src/lib9p/mount.c @@ -0,0 +1,19 @@ +#include <u.h> +#include <libc.h> +#include <fcall.h> +#include <thread.h> +#include <9p.h> +#include <auth.h> + +void +postmountsrv(Srv *s, char *name, char *mtpt, int flag) +{ + postsrv(s, name); + + if(mtpt != nil){ + if(amount(s->srvfd, mtpt, flag, "") == -1) + sysfatal("mount %s: %r", mtpt); + /* mount closed s->srvfd */ + } else + close(s->srvfd); +} diff --git a/sys/src/lib9p/post.c b/sys/src/lib9p/post.c index ba4265494..803d7646d 100644 --- a/sys/src/lib9p/post.c +++ b/sys/src/lib9p/post.c @@ -8,15 +8,13 @@ static void postproc(void *v) { - Srv *s; - - s = v; + Srv *s = v; rendezvous(0, 0); close(s->srvfd); srv(s); } -static void +void postsrv(Srv *s, char *name) { char buf[80]; @@ -37,9 +35,9 @@ postsrv(Srv *s, char *name) } else cfd = -1; - if(_forker == nil) - sysfatal("no forker"); - _forker(postproc, s, RFNAMEG|RFNOTEG); + if(s->forker == nil) + s->forker = srvforker; + (*s->forker)(postproc, s, RFNAMEG|RFNOTEG); rfork(RFFDG); rendezvous(0, 0); @@ -51,43 +49,3 @@ postsrv(Srv *s, char *name) if(cfd >= 0) close(cfd); } - -void -_postmountsrv(Srv *s, char *name, char *mtpt, int flag) -{ - postsrv(s, name); - - if(mtpt != nil){ - if(amount(s->srvfd, mtpt, flag, "") == -1) - sysfatal("mount %s: %r", mtpt); - /* mount closed s->srvfd */ - } else - close(s->srvfd); -} - -void -_postsharesrv(Srv *s, char *name, char *mtpt, char *desc) -{ - char buf[80]; - int cfd; - - if(mtpt != nil && desc != nil){ - snprint(buf, sizeof buf, "#σc/%s", mtpt); - if((cfd = create(buf, OREAD, DMDIR|0700)) >= 0) - close(cfd); - - snprint(buf, sizeof buf, "#σc/%s/%s", mtpt, desc); - if((cfd = create(buf, OWRITE|ORCLOSE|OCEXEC, 0600)) < 0) - sysfatal("create %s: %r", buf); - } else - cfd = -1; - - postsrv(s, name); - - if(cfd >= 0){ - if(fprint(cfd, "%d\n", s->srvfd) < 0) - sysfatal("write %s: %r", buf); - close(cfd); - } - close(s->srvfd); -} diff --git a/sys/src/lib9p/rfork.c b/sys/src/lib9p/rfork.c index 45bf59365..32621d57f 100644 --- a/sys/src/lib9p/rfork.c +++ b/sys/src/lib9p/rfork.c @@ -4,8 +4,8 @@ #include <thread.h> #include <9p.h> -static void -rforker(void (*fn)(void*), void *arg, int flag) +void +srvforker(void (*fn)(void*), void *arg, int flag) { switch(rfork(RFPROC|RFMEM|RFNOWAIT|flag)){ case -1: @@ -17,24 +17,3 @@ rforker(void (*fn)(void*), void *arg, int flag) _exits(0); } } - -void -listensrv(Srv *s, char *addr) -{ - _forker = rforker; - _listensrv(s, addr); -} - -void -postmountsrv(Srv *s, char *name, char *mtpt, int flag) -{ - _forker = rforker; - _postmountsrv(s, name, mtpt, flag); -} - -void -postsharesrv(Srv *s, char *name, char *mtpt, char *desc) -{ - _forker = rforker; - _postsharesrv(s, name, mtpt, desc); -} diff --git a/sys/src/lib9p/share.c b/sys/src/lib9p/share.c new file mode 100644 index 000000000..f33d62b1e --- /dev/null +++ b/sys/src/lib9p/share.c @@ -0,0 +1,33 @@ +#include <u.h> +#include <libc.h> +#include <fcall.h> +#include <thread.h> +#include <9p.h> +#include <auth.h> + +void +postsharesrv(Srv *s, char *name, char *mtpt, char *desc) +{ + char buf[80]; + int cfd; + + if(mtpt != nil && desc != nil){ + snprint(buf, sizeof buf, "#σc/%s", mtpt); + if((cfd = create(buf, OREAD, DMDIR|0700)) >= 0) + close(cfd); + + snprint(buf, sizeof buf, "#σc/%s/%s", mtpt, desc); + if((cfd = create(buf, OWRITE|ORCLOSE|OCEXEC, 0600)) < 0) + sysfatal("create %s: %r", buf); + } else + cfd = -1; + + postsrv(s, name); + + if(cfd >= 0){ + if(fprint(cfd, "%d\n", s->srvfd) < 0) + sysfatal("write %s: %r", buf); + close(cfd); + } + close(s->srvfd); +} diff --git a/sys/src/lib9p/srv.c b/sys/src/lib9p/srv.c index f3039e012..5e82b5603 100644 --- a/sys/src/lib9p/srv.c +++ b/sys/src/lib9p/srv.c @@ -5,8 +5,6 @@ #include <thread.h> #include <9p.h> -void (*_forker)(void(*)(void*), void*, int); - static char Ebadattach[] = "unknown specifier in attach"; static char Ebadoffset[] = "bad offset"; static char Ebadcount[] = "bad count"; @@ -813,7 +811,7 @@ srvrelease(Srv *srv) { if(decref(&srv->sref) == 0){ incref(&srv->sref); - _forker(srvwork, srv, 0); + (*srv->forker)(srvwork, srv, 0); } qunlock(&srv->slock); } @@ -843,6 +841,9 @@ srv(Srv *srv) if(srv->start) srv->start(srv); + if(srv->forker == nil) + srv->forker = srvforker; + incref(&srv->sref); srvwork(srv); } diff --git a/sys/src/lib9p/thread.c b/sys/src/lib9p/thread.c index 445791be4..0e536ba5b 100644 --- a/sys/src/lib9p/thread.c +++ b/sys/src/lib9p/thread.c @@ -4,29 +4,8 @@ #include <thread.h> #include <9p.h> -static void -tforker(void (*fn)(void*), void *arg, int rflag) -{ - procrfork(fn, arg, 32*1024, rflag); -} - void -threadlistensrv(Srv *s, char *addr) +threadsrvforker(void (*fn)(void*), void *arg, int rflag) { - _forker = tforker; - _listensrv(s, addr); -} - -void -threadpostmountsrv(Srv *s, char *name, char *mtpt, int flag) -{ - _forker = tforker; - _postmountsrv(s, name, mtpt, flag); -} - -void -threadpostsharesrv(Srv *s, char *name, char *mtpt, char *desc) -{ - _forker = tforker; - _postsharesrv(s, name, mtpt, desc); + procrfork(fn, arg, 32*1024, rflag); } diff --git a/sys/src/lib9p/threadlistensrv.c b/sys/src/lib9p/threadlistensrv.c new file mode 100644 index 000000000..65be4e51e --- /dev/null +++ b/sys/src/lib9p/threadlistensrv.c @@ -0,0 +1,13 @@ +#include <u.h> +#include <libc.h> +#include <fcall.h> +#include <thread.h> +#include <9p.h> + +void +threadlistensrv(Srv *s, char *addr) +{ + if(s->forker == nil) + s->forker = threadsrvforker; + listensrv(s, addr); +} diff --git a/sys/src/lib9p/threadpostmountsrv.c b/sys/src/lib9p/threadpostmountsrv.c new file mode 100644 index 000000000..025459b65 --- /dev/null +++ b/sys/src/lib9p/threadpostmountsrv.c @@ -0,0 +1,13 @@ +#include <u.h> +#include <libc.h> +#include <fcall.h> +#include <thread.h> +#include <9p.h> + +void +threadpostmountsrv(Srv *s, char *name, char *mtpt, int flag) +{ + if(s->forker == nil) + s->forker = threadsrvforker; + postmountsrv(s, name, mtpt, flag); +} diff --git a/sys/src/lib9p/threadpostsharesrv.c b/sys/src/lib9p/threadpostsharesrv.c new file mode 100644 index 000000000..383852c4a --- /dev/null +++ b/sys/src/lib9p/threadpostsharesrv.c @@ -0,0 +1,13 @@ +#include <u.h> +#include <libc.h> +#include <fcall.h> +#include <thread.h> +#include <9p.h> + +void +threadpostsharesrv(Srv *s, char *name, char *mtpt, char *desc) +{ + if(s->forker == nil) + s->forker = threadsrvforker; + postsharesrv(s, name, mtpt, desc); +} diff --git a/sys/src/lib9p/threadpostsrv.c b/sys/src/lib9p/threadpostsrv.c new file mode 100644 index 000000000..abdb882e8 --- /dev/null +++ b/sys/src/lib9p/threadpostsrv.c @@ -0,0 +1,13 @@ +#include <u.h> +#include <libc.h> +#include <fcall.h> +#include <thread.h> +#include <9p.h> + +void +threadpostsrv(Srv *s, char *name) +{ + if(s->forker == nil) + s->forker = threadsrvforker; + postsrv(s, name); +} diff --git a/sys/src/lib9p/threadsrv.c b/sys/src/lib9p/threadsrv.c new file mode 100644 index 000000000..f892f5195 --- /dev/null +++ b/sys/src/lib9p/threadsrv.c @@ -0,0 +1,13 @@ +#include <u.h> +#include <libc.h> +#include <fcall.h> +#include <thread.h> +#include <9p.h> + +void +threadsrv(Srv *s) +{ + if(s->forker == nil) + s->forker = threadsrvforker; + srv(s); +} |