]> git.lizzy.rs Git - plan9front.git/commitdiff
lib9p: expose Srv.forker handler and srvforker(), threadsrvforker() and threadsrv...
authorcinap_lenrek <cinap_lenrek@felloff.net>
Sat, 1 May 2021 14:37:00 +0000 (16:37 +0200)
committercinap_lenrek <cinap_lenrek@felloff.net>
Sat, 1 May 2021 14:37:00 +0000 (16:37 +0200)
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.

15 files changed:
sys/include/9p.h
sys/man/2/9p
sys/src/lib9p/listen.c
sys/src/lib9p/mkfile
sys/src/lib9p/mount.c [new file with mode: 0644]
sys/src/lib9p/post.c
sys/src/lib9p/rfork.c
sys/src/lib9p/share.c [new file with mode: 0644]
sys/src/lib9p/srv.c
sys/src/lib9p/thread.c
sys/src/lib9p/threadlistensrv.c [new file with mode: 0644]
sys/src/lib9p/threadpostmountsrv.c [new file with mode: 0644]
sys/src/lib9p/threadpostsharesrv.c [new file with mode: 0644]
sys/src/lib9p/threadpostsrv.c [new file with mode: 0644]
sys/src/lib9p/threadsrv.c [new file with mode: 0644]

index 949476232cb1fae5b109a9471d52565f38b03863..1a51ffeab01b6f7a85ca81cf7867c48a3fcda521 100644 (file)
@@ -235,23 +235,29 @@ struct Srv {
 
        int     spid;   /* pid of srv() caller */
 
+       void    (*forker)(void (*)(void*), void*, int);
        void    (*free)(Srv*);
 };
 
+void           srvforker(void (*)(void*), void*, int);
+void           threadsrvforker(void (*)(void*), void*, int);
+
 void           srv(Srv*);
+void           postsrv(Srv*, char*);
 void           postmountsrv(Srv*, char*, char*, int);
-void           _postmountsrv(Srv*, char*, char*, int);
 void           postsharesrv(Srv*, char*, char*, char*);
-void           _postsharesrv(Srv*, char*, char*, char*);
 void           listensrv(Srv*, char*);
-void           _listensrv(Srv*, char*);
-int            chatty9p;
-void           respond(Req*, char*);
-void           responderror(Req*);
+
+void           threadsrv(Srv*);
+void           threadpostsrv(Srv*, char*);
 void           threadpostmountsrv(Srv*, char*, char*, int);
 void           threadpostsharesrv(Srv*, char*, char*, char*);
 void           threadlistensrv(Srv *s, char *addr);
 
+int            chatty9p;
+void           respond(Req*, char*);
+void           responderror(Req*);
+
 /*
  * Helper.  Assumes user is same as group.
  */
@@ -276,8 +282,6 @@ void                authwrite(Req*);
 void           authdestroy(Fid*);
 int            authattach(Req*);
 
-extern void (*_forker)(void (*)(void*), void*, int);
-
 void           srvacquire(Srv *);
 void           srvrelease(Srv *);
 
index 9a110e2925f472de7ecce9900c35c290ca3bdd27..d68fbaa2c3394b4fe69c48fafce7d266ad4e2cb9 100644 (file)
@@ -9,16 +9,21 @@ estrdup9p,
 listensrv,
 postmountsrv,
 postsharesrv,
+postsrv,
 readbuf,
 readstr,
 respond,
 responderror,
+srv
 srvacquire,
+srvforker,
 srvrelease,
 threadlistensrv,
 threadpostmountsrv,
 threadpostsharesrv,
-srv \- 9P file service
+threadpostsrv,
+threadsrv,
+threadsrvforker - 9P file service
 .SH SYNOPSIS
 .ft L
 .nf
@@ -59,6 +64,8 @@ typedef struct Srv {
        int             infd;
        int             outfd;
        int             srvfd;
+
+       void            (*forker)(void (*fn)(void*), void *arg, int flags);
 } Srv;
 .fi
 .PP
