diff options
Diffstat (limited to 'lib/fuse_loop_mt.c')
-rw-r--r-- | lib/fuse_loop_mt.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/fuse_loop_mt.c b/lib/fuse_loop_mt.c index 82e3001..90fc1e6 100644 --- a/lib/fuse_loop_mt.c +++ b/lib/fuse_loop_mt.c @@ -63,11 +63,30 @@ static void list_del_worker(struct fuse_worker *w) static int fuse_loop_start_thread(struct fuse_mt *mt); +static void thread_exit_handler(int sig) +{ + pthread_exit(0); +} + static void *fuse_do_work(void *data) { struct fuse_worker *w = (struct fuse_worker *) data; struct fuse_mt *mt = w->mt; +#if defined(__ANDROID__) + struct sigaction actions; + memset(&actions, 0, sizeof(actions)); + sigemptyset(&actions.sa_mask); + actions.sa_flags = 0; + actions.sa_handler = thread_exit_handler; + sigaction(SIGUSR1, &actions, NULL); + + sigset_t setusr1; + sigemptyset(&setusr1); + sigaddset(&setusr1, SIGUSR1); + pthread_sigmask(SIG_BLOCK, &setusr1, NULL); +#endif + while (!fuse_session_exited(mt->se)) { int isforget = 0; struct fuse_chan *ch = mt->prevch; @@ -77,9 +96,17 @@ static void *fuse_do_work(void *data) }; int res; +#if defined(__ANDROID__) + pthread_sigmask(SIG_UNBLOCK, &setusr1, NULL); +#else pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); +#endif res = fuse_session_receive_buf(mt->se, &fbuf, &ch); +#if defined(__ANDROID__) + pthread_sigmask(SIG_BLOCK, &setusr1, NULL); +#else pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); +#endif if (res == -EINTR) continue; if (res <= 0) { @@ -243,7 +270,11 @@ int fuse_session_loop_mt(struct fuse_session *se) pthread_mutex_lock(&mt.lock); for (w = mt.main.next; w != &mt.main; w = w->next) +#if defined(__ANDROID__) + pthread_kill(w->thread_id, SIGUSR1); +#else pthread_cancel(w->thread_id); +#endif mt.exit = 1; pthread_mutex_unlock(&mt.lock); |