int fuse_session_loop(struct fuse_session *se) { int res = 0; struct fuse_chan *ch = fuse_session_next_chan(se, NULL); size_t bufsize = fuse_chan_bufsize(ch); char *buf = (char *) malloc(bufsize); if (!buf) { fprintf(stderr, "fuse: failed to allocate read buffer\n"); return -1; } while (!fuse_session_exited(se)) { struct fuse_chan *tmpch = ch; res = fuse_chan_recv(&tmpch, buf, bufsize); if (res == -EINTR) continue; if (res <= 0) break; fuse_session_process(se, buf, res, tmpch); } free(buf); fuse_session_reset(se); return res < 0 ? -1 : 0; }
static void mt_session_exit(void *data, int val) { struct procdata *pd = (struct procdata *) data; if (val) fuse_session_exit(pd->prevse); else fuse_session_reset(pd->prevse); }
/* * Delete a filesystem/file descriptor from the poll set * Must be called with mtx locked */ static void destroy_fs(int i) { VERIFY(pthread_mutex_lock(&sysmtx) == 0); if (fsinfo[i].se) { #ifdef DEBUG fprintf(stderr, "Filesystem %i (%s) is being unmounted\n", i, mountpoints[i]); #endif fuse_session_reset(fsinfo[i].se); fuse_session_destroy(fsinfo[i].se); fsinfo[i].se = NULL; close(fds[i].fd); fds[i].fd = -1; kmem_free(mountpoints[i],fsinfo[i].mntlen+1); } VERIFY(pthread_mutex_unlock(&sysmtx) == 0); }
int fuse_session_loop_mt(struct fuse_session *se) { int err; struct fuse_mt mt; struct fuse_worker *w; memset(&mt, 0, sizeof(struct fuse_mt)); mt.se = se; mt.prevch = fuse_session_next_chan(se, NULL); mt.error = 0; mt.numworker = 0; mt.numavail = 0; mt.main.thread_id = pthread_self(); mt.main.prev = mt.main.next = &mt.main; sem_init(&mt.finish, 0, 0); fuse_mutex_init(&mt.lock); pthread_mutex_lock(&mt.lock); err = fuse_start_thread(&mt); pthread_mutex_unlock(&mt.lock); if (!err) { /* sem_wait() is interruptible */ while (!fuse_session_exited(se)) sem_wait(&mt.finish); for (w = mt.main.next; w != &mt.main; w = w->next) pthread_cancel(w->thread_id); mt.exit = 1; pthread_mutex_unlock(&mt.lock); while (mt.main.next != &mt.main) fuse_join_worker(&mt, mt.main.next); err = mt.error; } pthread_mutex_destroy(&mt.lock); sem_destroy(&mt.finish); fuse_session_reset(se); return err; }
int fuse_session_loop(struct fuse_session *se) { int res = 0; struct fuse_buf fbuf = { .mem = NULL, }; while (!fuse_session_exited(se)) { res = fuse_session_receive_buf_int(se, &fbuf, NULL); if (res == -EINTR) continue; if (res <= 0) break; fuse_session_process_buf_int(se, &fbuf, NULL); } free(fbuf.mem); fuse_session_reset(se); return res < 0 ? -1 : 0; }