drop locks if a thread crashes
[IRC.git] / Robust / src / Runtime / object.c
index 352637d10e7a019fce3cb936fa3d4e0aea050be1..8cf5ae62652a03e2cbb01a1a91edbd3d3298bd4c 100644 (file)
@@ -29,6 +29,10 @@ int CALL01(___Object______MonitorEnter____, struct ___Object___ * ___this___) {
 #endif
     while(1) {
       if (VAR(___this___)->tid==0) {
+       VAR(___this___)->___prevlockobject___=NULL;
+       VAR(___this___)->___nextlockobject___=(struct ___Object___ *)pthread_getspecific(threadlocks);
+       VAR(___this___)->___nextlockobject___->___prevlockobject___=VAR(___this___);
+       pthread_setspecific(threadlocks, VAR(___this___));
        VAR(___this___)->lockcount=1;
        VAR(___this___)->tid=self;
        pthread_mutex_unlock(&objlock);
@@ -51,8 +55,16 @@ int CALL01(___Object______MonitorExit____, struct ___Object___ * ___this___) {
   pthread_t self=pthread_self();
   if (self==VAR(___this___)->tid) {
     VAR(___this___)->lockcount--;
-    if (VAR(___this___)->lockcount==0)
+    if (VAR(___this___)->lockcount==0) {
+      if (VAR(___this___)->___prevlockobject___==NULL) {
+       pthread_setspecific(threadlocks, VAR(___this___)->___nextlockobject___);
+      } else
+       VAR(___this___)->___prevlockobject___->___nextlockobject___=VAR(___this___)->___nextlockobject___;
+      if (VAR(___this___)->___nextlockobject___!=NULL)
+       VAR(___this___)->___nextlockobject___->___prevlockobject___=VAR(___this___)->___prevlockobject___;
+      VAR(___this___)->lockentry=NULL;
       VAR(___this___)->tid=0;
+    }
     pthread_mutex_lock(&objlock);
     pthread_cond_broadcast(&objcond);
     pthread_mutex_unlock(&objlock);