diff options
Diffstat (limited to 'lib/fuse_mt.c')
-rw-r--r-- | lib/fuse_mt.c | 25 |
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); } |