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",