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
This commit is contained in:
Julian Seward 2011-03-11 19:10:48 +00:00
parent 3cc6fcac8c
commit 159af3e3ee
2 changed files with 47 additions and 12 deletions

View File

@ -108,7 +108,7 @@ typedef
_VG_USERREQ__HG_CLIENTREQ_UNIMP, /* char* */
_VG_USERREQ__HG_USERSO_SEND_PRE, /* arbitrary UWord SO-tag */
_VG_USERREQ__HG_USERSO_RECV_POST, /* arbitrary UWord SO-tag */
_VG_USERREQ__HG_RESERVED1, /* Do not use */
_VG_USERREQ__HG_USERSO_FORGET_ALL, /* arbitrary UWord SO-tag */
_VG_USERREQ__HG_RESERVED2, /* Do not use */
_VG_USERREQ__HG_RESERVED3, /* Do not use */
_VG_USERREQ__HG_RESERVED4, /* Do not use */
@ -458,6 +458,20 @@ typedef
See also, extensive discussion on semantics of this in
https://bugs.kde.org/show_bug.cgi?id=243935
ANNOTATE_HAPPENS_BEFORE_FORGET_ALL(obj) is interim until such time
as bug 243935 is fully resolved. It instructs Helgrind to forget
about any ANNOTATE_HAPPENS_BEFORE calls on the specified object, in
effect putting it back in its original state. Once in that state,
a use of ANNOTATE_HAPPENS_AFTER on it has no effect on the calling
thread.
An implementation may optionally release resources it has
associated with 'obj' when ANNOTATE_HAPPENS_BEFORE_FORGET_ALL(obj)
happens. Users are recommended to use
ANNOTATE_HAPPENS_BEFORE_FORGET_ALL to indicate when a
synchronisation object is no longer needed, so as to avoid
potential indefinite resource leaks.
----------------------------------------------------------------
*/
#define ANNOTATE_HAPPENS_BEFORE(obj) \
@ -466,6 +480,8 @@ typedef
#define ANNOTATE_HAPPENS_AFTER(obj) \
DO_CREQ_v_W(_VG_USERREQ__HG_USERSO_RECV_POST, void*,(obj))
#define ANNOTATE_HAPPENS_BEFORE_FORGET_ALL(obj) \
DO_CREQ_v_W(_VG_USERREQ__HG_USERSO_FORGET_ALL, void*,(obj))
/* ----------------------------------------------------------------
Memory publishing. The TSan sources say:

View File

@ -3021,17 +3021,16 @@ static SO* map_usertag_to_SO_lookup_or_alloc ( UWord usertag ) {
}
}
// 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 @@ void evh__HG_USERSO_RECV_POST ( ThreadId tid, UWord usertag )
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 @@ Bool hg_handle_client_request ( ThreadId tid, UWord* args, UWord* ret)
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",