if (!VG_(lookupFM)( map_LockN_to_P, NULL, (Word*)&lkp, (Word)lkn)) {
lkp = HG_(zalloc)( "hg.mLPfLN.2", sizeof(Lock) );
*lkp = *lkn;
- lkp->admin = NULL;
+ lkp->admin_next = NULL;
+ lkp->admin_prev = NULL;
lkp->magic = LockP_MAGIC;
/* Forget about the bag of lock holders - don't copy that.
Also, acquired_at should be NULL whenever heldBy is, and vice
ExeContext* after_ec;
} LockOrder;
struct {
- Thread* thr;
- HChar* errstr; /* persistent, in tool-arena */
+ Thread* thr;
+ HChar* errstr; /* persistent, in tool-arena */
+ HChar* auxstr; /* optional, persistent, in tool-arena */
+ ExeContext* auxctx; /* optional */
} Misc;
} XE;
}
Thread* threadp;
tl_assert(wherep);
tl_assert(thrp);
- threadp = libhb_get_Thr_opaque( thrp );
+ threadp = libhb_get_Thr_hgthread( thrp );
tl_assert(threadp);
xe->XE.Race.h2_ct_accEC = wherep;
xe->XE.Race.h2_ct = threadp;
{
XError xe;
tl_assert( HG_(is_sane_Thread)(thr) );
- if (!HG_(clo_track_lockorders))
- return;
+ tl_assert(HG_(clo_track_lockorders));
init_XError(&xe);
xe.tag = XE_LockOrder;
xe.XE.LockOrder.thr = thr;
XE_PthAPIerror, 0, NULL, &xe );
}
-void HG_(record_error_Misc) ( Thread* thr, HChar* errstr )
+void HG_(record_error_Misc_w_aux) ( Thread* thr, HChar* errstr,
+ HChar* auxstr, ExeContext* auxctx )
{
XError xe;
tl_assert( HG_(is_sane_Thread)(thr) );
xe.tag = XE_Misc;
xe.XE.Misc.thr = thr;
xe.XE.Misc.errstr = string_table_strdup(errstr);
+ xe.XE.Misc.auxstr = auxstr ? string_table_strdup(auxstr) : NULL;
+ xe.XE.Misc.auxctx = auxctx;
// FIXME: tid vs thr
tl_assert( HG_(is_sane_ThreadId)(thr->coretid) );
tl_assert( thr->coretid != VG_INVALID_THREADID );
XE_Misc, 0, NULL, &xe );
}
+void HG_(record_error_Misc) ( Thread* thr, HChar* errstr )
+{
+ HG_(record_error_Misc_w_aux)(thr, errstr, NULL, NULL);
+}
+
Bool HG_(eq_Error) ( VgRes not_used, Error* e1, Error* e2 )
{
XError *xe1, *xe2;
(Int)xe->XE.Misc.thr->errmsg_index );
emit( " </xwhat>\n" );
VG_(pp_ExeContext)( VG_(get_error_where)(err) );
+ if (xe->XE.Misc.auxstr) {
+ emit(" <auxwhat>%s</auxwhat>\n", xe->XE.Misc.auxstr);
+ if (xe->XE.Misc.auxctx)
+ VG_(pp_ExeContext)( xe->XE.Misc.auxctx );
+ }
} else {
(Int)xe->XE.Misc.thr->errmsg_index,
xe->XE.Misc.errstr );
VG_(pp_ExeContext)( VG_(get_error_where)(err) );
+ if (xe->XE.Misc.auxstr) {
+ emit(" %s\n", xe->XE.Misc.auxstr);
+ if (xe->XE.Misc.auxctx)
+ VG_(pp_ExeContext)( xe->XE.Misc.auxctx );
+ }
}
break;