NB: this is an temporary fix, until such time as bug 243935 is fully
resolved.
Add a client request, ANNOTATE_HAPPENS_BEFORE_FORGET_ALL, to notify
Helgrind that it can forget about any h-b edges previously associated
with the specified tag, and release associated resources.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11625 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/helgrind/hg_main.c b/helgrind/hg_main.c
index 74f78fb..a09e18c 100644
--- a/helgrind/hg_main.c
+++ b/helgrind/hg_main.c
@@ -3021,17 +3021,16 @@
}
}
-// If it's ever needed (XXX check before use)
-//static void map_usertag_to_SO_delete ( UWord usertag ) {
-// UWord keyW, valW;
-// map_usertag_to_SO_INIT();
-// if (VG_(delFromFM)( map_usertag_to_SO, &keyW, &valW, usertag )) {
-// SO* so = (SO*)valW;
-// tl_assert(keyW == usertag);
-// tl_assert(so);
-// libhb_so_dealloc(so);
-// }
-//}
+static void map_usertag_to_SO_delete ( UWord usertag ) {
+ UWord keyW, valW;
+ map_usertag_to_SO_INIT();
+ if (VG_(delFromFM)( map_usertag_to_SO, &keyW, &valW, usertag )) {
+ SO* so = (SO*)valW;
+ tl_assert(keyW == usertag);
+ tl_assert(so);
+ libhb_so_dealloc(so);
+ }
+}
static
@@ -3090,6 +3089,21 @@
libhb_so_recv( thr->hbthr, so, True/*strong_recv*/ );
}
+static
+void evh__HG_USERSO_FORGET_ALL ( ThreadId tid, UWord usertag )
+{
+ /* TID declares that any happens-before edges notionally stored in
+ USERTAG can be deleted. If (as would normally be the case) a
+ SO is associated with USERTAG, then the assocation is removed
+ and all resources associated with SO are freed. Importantly,
+ that frees up any VTSs stored in SO. */
+ if (SHOW_EVENTS >= 1)
+ VG_(printf)("evh__HG_USERSO_FORGET_ALL(ctid=%d, usertag=%#lx)\n",
+ (Int)tid, usertag );
+
+ map_usertag_to_SO_delete( usertag );
+}
+
/*--------------------------------------------------------------*/
/*--- Lock acquisition order monitoring ---*/
@@ -4505,6 +4519,11 @@
evh__HG_USERSO_RECV_POST( tid, args[1] );
break;
+ case _VG_USERREQ__HG_USERSO_FORGET_ALL:
+ /* UWord arbitrary-SO-tag */
+ evh__HG_USERSO_FORGET_ALL( tid, args[1] );
+ break;
+
default:
/* Unhandled Helgrind client request! */
tl_assert2(0, "unhandled Helgrind client request 0x%lx",