aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Miklos Szeredi <miklos@szeredi.hu>2001-11-19 09:32:28 +0000
committerGravatar Miklos Szeredi <miklos@szeredi.hu>2001-11-19 09:32:28 +0000
commitbcb291798ed06af8a18a5bf76aa3c9591a6886de (patch)
tree0b99e514cd3460a7d3399c4d41ff666f43c870f5
parent43696434f8fd5cd1107658f329b6922ea947ed1f (diff)
getting close to a final solution for mulithreaded operation
-rw-r--r--lib/fuse_mt.c92
1 files changed, 16 insertions, 76 deletions
diff --git a/lib/fuse_mt.c b/lib/fuse_mt.c
index 6120554..1dc4dcd 100644
--- a/lib/fuse_mt.c
+++ b/lib/fuse_mt.c
@@ -16,56 +16,26 @@
#include <errno.h>
#include <sys/time.h>
-#define FUSE_WORKER_IDLE 10
-
-static pthread_mutex_t fuse_mt_lock = PTHREAD_MUTEX_INITIALIZER;
-
+#define FUSE_NUM_WORKERS 5
struct fuse_worker {
- struct fuse_worker *next;
- struct fuse_worker *prev;
struct fuse *f;
void *data;
fuse_processor_t proc;
- struct fuse_cmd *cmd;
- int avail;
- pthread_cond_t start;
};
static void *do_work(void *data)
{
struct fuse_worker *w = (struct fuse_worker *) data;
- int ret;
- do {
- struct timeval now;
- struct timespec timeout;
-
- w->proc(w->f, w->cmd, w->data);
-
- pthread_mutex_lock(&fuse_mt_lock);
- w->avail = 1;
- w->cmd = NULL;
- gettimeofday(&now, NULL);
- timeout.tv_sec = now.tv_sec + FUSE_WORKER_IDLE;
- timeout.tv_nsec = now.tv_usec * 1000;
-
- ret = 0;
- while(w->cmd == NULL && ret != ETIMEDOUT)
- ret = pthread_cond_timedwait(&w->start, &fuse_mt_lock, &timeout);
+ while(1) {
+ struct fuse_cmd *cmd = __fuse_read_cmd(w->f);
+ if(cmd == NULL)
+ exit(1);
- if(ret == ETIMEDOUT) {
- struct fuse_worker *next = w->next;
- struct fuse_worker *prev = w->prev;
- prev->next = next;
- next->prev = prev;
- pthread_cond_destroy(&w->start);
- free(w);
- }
- w->avail = 0;
- pthread_mutex_unlock(&fuse_mt_lock);
+ w->proc(w->f, cmd, w->data);
- } while(ret != ETIMEDOUT);
+ }
return NULL;
}
@@ -91,48 +61,18 @@ static void start_thread(struct fuse_worker *w)
void __fuse_loop_mt(struct fuse *f, fuse_processor_t proc, void *data)
{
- struct fuse_worker *head;
+ struct fuse_worker *w;
+ int i;
- head = malloc(sizeof(struct fuse_worker));
- head->next = head;
- head->prev = head;
+ w = malloc(sizeof(struct fuse_worker));
+ w->f = f;
+ w->data = data;
+ w->proc = proc;
- while(1) {
- struct fuse_worker *w;
- struct fuse_cmd *cmd = __fuse_read_cmd(f);
- if(cmd == NULL)
- exit(1);
+ for(i = 1; i < FUSE_NUM_WORKERS; i++)
+ start_thread(w);
- pthread_mutex_lock(&fuse_mt_lock);
- for(w = head->next; w != head; w = w->next)
- if(w->avail)
- break;
-
- if(w != head) {
- pthread_cond_signal(&w->start);
- w->cmd = cmd;
- w = NULL;
- }
- else {
- struct fuse_worker *prev = head->prev;
- struct fuse_worker *next = head;
- w = malloc(sizeof(struct fuse_worker));
- w->prev = prev;
- w->next = next;
- next->prev = w;
- prev->next = w;
- w->f = f;
- w->data = data;
- w->proc = proc;
- w->cmd = cmd;
- w->avail = 0;
- pthread_cond_init(&w->start, NULL);
- }
- pthread_mutex_unlock(&fuse_mt_lock);
-
- if(w != NULL)
- start_thread(w);
- }
+ do_work(w);
}
void fuse_loop_mt(struct fuse *f)