fix
authorMiklos Szeredi <miklos@szeredi.hu>
Wed, 14 Sep 2005 15:20:26 +0000 (15:20 +0000)
committerMiklos Szeredi <miklos@szeredi.hu>
Wed, 14 Sep 2005 15:20:26 +0000 (15:20 +0000)
ChangeLog
lib/fuse_kern_chan.c
lib/fuse_loop_mt.c

index 601790d8cb5b4e0488d1823f999afeebb29de2a4..b648503c509b20cee527a83c25cd65e0141d6225 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
index 577d2e53499d28ebd6619cf1c9a67a9ad198b0fb..7f7d09d342bc6b4fee820d5d2d965580fcf0112f 100644 (file)
@@ -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;
 }
index 478aae70a682406a6d81eb78a3f2f2c79ddb595b..c0828f761c7a72dcbcc3ea8cde158f389394dc47 100644 (file)
@@ -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)