blob: 19cc33cd6eafdb5d5e2d050e79cde3d279160659 [file] [log] [blame]
Miklos Szeredifff56ab2001-11-16 10:12:59 +00001/*
2 FUSE: Filesystem in Userspace
3 Copyright (C) 2001 Miklos Szeredi (mszeredi@inf.bme.hu)
4
5 This program can be distributed under the terms of the GNU GPL.
6 See the file COPYING.
7*/
8
9#include "fuse.h"
10
11#include <stdio.h>
12#include <stdlib.h>
13#include <string.h>
Miklos Szeredifff56ab2001-11-16 10:12:59 +000014#include <pthread.h>
15#include <signal.h>
Miklos Szeredifff56ab2001-11-16 10:12:59 +000016
Miklos Szeredif830a7f2001-11-16 17:46:45 +000017struct fuse_thr_data {
Miklos Szeredifff56ab2001-11-16 10:12:59 +000018 struct fuse *f;
Miklos Szeredif830a7f2001-11-16 17:46:45 +000019 void *data;
20 fuse_processor_t proc;
Miklos Szeredifff56ab2001-11-16 10:12:59 +000021 struct fuse_cmd *cmd;
Miklos Szeredifff56ab2001-11-16 10:12:59 +000022};
23
Miklos Szeredifff56ab2001-11-16 10:12:59 +000024static void *do_work(void *data)
25{
Miklos Szeredif830a7f2001-11-16 17:46:45 +000026 struct fuse_thr_data *d = (struct fuse_thr_data *) data;
27 d->proc(d->f, d->cmd, d->data);
28 free(d);
Miklos Szeredifff56ab2001-11-16 10:12:59 +000029 return NULL;
30}
31
Miklos Szeredif830a7f2001-11-16 17:46:45 +000032static void start_thread(struct fuse_thr_data *d)
Miklos Szeredifff56ab2001-11-16 10:12:59 +000033{
Miklos Szeredifff56ab2001-11-16 10:12:59 +000034 pthread_t thrid;
35 sigset_t oldset;
36 sigset_t newset;
37 int res;
38
Miklos Szeredifff56ab2001-11-16 10:12:59 +000039 /* Disallow signal reception in worker threads */
40 sigfillset(&newset);
Miklos Szeredi680a69a2001-11-16 13:31:14 +000041 pthread_sigmask(SIG_SETMASK, &newset, &oldset);
Miklos Szeredif830a7f2001-11-16 17:46:45 +000042 res = pthread_create(&thrid, NULL, do_work, d);
Miklos Szeredi680a69a2001-11-16 13:31:14 +000043 pthread_sigmask(SIG_SETMASK, &oldset, NULL);
Miklos Szeredifff56ab2001-11-16 10:12:59 +000044 if(res != 0) {
45 fprintf(stderr, "Error creating thread: %s\n", strerror(res));
46 exit(1);
47 }
Miklos Szeredif830a7f2001-11-16 17:46:45 +000048 pthread_detach(thrid);
Miklos Szeredifff56ab2001-11-16 10:12:59 +000049}
50
Miklos Szeredif830a7f2001-11-16 17:46:45 +000051void __fuse_loop_mt(struct fuse *f, fuse_processor_t proc, void *data)
Miklos Szeredifff56ab2001-11-16 10:12:59 +000052{
Miklos Szeredifff56ab2001-11-16 10:12:59 +000053 while(1) {
Miklos Szeredif830a7f2001-11-16 17:46:45 +000054 struct fuse_thr_data *d;
Miklos Szeredifff56ab2001-11-16 10:12:59 +000055 struct fuse_cmd *cmd = __fuse_read_cmd(f);
56 if(cmd == NULL)
57 exit(1);
58
Miklos Szeredif830a7f2001-11-16 17:46:45 +000059 d = malloc(sizeof(struct fuse_thr_data));
60 d->proc = proc;
61 d->f = f;
62 d->cmd = cmd;
63 d->data = data;
64
65 start_thread(d);
Miklos Szeredifff56ab2001-11-16 10:12:59 +000066 }
67}
Miklos Szeredif830a7f2001-11-16 17:46:45 +000068
69void fuse_loop_mt(struct fuse *f)
70{
71 __fuse_loop_mt(f, (fuse_processor_t) __fuse_process_cmd, NULL);
72}