[pypy-commit] stmgc c8-overheads-instrumentation: Fix some timings that could be lost when aborting by publishing and resetting timer eagerly

tobweber pypy.commits at gmail.com
Mon Jul 17 05:22:50 EDT 2017


Author: Tobias Weber <tobias_weber89 at gmx.de>
Branch: c8-overheads-instrumentation
Changeset: r2111:364f9fb71d3e
Date: 2017-07-14 17:43 +0200
http://bitbucket.org/pypy/stmgc/changeset/364f9fb71d3e/

Log:	Fix some timings that could be lost when aborting by publishing and
	resetting timer eagerly

diff --git a/c8/stm/core.c b/c8/stm/core.c
--- a/c8/stm/core.c
+++ b/c8/stm/core.c
@@ -468,8 +468,8 @@
 #endif
 
     if (STM_PSEGMENT->last_commit_log_entry->next == INEV_RUNNING) {
-        pause_timer();
-        wait_for_inevitable(); // TODO may abort!! timing event lost
+        stop_timer_and_publish(STM_DURATION_VALIDATION);
+        wait_for_inevitable();
         continue_timer();
         goto retry_from_start;   /* redo _stm_validate() now */
     }
@@ -559,14 +559,13 @@
         OPT_ASSERT(yes);
 
         release_modification_lock_wr(STM_SEGMENT->segment_num);
+
+        stop_timer_and_publish(STM_DURATION_VALIDATION);
     }
     else {
-        pause_timer();
+        stop_timer_and_publish(STM_DURATION_VALIDATION);
         _validate_and_attach(new);
-        continue_timer();
     }
-
-    stop_timer_and_publish(STM_DURATION_VALIDATION);
 }
 
 /* ############# STM ############# */
@@ -1330,7 +1329,9 @@
        if there is an inevitable tx running) */
     bool was_inev = STM_PSEGMENT->transaction_state == TS_INEVITABLE;
 
-    pause_timer();
+    // publish here because the validation may abort
+    stop_timer_and_publish_for_thread(
+        thread_local_for_logging, STM_DURATION_COMMIT_EXCEPT_GC);
     _validate_and_add_to_commit_log();
     continue_timer();
 
@@ -1671,9 +1672,9 @@
             signal_commit_to_inevitable_transaction();
 
             s_mutex_lock();
-            if (any_soon_finished_or_inevitable_thread_segment() &&
-                    !safe_point_requested() &&
-                    num_waits <= NB_SEGMENTS) {
+            if (any_soon_finished_or_inevitable_thread_segment()
+                && !safe_point_requested()
+                && num_waits <= NB_SEGMENTS) {
 
                 /* wait until C_SEGMENT_FREE_OR_SAFE_POINT_REQ is signalled */
                 EMIT_WAIT(STM_WAIT_OTHER_INEVITABLE);
diff --git a/c8/stm/timing.h b/c8/stm/timing.h
--- a/c8/stm/timing.h
+++ b/c8/stm/timing.h
@@ -27,6 +27,8 @@
 #define pause_timer() clock_gettime(CLOCK_MONOTONIC_RAW, &stop);            \
                       get_duration()
 
+#define reset_timer() duration.tv_sec = 0; duration.tv_nsec = 0;
+
 #define stm_duration_payload(duration_data)                                 \
     stm_timing_event_payload_data_t stm_duration_data =                     \
         { .duration = &(duration_data) };                                   \
@@ -42,7 +44,8 @@
     pause_timer()                                                           \
     stm_duration_payload(duration)                                          \
     assert((thread_local) != NULL);                                         \
-    publish_event((thread_local), (event))
+    publish_event((thread_local), (event))                                  \
+    reset_timer()
 
 #define stop_timer_and_publish(event)                                       \
     stop_timer_and_publish_for_thread(STM_SEGMENT->running_thread, (event))


More information about the pypy-commit mailing list