@@ -66,12 +73,17 @@ typedef struct Srv {
 .ft L
 .ta \w'\fLvoid* 'u
 void   srv(Srv *s)
+void   postsrv(Srv *s, char *name);
 void   postmountsrv(Srv *s, char *name, char *mtpt, int flag)
 void   postsharesrv(Srv *s, char *name, char *mtpt, char *desc)
+void   listensrv(Srv *s, char *addr)
+void   threadsrv(Srv *s)
+void   threadpostsrv(Srv *s, char *name);
 void   threadpostmountsrv(Srv *s, char *name, char *mtpt, int flag)
 void   threadpostsharesrv(Srv *s, char *name, char *mtpt, char *desc)
-void   listensrv(Srv *s, char *addr)
 void   threadlistensrv(Srv *s, char *addr)
+void   srvforker(void (*fn)(void*), void *arg, int flags)
+void   threadsrvforker(void (*fn)(void*), void *arg, int flags)
 void   respond(Req *r, char *error)
 void   responderror(Req*)
 void   readstr(Req *r, char *src)
@@ -106,7 +118,9 @@ extern int chatty9p;
 .SH DESCRIPTION
 The function
 .I srv
-serves a 9P session by reading requests from
+and
+.I threadsrv
+serve a 9P session by reading requests from
 .BR s->infd ,
 dispatching them to the function pointers kept in 
 .BR Srv ,
@@ -166,6 +180,19 @@ but abort the program if they run out of memory.
 If alternate behavior is desired, clients can link against
 alternate implementations of these functions.
 .PP
+The functions
+.I srvforker
+and
+.I threadsrvforker
+handle the creation of new processes on a connection which use
+.I rfork
+(see
+.IR fork (2))
+or
+.I procrfork
+(see
+.IR thread (2)).
+.PP
 .I Postmountsrv
 and
 .I threadpostmountsrv
@@ -174,6 +201,14 @@ are wrappers that create a separate process in which to run
 They do the following:
 .IP
 Initialize
+.IB s -> forker
+to eigther
+.I srvforker
+or
+.I threadsrvforker
+unless already initialized to a non-nil value.
+.IP
+Initialize
 .IB s -> infd
 and
 .IB s -> outfd
@@ -187,16 +222,12 @@ If
 is non-nil, post the file descriptor
 .IB s -> srvfd
 under the name
-.BI /srv/ name .
+.BI /srv/ name
+using a call to
+.IR postsrv .
 .IP
 Fork a child process via
-.I rfork
-(see
-.IR fork (2))
-or
-.I procrfork
-(see
-.IR thread (2)),
+.IB s -> forker
 using the
 .BR RFPROC ,
 .BR RFNOWAIT ,
index 89b2f322d1c21f7ed3cadfdd35915a19a2648415..59082f594ebec74c88647367ac1f386abca2452c 100644 (file)
@@ -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);
index 78129109bb0de7559c5bae6f9f0a70d1478debca..6ec968a8806747dee4545d9ea04b4a16b55366c5 100644 (file)
@@ -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 (file)
index 0000000..1adc90b
--- /dev/null
@@ -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);
+}
index ba4265494d0ade85f27b4c98626e00a0106ff187..803d7646dcf6bed1d9268a50ef6e9ab4564d984e 100644 (file)
@@ -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);
-}
index 45bf59365b3309cab7c22650b5df1e89c128e5fd..32621d57ff9ea8bbab82e549b3d9963783a777ce 100644 (file)
@@ -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 (file)
index 0000000..f33d62b
--- /dev/null
@@ -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);
+}
index f3039e01231bfe8ddb2ffd6279d398f43dfe0a25..5e82b5603fc24dfe09a2e342acb6899a7513a3b1 100644 (file)
@@ -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);
 }
index 445791be4cdaf21a65739bcdb87dd0f710dc1211..0e536ba5b19a29d1cb9ed12b1a75fc83ebe1c500 100644 (file)
@@ -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 (file)
index 0000000..65be4e5
--- /dev/null
@@ -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 (file)
index 0000000..025459b
--- /dev/null
@@ -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 (file)
index 0000000..383852c
--- /dev/null
@@ -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 (file)
index 0000000..abdb882
--- /dev/null
@@ -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 (file)
index 0000000..f892f51
--- /dev/null
@@ -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);
+}