[pypy-commit] pypy vmprof-review: More care about write errors

arigo noreply at buildbot.pypy.org
Tue Aug 4 11:33:18 CEST 2015


Author: Armin Rigo <arigo at tunes.org>
Branch: vmprof-review
Changeset: r78756:bf237a263451
Date: 2015-08-04 11:33 +0200
http://bitbucket.org/pypy/pypy/changeset/bf237a263451/

Log:	More care about write errors

diff --git a/rpython/rlib/rvmprof/src/rvmprof.c b/rpython/rlib/rvmprof/src/rvmprof.c
--- a/rpython/rlib/rvmprof/src/rvmprof.c
+++ b/rpython/rlib/rvmprof/src/rvmprof.c
@@ -303,7 +303,8 @@
         return -1;
     if (remove_sigprof_handler() == -1)
         return -1;
-    shutdown_concurrent_bufs(profile_file);
+    if (shutdown_concurrent_bufs(profile_file) < 0)
+        return -1;
     return close_profile();
 }
 
diff --git a/rpython/rlib/rvmprof/src/rvmprof_mt.h b/rpython/rlib/rvmprof/src/rvmprof_mt.h
--- a/rpython/rlib/rvmprof/src/rvmprof_mt.h
+++ b/rpython/rlib/rvmprof/src/rvmprof_mt.h
@@ -28,6 +28,7 @@
 static char volatile profbuf_state[MAX_NUM_BUFFERS];
 static struct profbuf_s *profbuf_all_buffers = NULL;
 static int volatile profbuf_write_lock = 2;
+static long profbuf_pending_write;
 
 
 static int prepare_concurrent_bufs(void)
@@ -48,20 +49,34 @@
     }
     memset((char *)profbuf_state, PROFBUF_UNUSED, sizeof(profbuf_state));
     profbuf_write_lock = 0;
+    profbuf_pending_write = -1;
     return 0;
 }
 
-static void _write_single_ready_buffer(int fd, long i)
+static int _write_single_ready_buffer(int fd, long i)
 {
+    int err;
+    if (profbuf_pending_write >= 0 && profbuf_pending_write != i) {
+        err = _write_single_ready_buffer(fd, profbuf_pending_write);
+        if (err < 0 || profbuf_pending_write >= 0)
+            return err;
+    }
     struct profbuf_s *p = &profbuf_all_buffers[i];
     ssize_t count = write(fd, p->data + p->data_offset, p->data_size);
     if (count == p->data_size) {
         profbuf_state[i] = PROFBUF_UNUSED;
+        profbuf_pending_write = -1;
     }
-    else if (count > 0) {
-        p->data_offset += count;
-        p->data_size -= count;
+    else {
+        if (count > 0) {
+            p->data_offset += count;
+            p->data_size -= count;
+        }
+        profbuf_pending_write = i;
+        if (count < 0)
+            return -1;
     }
+    return 0;
 }
 
 static void _write_ready_buffers(int fd)
@@ -76,7 +91,8 @@
                     return;   /* can't acquire the write lock, give up */
                 has_write_lock = 1;
             }
-            _write_single_ready_buffer(fd, i);
+            if (_write_single_ready_buffer(fd, i) < 0)
+                break;
         }
     }
     if (has_write_lock)
@@ -137,7 +153,7 @@
     }
 }
 
-static void shutdown_concurrent_bufs(int fd)
+static int shutdown_concurrent_bufs(int fd)
 {
  retry:
     usleep(1);
@@ -150,7 +166,9 @@
     int i;
     for (i = 0; i < MAX_NUM_BUFFERS; i++) {
         if (profbuf_state[i] == PROFBUF_READY) {
-            _write_single_ready_buffer(fd, i);
+            if (_write_single_ready_buffer(fd, i) < 0)
+                return -1;
         }
     }
+    return 0;
 }


More information about the pypy-commit mailing list