Added support for detecting locks that have been held too long.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@8079 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/exp-drd/drd_error.c b/exp-drd/drd_error.c
index 5e92917..bb198a1 100644
--- a/exp-drd/drd_error.c
+++ b/exp-drd/drd_error.c
@@ -217,6 +217,21 @@
     VG_(pp_ExeContext)(VG_(get_error_where)(e));
     break;
   }
+  case HoldtimeErr: {
+    HoldtimeErrInfo* p =(HoldtimeErrInfo*)(VG_(get_error_extra)(e));
+    tl_assert(p);
+    tl_assert(p->acquired_at);
+    VG_(message)(Vg_UserMsg, "Acquired at:");
+    VG_(pp_ExeContext)(p->acquired_at);
+    VG_(message)(Vg_UserMsg,
+                 "Lock on %s 0x%lx was held during %d ms (threshold: %d ms).",
+                 VG_(get_error_string)(e),
+                 p->synchronization_object,
+                 p->hold_time_ms,
+                 p->threshold_ms);
+    VG_(pp_ExeContext)(VG_(get_error_where)(e));
+    break;
+  }
   case GenericErr: {
     //GenericErrInfo* gei =(GenericErrInfo*)(VG_(get_error_extra)(e));
     VG_(message)(Vg_UserMsg, "%s", VG_(get_error_string)(e));
@@ -252,6 +267,8 @@
     return sizeof(BarrierErrInfo);
   case RwlockErr:
     return sizeof(RwlockErrInfo);
+  case HoldtimeErr:
+    return sizeof(HoldtimeErrInfo);
   case GenericErr:
     return sizeof(GenericErrInfo);
   default:
@@ -280,6 +297,8 @@
     ;
   else if (VG_(strcmp)(name, STR_RwlockErr) == 0)
     ;
+  else if (VG_(strcmp)(name, STR_HoldtimeErr) == 0)
+    ;
   else if (VG_(strcmp)(name, STR_GenericErr) == 0)
     ;
   else
@@ -314,6 +333,7 @@
   case SemaphoreErr: return VGAPPEND(STR_, SemaphoreErr);
   case BarrierErr:   return VGAPPEND(STR_, BarrierErr);
   case RwlockErr:    return VGAPPEND(STR_, RwlockErr);
+  case HoldtimeErr:  return VGAPPEND(STR_, HoldtimeErr);
   case GenericErr:   return VGAPPEND(STR_, GenericErr);
   default:
     tl_assert(0);