Helgrind marker appended draft default tip
authorHajime Tazaki <tazaki@nict.go.jp>
Mon, 18 Feb 2013 10:14:36 +0900
changeset 654 bb740d2bb941
parent 653 5cb8918ff4cf
Helgrind marker appended
futex.c
get-valgrind-cflags.py
--- a/futex.c	Thu Feb 14 15:43:02 2013 +0900
+++ b/futex.c	Mon Feb 18 10:14:36 2013 +0900
@@ -2,11 +2,66 @@
 #include "machine.h"
 #include "system.h"
 #include "vdl-alloc.h"
+#include "vdl-log.h"
+
+#ifdef HAVE_VALGRIND_H
+#include <valgrind/helgrind.h>
+#elif VALGRIND_3_6_1          /* in case of valgrind 3.6.1 */
+#define VGO_linux
+#define VGA_x86
+#include <valgrind/pub_tool_basics.h>
+#define DO_CREQ_v_W(_creqF, _ty1F,_arg1F)       \
+  do {                                          \
+    Word _unused_res, _arg1;                    \
+    _arg1 = (Word)(_arg1F);                     \
+    VALGRIND_DO_CLIENT_REQUEST(_unused_res, 0,  \
+                               (_creqF),        \
+                               _arg1, 0,0,0,0); \
+  } while (0)
+
+#define DO_CREQ_v_WW(_creqF, _ty1F,_arg1F, _ty2F,_arg2F)        \
+  do {                                                          \
+    Word _unused_res, _arg1, _arg2;                             \
+    _arg1 = (Word)(_arg1F);                                     \
+    _arg2 = (Word)(_arg2F);                                     \
+    VALGRIND_DO_CLIENT_REQUEST(_unused_res, 0,                  \
+                               (_creqF),                        \
+                               _arg1,_arg2,0,0,0);              \
+  } while (0)
+
+#define VALGRIND_HG_MUTEX_INIT_POST(futex)                              \
+  DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_MUTEX_INIT_POST,                 \
+               struct Futex*,futex, long,0); /* non-recursive mutex */
+
+#define VALGRIND_HG_MUTEX_LOCK_PRE(futex)                       \
+  DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_PRE,          \
+               struct Futex *, futex, long, 0/*!isTryLock*/);
+
+#define VALGRIND_HG_MUTEX_LOCK_POST(futex)              \
+  DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_POST,  \
+              struct Futex *, futex);
+
+#define VALGRIND_HG_MUTEX_UNLOCK_PRE(futex)             \
+  DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_MUTEX_UNLOCK_PRE, \
+              struct Futex *, futex);
+
+#define VALGRIND_HG_MUTEX_UNLOCK_POST(futex)                    \
+  DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_MUTEX_UNLOCK_POST,        \
+              struct Futex *, futex);
+
+#else
+#define VALGRIND_HG_MUTEX_INIT_POST(x)
+#define VALGRIND_HG_MUTEX_LOCK_PRE(x)
+#define VALGRIND_HG_MUTEX_LOCK_POST(x) 
+#define VALGRIND_HG_MUTEX_UNLOCK_PRE(x)
+#define VALGRIND_HG_MUTEX_UNLOCK_POST(x)
+#endif
 
 struct Futex *futex_new (void)
 {
   struct Futex *futex = vdl_alloc_new (struct Futex);
   futex_construct (futex);
+  VALGRIND_HG_MUTEX_INIT_POST (futex, 0);
   return futex;
 }
 void futex_delete (struct Futex *futex)
@@ -26,6 +81,7 @@
 void futex_lock (struct Futex *futex)
 {
   uint32_t c;
+  VALGRIND_HG_MUTEX_LOCK_PRE (futex, 1);
   if ((c = machine_atomic_compare_and_exchange (&futex->state, 0, 1)) != 0)
     {
       do {
@@ -35,13 +91,18 @@
 	  }
       } while ((c = machine_atomic_compare_and_exchange (&futex->state, 0, 2)) != 0);
     }
+  VALGRIND_HG_MUTEX_LOCK_POST (futex);
 }
 
 void futex_unlock (struct Futex *futex)
 {
-  if (machine_atomic_dec (&futex->state) != 1) 
+  VALGRIND_HG_MUTEX_UNLOCK_PRE (futex);
+  uint32_t c;
+  if ((c = machine_atomic_dec (&futex->state)) != 1) 
     {
+      //machine_atomic_compare_and_exchange (&futex->state, c + 1 , 0);
       futex->state = 0;
       system_futex_wake (&futex->state, 1);
     }
+  VALGRIND_HG_MUTEX_UNLOCK_POST (futex);
 }
--- a/get-valgrind-cflags.py	Thu Feb 14 15:43:02 2013 +0900
+++ b/get-valgrind-cflags.py	Mon Feb 18 10:14:36 2013 +0900
@@ -2,5 +2,5 @@
 
 import os
 
-if os.path.exists ('/usr/include/valgrind/valgrind.h'):
+if os.path.exists ('/usr/local/include/valgrind/valgrind.h'):
     print '-DHAVE_VALGRIND_H -I/usr/include'