Coda Distributed File System
worker.h
Go to the documentation of this file.
1/* BLURB gpl
2
3 Coda File System
4 Release 8
5
6 Copyright (c) 1987-2021 Carnegie Mellon University
7 Additional copyrights listed below
8
9This code is distributed "AS IS" without warranty of any kind under
10the terms of the GNU General Public Licence Version 2, as shown in the
11file LICENSE. The technical and financial contributors to Coda are
12listed in the file CREDITS.
13
14 Additional copyrights
15 none currently
16
17#*/
18
19/*
20 *
21 * Specification of the Venus Worker subsystem.
22 *
23 */
24
25#ifndef _VENUS_WORKER_H_
26#define _VENUS_WORKER_H_ 1
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
32#include <sys/types.h>
33
34#ifdef __cplusplus
35}
36#endif
37
38/* interfaces */
39#include <vice.h>
40
41/* from util */
42#include <olist.h>
43
44/* from venus */
45#include "fso.h"
46#include "vproc.h"
47
48class msgent;
49class msg_iterator;
50class worker;
51class worker_iterator;
52
53int WorkerCloseMuxfd(void);
54void ReadUpcallMsg(int fd, size_t size);
55
56const int DFLT_MAXWORKERS = 20;
57const int UNSET_MAXWORKERS = -1;
58const int DFLT_MAXPREFETCHERS = 1;
59
60class msgent : public olink {
61 friend msgent *FindMsg(olist &, u_long);
62 friend worker *FindWorker(u_long);
63 friend msgent *AllocMsgent(void);
64 friend void ReadUpcallMsg(int fd, size_t size);
65 friend void DispatchWorker(msgent *);
66 friend int IsAPrefetch(msgent *);
67 friend class worker;
68 friend class vproc;
69 friend int k_Purge();
70 friend int k_Purge(VenusFid *, int);
71 friend int k_Purge(uid_t);
72 friend int k_Replace(VenusFid *, VenusFid *);
73 friend class fsobj;
74
75 char msg_buf[VC_MAXMSGSIZE];
76 int return_fd;
77
78public:
79 msgent();
80 ~msgent();
81
82 static int allocs;
83 static int deallocs;
84};
85
87public:
90};
91
92class worker : public vproc {
93 friend void WorkerInit();
94 friend worker *FindWorker(u_long);
95 friend worker *GetIdleWorker();
96 friend void DispatchWorker(msgent *);
97 friend msgent *AllocMsgent(void);
98 friend void ReadUpcallMsg(int fd, size_t size);
99 friend ssize_t WriteDowncallMsg(int fd, const char *buf, size_t size);
100 friend ssize_t MsgWrite(const char *msg, size_t size);
101 friend void WorkerMux(int fd, void *udata);
102 friend time_t GetWorkerIdleTime();
103 friend void PrintWorkers(int);
104 friend int WorkerCloseMuxfd(void);
105 friend void VFSMount();
106 friend class vproc;
107 friend class fsobj;
108 friend int GetKernelModuleVersion();
109
110 static int muxfd;
111 static int nworkers;
112 static int nprefetchers;
113 static time_t lastresign;
114 static olist FreeMsgs;
115 static olist QueuedMsgs;
116 static olist ActiveMsgs;
117 static int kernel_version;
118
119 unsigned returned : 1;
120 msgent *msg; /* For communication with the kernel */
121 int opcode;
122 VenusFid StoreFid;
123
124 inline void op_coda_access(union inputArgs *in, union outputArgs *out,
125 int *msg_size);
126 inline void op_coda_close(union inputArgs *in, union outputArgs *out,
127 int *msg_size);
128 inline void op_coda_create(union inputArgs *in, union outputArgs *out,
129 int *msg_size);
130 inline void op_coda_fsync(union inputArgs *in, union outputArgs *out,
131 int *msg_size);
132 inline void op_coda_getattr(union inputArgs *in, union outputArgs *out,
133 int *msg_size);
134 inline void op_coda_ioctl(union inputArgs *in, union outputArgs *out,
135 int *msg_size);
136 inline void op_coda_link(union inputArgs *in, union outputArgs *out,
137 int *msg_size);
138 inline void op_coda_lookup(union inputArgs *in, union outputArgs *out,
139 int *msg_size);
140 inline void op_coda_mkdir(union inputArgs *in, union outputArgs *out,
141 int *msg_size);
142 inline void op_coda_open(union inputArgs *in, union outputArgs *out,
143 int *msg_size, CodaFid *saveFid, int *saveFlags);
144 inline void op_coda_open_by_fd(union inputArgs *in, union outputArgs *out,
145 int *msg_size, int *openfd, CodaFid *saveFid,
146 int *saveFlags, struct venus_cnode *vtarget);
147 inline void op_coda_open_by_path(union inputArgs *in, union outputArgs *out,
148 int *msg_size, CodaFid *saveFid,
149 int *saveFlags);
150 inline void op_coda_readlink(union inputArgs *in, union outputArgs *out,
151 int *msg_size);
152 inline void op_coda_remove(union inputArgs *in, union outputArgs *out,
153 int *msg_size);
154 inline void op_coda_rename(union inputArgs *in, union outputArgs *out,
155 int *msg_size);
156 inline void op_coda_rmdir(union inputArgs *in, union outputArgs *out,
157 int *msg_size);
158 inline void op_coda_root(union inputArgs *in, union outputArgs *out,
159 int *msg_size);
160 inline void op_coda_setattr(union inputArgs *in, union outputArgs *out,
161 int *msg_size);
162 inline void op_coda_symlink(union inputArgs *in, union outputArgs *out,
163 int *msg_size);
164 inline void op_coda_vget(union inputArgs *in, union outputArgs *out,
165 int *msg_size);
166 inline void op_coda_statfs(union inputArgs *in, union outputArgs *out,
167 int *msg_size);
168 inline void op_coda_access_intent(union inputArgs *in,
169 union outputArgs *out, int *msg_size);
170
171public:
172 worker();
173 worker(worker &); /* not supported! */
174 int operator=(worker &); /* not supported! */
175 virtual ~worker();
176
178 void Resign(msgent *, int);
179 void Return(msgent *, size_t);
180 void Return(int);
181
182 static int isReady() { return (muxfd != -1); }
183
184protected:
185 virtual void main(void) EXCLUDES_TRANSACTION;
186};
187
189public:
192};
193
194extern int MaxWorkers;
195extern int MaxPrefetchers;
196
197extern msgent *FindMsg(olist &, u_long);
198extern int k_Purge();
199extern int k_Purge(VenusFid *, int = 0);
200extern int k_Purge(uid_t);
201extern int k_Replace(VenusFid *, VenusFid *);
202extern void VFSMount();
203extern void VFSUnmount();
204extern void WorkerInit();
205extern worker *FindWorker(u_long);
206extern worker *GetIdleWorker();
207extern void DispatchWorker(msgent *);
208extern void WorkerMux(int fd, void *udata);
209extern time_t GetWorkerIdleTime(void);
210extern void PrintWorkers();
211extern void PrintWorkers(FILE *);
212extern void PrintWorkers(int);
213extern int GetKernelModuleVersion();
214
215#endif /* _VENUS_WORKER_H_ */
Definition: fso.h:343
Definition: worker.h:86
msgent * operator()()
Definition: worker.cc:171
msg_iterator(olist &)
Definition: worker.cc:166
Definition: worker.h:60
static int deallocs
Definition: worker.h:83
friend int k_Replace(VenusFid *, VenusFid *)
Definition: worker.cc:728
static int allocs
Definition: worker.h:82
friend worker * FindWorker(u_long)
Definition: worker.cc:872
friend msgent * AllocMsgent(void)
Definition: worker.cc:176
friend int k_Purge()
Definition: worker.cc:615
msgent()
Definition: worker.cc:156
friend int IsAPrefetch(msgent *)
Definition: worker.cc:899
friend void ReadUpcallMsg(int fd, size_t size)
Definition: worker.cc:186
friend void DispatchWorker(msgent *)
Definition: worker.cc:910
~msgent()
Definition: worker.cc:161
friend msgent * FindMsg(olist &, u_long)
Definition: worker.cc:143
Definition: olist.h:75
Definition: olist.h:47
Definition: vproc.h:319
Definition: vproc.h:151
Definition: worker.h:188
worker * operator()()
Definition: worker.cc:1790
worker_iterator()
Definition: worker.cc:1785
Definition: worker.h:92
friend int GetKernelModuleVersion()
Definition: worker.cc:1024
static int isReady()
Definition: worker.h:182
void Resign(msgent *, int)
Definition: worker.cc:1108
friend worker * FindWorker(u_long)
Definition: worker.cc:872
friend ssize_t MsgWrite(const char *msg, size_t size)
Definition: worker.cc:240
friend void VFSMount()
Definition: worker.cc:297
friend msgent * AllocMsgent(void)
Definition: worker.cc:176
worker()
Definition: worker.cc:1031
virtual void main(void) EXCLUDES_TRANSACTION
Definition: worker.cc:1629
friend time_t GetWorkerIdleTime()
Definition: worker.cc:990
int operator=(worker &)
Definition: worker.cc:1057
friend void PrintWorkers(int)
Definition: worker.cc:1013
friend int WorkerCloseMuxfd(void)
Definition: worker.cc:855
friend void ReadUpcallMsg(int fd, size_t size)
Definition: worker.cc:186
friend void DispatchWorker(msgent *)
Definition: worker.cc:910
friend void WorkerInit()
Definition: worker.cc:768
virtual ~worker()
Definition: worker.cc:1063
friend ssize_t WriteDowncallMsg(int fd, const char *buf, size_t size)
Definition: worker.cc:220
void AwaitRequest() EXCLUDES_TRANSACTION
Definition: worker.cc:1071
friend worker * GetIdleWorker()
Definition: worker.cc:883
friend void WorkerMux(int fd, void *udata)
Definition: worker.cc:973
void Return(msgent *, size_t)
Definition: worker.cc:1141
#define VC_MAXMSGSIZE
Definition: coda.h:315
#define EXCLUDES_TRANSACTION
Definition: coda_tsa.h:108
Definition: coda.h:201
Definition: venusfid.h:24
Definition: vproc.h:364
Definition: coda.h:722
Definition: coda.h:750
void VFSUnmount()
Definition: worker.cc:534
int MaxPrefetchers
Definition: worker.cc:121
int GetKernelModuleVersion()
Definition: worker.cc:1024
int k_Replace(VenusFid *, VenusFid *)
Definition: worker.cc:728
const int UNSET_MAXWORKERS
Definition: worker.h:57
worker * FindWorker(u_long)
Definition: worker.cc:872
void VFSMount()
Definition: worker.cc:297
void PrintWorkers()
Definition: worker.cc:1002
int k_Purge()
Definition: worker.cc:615
time_t GetWorkerIdleTime(void)
Definition: worker.cc:990
int WorkerCloseMuxfd(void)
Definition: worker.cc:855
int MaxWorkers
Definition: worker.cc:120
void ReadUpcallMsg(int fd, size_t size)
Definition: worker.cc:186
void DispatchWorker(msgent *)
Definition: worker.cc:910
void WorkerInit()
Definition: worker.cc:768
const int DFLT_MAXPREFETCHERS
Definition: worker.h:58
worker * GetIdleWorker()
Definition: worker.cc:883
void WorkerMux(int fd, void *udata)
Definition: worker.cc:973
msgent * FindMsg(olist &, u_long)
Definition: worker.cc:143
const int DFLT_MAXWORKERS
Definition: worker.h:56