diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2005-09-14 15:20:26 +0000 |
---|---|---|
committer | Miklos Szeredi <miklos@szeredi.hu> | 2005-09-14 15:20:26 +0000 |
commit | 7e7530d1b1661a0a6f7acc94129d6bf61206c82d (patch) | |
tree | 97961eb2cdf3bd9961e35758440359a8d1ca86bf | |
parent | 644cd6ef226a59bd6560fde3812e5c9159bdebad (diff) |
fix
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | lib/fuse_kern_chan.c | 10 | ||||
-rw-r--r-- | lib/fuse_loop_mt.c | 2 |
3 files changed, 12 insertions, 4 deletions
@@ -1,3 +1,7 @@ +2005-09-14 Miklos Szeredi <miklos@szeredi.hu> + + * Add memory cleanup on thread exit + 2005-09-13 Miklos Szeredi <miklos@szeredi.hu> * Set umask to zero in fusexmp and fusexmp_fh, so that diff --git a/lib/fuse_kern_chan.c b/lib/fuse_kern_chan.c index 577d2e5..7f7d09d 100644 --- a/lib/fuse_kern_chan.c +++ b/lib/fuse_kern_chan.c @@ -17,6 +17,7 @@ static int fuse_kern_chan_receive(struct fuse_chan *ch, char *buf, size_t size) { ssize_t res = read(fuse_chan_fd(ch), buf, size); + int err = errno; struct fuse_session *se = fuse_chan_session(ch); assert(se != NULL); @@ -25,10 +26,10 @@ static int fuse_kern_chan_receive(struct fuse_chan *ch, char *buf, size_t size) if (res == -1) { /* EINTR means, the read() was interrupted, ENOENT means the operation was interrupted */ - if (errno == EINTR || errno == ENOENT) + if (err == EINTR || err == ENOENT) return 0; /* ENODEV means we got unmounted, so we silenty return failure */ - if (errno != ENODEV) + if (err != ENODEV) perror("fuse: reading device"); return -1; } @@ -43,6 +44,7 @@ static int fuse_kern_chan_send(struct fuse_chan *ch, const struct iovec iov[], size_t count) { ssize_t res = writev(fuse_chan_fd(ch), iov, count); + int err = errno; if (res == -1) { struct fuse_session *se = fuse_chan_session(ch); @@ -50,9 +52,9 @@ static int fuse_kern_chan_send(struct fuse_chan *ch, const struct iovec iov[], assert(se != NULL); /* ENOENT means the operation was interrupted */ - if (!fuse_session_exited(se) && errno != ENOENT) + if (!fuse_session_exited(se) && err != ENOENT) perror("fuse: writing device"); - return -errno; + return -err; } return 0; } diff --git a/lib/fuse_loop_mt.c b/lib/fuse_loop_mt.c index 478aae7..c0828f7 100644 --- a/lib/fuse_loop_mt.c +++ b/lib/fuse_loop_mt.c @@ -68,6 +68,7 @@ static void *do_work(void *data) return NULL; } + pthread_cleanup_push(free, buf); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); @@ -99,6 +100,7 @@ static void *do_work(void *data) pthread_mutex_unlock(&w->lock); fuse_session_process(w->se, buf, res, w->ch); } + pthread_cleanup_pop(1); /* Wait for cancellation */ if (!is_mainthread) |