Resynchronized client requests with the latest version of TSan's header file
<dynamic_annotations.h>.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11096 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/drd/drd.h b/drd/drd.h
index 971cabb..2d209dc 100644
--- a/drd/drd.h
+++ b/drd/drd.h
@@ -128,6 +128,11 @@
#define ANNOTATE_CONDVAR_SIGNAL(cv) do { } while(0)
/**
+ * Tell DRD that the condition variable at address cv is about to be signaled.
+ */
+#define ANNOTATE_CONDVAR_SIGNAL_ALL(cv) do { } while(0)
+
+/**
* Tell DRD that waiting on condition variable at address cv succeeded and that
* the memory operations performed after this annotation should be considered
* to happen after the matching ANNOTATE_CONDVAR_SIGNAL(cv). Since this is the
@@ -136,6 +141,14 @@
*/
#define ANNOTATE_CONDVAR_WAIT(cv) do { } while(0)
+/**
+ * Tell DRD to consider the memory operations that happened before a mutex
+ * unlock event and after the subsequent mutex lock event on the same mutex as
+ * ordered. This is how DRD always behaves, so this macro has been defined
+ * such that it has no effect.
+ */
+#define ANNOTATE_PURE_HAPPENS_BEFORE_MUTEX(mtx) do { } while(0)
+
/** Deprecated -- don't use this annotation. */
#define ANNOTATE_MUTEX_IS_USED_AS_CONDVAR(mtx) do { } while(0)
@@ -198,6 +211,27 @@
*/
#define ANNOTATE_WRITERLOCK_RELEASED(rwlock) ANNOTATE_RWLOCK_RELEASED(rwlock, 1)
+/*
+ * Report that a barrier has been initialized with a given barrier count. The
+ * third argument specifies whether or not reinitialization is allowed, that
+ * is, whether or not it is allowed to call barrier_init() several times
+ * without calling barrier_destroy().
+ */
+#define ANNOTATE_BARRIER_INIT(barrier, count, reinitialization_allowed) \
+ DRDCL_(annotate_barrier_init)(barrier, count, reinitialization_allowed)
+
+/* Report that a barrier has been destroyed. */
+#define ANNOTATE_BARRIER_DESTROY(barrier) \
+ DRDCL_(annotate_barrier_destroy)(barrier)
+
+/* Report that the calling thread is about to start waiting for a barrier. */
+#define ANNOTATE_BARRIER_WAIT_BEFORE(barrier) \
+ DRDCL_(annotate_barrier_wait_before)(barrier)
+
+/* Report that the calling thread has just finished waiting for a barrier. */
+#define ANNOTATE_BARRIER_WAIT_AFTER(barrier) \
+ DRDCL_(annotate_barrier_wait_after)(barrier)
+
/**
* Tell DRD that a FIFO queue has been created. The abbreviation PCQ stands for
* <em>producer-consumer</em>.
@@ -230,6 +264,11 @@
#define ANNOTATE_BENIGN_RACE(addr, descr) \
DRDCL_(ignore_range)(addr, sizeof(*addr))
+/* Same as ANNOTATE_BENIGN_RACE(address, description), but applies to
+ the memory range [address, address+size). */
+#define ANNOTATE_BENIGN_RACE_SIZED(address, size, description) \
+ DRDCL_(ignore_range)(addr, size)
+
/** Tell DRD to ignore all reads performed by the current thread. */
#define ANNOTATE_IGNORE_READS_BEGIN() DRDCL_(set_record_loads)(0)
@@ -317,6 +356,10 @@
VG_USERREQ__DRD_SET_THREAD_NAME,
/* args: null-terminated character string. */
+ /* Tell DRD that a DRD annotation has not yet been implemented. */
+ VG_USERREQ__DRD_ANNOTATION_UNIMP,
+ /* args: Char*. */
+
/* Tell DRD that a user-defined reader-writer synchronization object
* has been created. */
VG_USERREQ__DRD_ANNOTATE_RWLOCK_CREATE
@@ -338,8 +381,8 @@
= VG_USERREQ_TOOL_BASE('H','G') + 256 + 18,
/* args: Addr, Int is_rw. */
- /* Tell DRD that an annotation has not yet been implemented. */
- VG_USERREQ__DRD_ANNOTATION_UNIMP
+ /* Tell DRD that a Helgrind annotation has not yet been implemented. */
+ VG_USERREQ__HELGRIND_ANNOTATION_UNIMP
= VG_USERREQ_TOOL_BASE('H','G') + 256 + 32,
/* args: Char*. */
@@ -487,4 +530,79 @@
rwlock, is_w, 0, 0, 0);
}
+static __inline__
+void DRDCL_(annotate_barrier_init)(const void* barrier, const unsigned count,
+ const int reinitialization_allowed)
+{
+ int res;
+ VALGRIND_DO_CLIENT_REQUEST(res, 0,
+ VG_USERREQ__DRD_ANNOTATION_UNIMP,
+ "ANNOTATE_BARRIER_INIT", 0, 0, 0, 0);
+}
+
+static __inline__
+void DRDCL_(annotate_barrier_destroy)(const void* barrier)
+{
+ int res;
+ VALGRIND_DO_CLIENT_REQUEST(res, 0,
+ VG_USERREQ__DRD_ANNOTATION_UNIMP,
+ "ANNOTATE_BARRIER_DESTROY", 0, 0, 0, 0);
+}
+
+static __inline__
+void DRDCL_(annotate_barrier_wait_before)(const void* barrier)
+{
+ int res;
+ VALGRIND_DO_CLIENT_REQUEST(res, 0,
+ VG_USERREQ__DRD_ANNOTATION_UNIMP,
+ "ANNOTATE_BARRIER_WAIT_BEFORE", 0, 0, 0, 0);
+}
+
+static __inline__
+void DRDCL_(annotate_barrier_wait_after)(const void* barrier)
+{
+ int res;
+ VALGRIND_DO_CLIENT_REQUEST(res, 0,
+ VG_USERREQ__DRD_ANNOTATION_UNIMP,
+ "ANNOTATE_BARRIER_WAIT_AFTER", 0, 0, 0, 0);
+}
+
+
+/**
+ * @addtogroup RaceDetectionAnnotations
+ */
+/*@{*/
+
+#ifdef __cplusplus
+/* ANNOTATE_UNPROTECTED_READ is the preferred way to annotate racy reads.
+
+ Instead of doing
+ ANNOTATE_IGNORE_READS_BEGIN();
+ ... = x;
+ ANNOTATE_IGNORE_READS_END();
+ one can use
+ ... = ANNOTATE_UNPROTECTED_READ(x); */
+template <typename T>
+inline T ANNOTATE_UNPROTECTED_READ(const volatile T& x) {
+ ANNOTATE_IGNORE_READS_BEGIN();
+ const T result = x;
+ ANNOTATE_IGNORE_READS_END();
+ return result;
+}
+/* Apply ANNOTATE_BENIGN_RACE_SIZED to a static variable. */
+#define ANNOTATE_BENIGN_RACE_STATIC(static_var, description) \
+ namespace { \
+ static class static_var##_annotator \
+ { \
+ public: \
+ static_var##_annotator() \
+ { \
+ ANNOTATE_BENIGN_RACE(&static_var, #static_var ": " description); \
+ } \
+ } the_##static_var##_annotator; \
+ }
+#endif
+
+/*@}*/
+
#endif /* __VALGRIND_DRD_H */
diff --git a/drd/drd_clientreq.c b/drd/drd_clientreq.c
index 9639428..2d53b9d 100644
--- a/drd/drd_clientreq.c
+++ b/drd/drd_clientreq.c
@@ -484,6 +484,21 @@
DRD_(clean_memory)(arg[1], arg[2]);
break;
+ case VG_USERREQ__HELGRIND_ANNOTATION_UNIMP:
+ {
+ /* Note: it is assumed below that the text arg[1] points to is never
+ * freed, e.g. because it points to static data.
+ */
+ UnimpClReqInfo UICR =
+ { DRD_(thread_get_running_tid)(), (Char*)arg[1] };
+ VG_(maybe_record_error)(vg_tid,
+ UnimpHgClReq,
+ VG_(get_IP)(vg_tid),
+ "",
+ &UICR);
+ }
+ break;
+
case VG_USERREQ__DRD_ANNOTATION_UNIMP:
{
/* Note: it is assumed below that the text arg[1] points to is never
@@ -492,7 +507,7 @@
UnimpClReqInfo UICR =
{ DRD_(thread_get_running_tid)(), (Char*)arg[1] };
VG_(maybe_record_error)(vg_tid,
- UnimpClReq,
+ UnimpDrdClReq,
VG_(get_IP)(vg_tid),
"",
&UICR);
diff --git a/drd/drd_error.c b/drd/drd_error.c
index 607c32b..e2fd583 100644
--- a/drd/drd_error.c
+++ b/drd/drd_error.c
@@ -385,7 +385,7 @@
VG_(pp_ExeContext)(VG_(get_error_where)(e));
break;
}
- case UnimpClReq: {
+ case UnimpHgClReq: {
UnimpClReqInfo* uicr =(UnimpClReqInfo*)(VG_(get_error_extra)(e));
VG_(message)(Vg_UserMsg,
"The annotation macro %s has not yet been implemented in"
@@ -394,6 +394,15 @@
VG_(pp_ExeContext)(VG_(get_error_where)(e));
break;
}
+ case UnimpDrdClReq: {
+ UnimpClReqInfo* uicr =(UnimpClReqInfo*)(VG_(get_error_extra)(e));
+ VG_(message)(Vg_UserMsg,
+ "The annotation macro %s has not yet been implemented in"
+ " <valgrind/drd.h>\n",
+ uicr->descr);
+ VG_(pp_ExeContext)(VG_(get_error_where)(e));
+ break;
+ }
default:
VG_(message)(Vg_UserMsg,
"%s\n",
@@ -431,7 +440,9 @@
return sizeof(GenericErrInfo);
case InvalidThreadId:
return sizeof(InvalidThreadIdInfo);
- case UnimpClReq:
+ case UnimpHgClReq:
+ return sizeof(UnimpClReqInfo);
+ case UnimpDrdClReq:
return sizeof(UnimpClReqInfo);
default:
tl_assert(False);
@@ -474,8 +485,10 @@
skind = GenericErr;
else if (VG_(strcmp)(name, STR_InvalidThreadId) == 0)
skind = InvalidThreadId;
- else if (VG_(strcmp)(name, STR_UnimpClReq) == 0)
- skind = UnimpClReq;
+ else if (VG_(strcmp)(name, STR_UnimpHgClReq) == 0)
+ skind = UnimpHgClReq;
+ else if (VG_(strcmp)(name, STR_UnimpDrdClReq) == 0)
+ skind = UnimpDrdClReq;
else
return False;
@@ -522,7 +535,8 @@
case HoldtimeErr: return VGAPPEND(STR_, HoldtimeErr);
case GenericErr: return VGAPPEND(STR_, GenericErr);
case InvalidThreadId: return VGAPPEND(STR_, InvalidThreadId);
- case UnimpClReq: return VGAPPEND(STR_, UnimpClReq);
+ case UnimpHgClReq: return VGAPPEND(STR_, UnimpHgClReq);
+ case UnimpDrdClReq: return VGAPPEND(STR_, UnimpDrdClReq);
default:
tl_assert(0);
}
diff --git a/drd/drd_error.h b/drd/drd_error.h
index 88094a4..88006b8 100644
--- a/drd/drd_error.h
+++ b/drd/drd_error.h
@@ -61,8 +61,10 @@
GenericErr = 11,
#define STR_InvalidThreadId "InvalidThreadId"
InvalidThreadId = 12,
-#define STR_UnimpClReq "UnimpClReq"
- UnimpClReq = 13,
+#define STR_UnimpHgClReq "UnimpHgClReq"
+ UnimpHgClReq = 13,
+#define STR_UnimpDrdClReq "UnimpDrdClReq"
+ UnimpDrdClReq = 14,
} DrdErrorKind;
/* The classification of a faulting address. */