diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/fuse.c | 12 | ||||
-rw-r--r-- | lib/fuse_i.h | 2 | ||||
-rw-r--r-- | lib/fuse_mt.c | 25 |
3 files changed, 29 insertions, 10 deletions
@@ -319,7 +319,11 @@ static void send_reply_raw(struct fuse *f, char *outbuf, size_t outsize) out->error, strerror(-out->error), outsize); fflush(stdout); } - + + pthread_mutex_lock(&f->lock); + f->numavail ++; + pthread_mutex_unlock(&f->lock); + res = write(f->fd, outbuf, outsize); if(res == -1) { /* ENOENT means the operation was interrupted */ @@ -762,6 +766,10 @@ void __fuse_process_cmd(struct fuse *f, struct fuse_cmd *cmd) void *inarg = cmd->buf + sizeof(struct fuse_in_header); size_t argsize; + pthread_mutex_lock(&f->lock); + f->numavail --; + pthread_mutex_unlock(&f->lock); + if((f->flags & FUSE_DEBUG)) { printf("unique: %i, opcode: %i, ino: %li, insize: %i\n", in->unique, in->opcode, in->ino, cmd->buflen); @@ -904,6 +912,8 @@ struct fuse *fuse_new(int fd, int flags) f->ino_table = (struct node **) calloc(1, sizeof(struct node *) * f->ino_table_size); pthread_mutex_init(&f->lock, NULL); + f->numworker = 0; + f->numavail = 0; root = (struct node *) calloc(1, sizeof(struct node)); root->mode = 0; diff --git a/lib/fuse_i.h b/lib/fuse_i.h index 6740608..6e1453e 100644 --- a/lib/fuse_i.h +++ b/lib/fuse_i.h @@ -33,6 +33,8 @@ struct fuse { size_t ino_table_size; fino_t ctr; pthread_mutex_t lock; + int numworker; + int numavail; }; struct fuse_dirhandle { 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); } |