aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/fuse.c12
-rw-r--r--lib/fuse_i.h2
-rw-r--r--lib/fuse_mt.c25
3 files changed, 29 insertions, 10 deletions
diff --git a/lib/fuse.c b/lib/fuse.c
index 2ed5169..b1b0749 100644
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -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);
}