--- 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);
}