typedef struct Tree Tree;
typedef struct Readdir Readdir;
typedef struct Srv Srv;
+typedef struct Reqqueue Reqqueue;
+typedef struct Queueelem Queueelem;
#pragma incomplete Filelist
#pragma incomplete Readdir
+struct Queueelem
+{
+ Queueelem *prev, *next;
+ void (*f)(Req *);
+};
+
+struct Reqqueue
+{
+ QLock;
+ Rendez;
+ Queueelem;
+ int pid, flush;
+ Req *cur;
+};
+
struct Fid
{
ulong fid;
Fid* afid;
Fid* newfid;
Srv* srv;
+
+ Queueelem qu;
/* below is implementation-specific; don't use */
QLock lk;
void closefile(File*);
File* walkfile(File*, char*);
Readdir* opendirfile(File*);
-long readdirfile(Readdir*, uchar*, long);
+long readdirfile(Readdir*, uchar*, long, long);
void closedirfile(Readdir*);
/*
Tree* tree;
void (*destroyfid)(Fid*);
void (*destroyreq)(Req*);
+ void (*start)(Srv*);
void (*end)(Srv*);
void* aux;
QLock wlock;
char* addr;
+
+ QLock slock;
+ Ref sref; /* srvwork procs */
+ Ref rref; /* requests in flight */
+
+ int spid; /* pid of srv() caller */
+
+ void (*free)(Srv*);
};
void srv(Srv*);
void postmountsrv(Srv*, char*, char*, int);
void _postmountsrv(Srv*, char*, char*, int);
-void postsharesrv(Srv*, char*, char*, char*, char*);
-void _postsharesrv(Srv*, char*, char*, char*, char*);
+void postsharesrv(Srv*, char*, char*, char*);
+void _postsharesrv(Srv*, char*, char*, char*);
void listensrv(Srv*, char*);
void _listensrv(Srv*, char*);
int postfd(char*, int);
-int sharefd(char*, char*, char*, int);
+int sharefd(char*, char*, int);
int chatty9p;
void respond(Req*, char*);
void responderror(Req*);
void threadpostmountsrv(Srv*, char*, char*, int);
+void threadpostsharesrv(Srv*, char*, char*, char*);
void threadlistensrv(Srv *s, char *addr);
/*
extern void (*_forker)(void (*)(void*), void*, int);
+void srvacquire(Srv *);
+void srvrelease(Srv *);
+
+Reqqueue* reqqueuecreate(void);
+void reqqueuepush(Reqqueue*, Req*, void (*)(Req *));
+void reqqueueflush(Reqqueue*, Req*);
+void reqqueuefree(Reqqueue*);