aboutsummaryrefslogtreecommitdiffstats
path: root/lib/fuse_mt.c
diff options
context:
space:
mode:
authorMiklos Szeredi <miklos@szeredi.hu>2001-11-19 17:55:51 +0000
committerMiklos Szeredi <miklos@szeredi.hu>2001-11-19 17:55:51 +0000
commit33232032423dcc06716537204f1995afa5a73940 (patch)
tree2d4a744ada69ab97a0a8bcf8ecfd729a8fc1199f /lib/fuse_mt.c
parentbcb291798ed06af8a18a5bf76aa3c9591a6886de (diff)
downloadlibfuse-33232032423dcc06716537204f1995afa5a73940.tar.gz
multithreading improvements
Diffstat (limited to 'lib/fuse_mt.c')
-rw-r--r--lib/fuse_mt.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/lib/fuse_mt.c b/lib/fuse_mt.c
index 1dc4dcd..d33682c 100644
--- a/lib/fuse_mt.c
+++ b/lib/fuse_mt.c
@@ -6,7 +6,7 @@
See the file COPYING.
*/
-#include "fuse.h"
+#include "fuse_i.h"
#include <stdio.h>
#include <stdlib.h>
@@ -16,7 +16,7 @@
#include <errno.h>
#include <sys/time.h>
-#define FUSE_NUM_WORKERS 5
+#define FUSE_MAX_WORKERS 10
struct fuse_worker {
struct fuse *f;
@@ -24,17 +24,27 @@ struct fuse_worker {
fuse_processor_t proc;
};
+static void start_thread(struct fuse_worker *w);
+
static void *do_work(void *data)
{
struct fuse_worker *w = (struct fuse_worker *) data;
-
+ struct fuse *f = w->f;
+
while(1) {
struct fuse_cmd *cmd = __fuse_read_cmd(w->f);
if(cmd == NULL)
exit(1);
- w->proc(w->f, cmd, w->data);
+ if(f->numavail == 0 && f->numworker < FUSE_MAX_WORKERS) {
+ pthread_mutex_lock(&f->lock);
+ f->numavail ++;
+ f->numworker ++;
+ pthread_mutex_unlock(&f->lock);
+ start_thread(w);
+ }
+ w->proc(w->f, cmd, w->data);
}
return NULL;
@@ -46,7 +56,7 @@ static void start_thread(struct fuse_worker *w)
sigset_t oldset;
sigset_t newset;
int res;
-
+
/* Disallow signal reception in worker threads */
sigfillset(&newset);
pthread_sigmask(SIG_SETMASK, &newset, &oldset);
@@ -62,16 +72,13 @@ static void start_thread(struct fuse_worker *w)
void __fuse_loop_mt(struct fuse *f, fuse_processor_t proc, void *data)
{
struct fuse_worker *w;
- int i;
w = malloc(sizeof(struct fuse_worker));
w->f = f;
w->data = data;
w->proc = proc;
- for(i = 1; i < FUSE_NUM_WORKERS; i++)
- start_thread(w);
-
+ f->numworker = 1;
do_work(w);
}