From 034a7280835e9b66a899f5b36eb0ea5d8ae01a09 Mon Sep 17 00:00:00 2001
From: bdemsky <bdemsky>
Date: Sun, 3 Apr 2011 05:26:46 +0000
Subject: [PATCH] change

---
 Robust/src/Runtime/object.c | 58 +++++++++++++++++++++++++++++++++++++
 1 file changed, 58 insertions(+)

diff --git a/Robust/src/Runtime/object.c b/Robust/src/Runtime/object.c
index 4c3c7a03..14d12050 100644
--- a/Robust/src/Runtime/object.c
+++ b/Robust/src/Runtime/object.c
@@ -69,6 +69,64 @@ int CALL01(___Object______MonitorEnter____, struct ___Object___ * ___this___) {
   }
 #endif
 }
+void CALL01(___Object______notify____, struct ___Object___ * ___this___) {
+  pthread_mutex_lock(&objlock);
+  pthread_cond_broadcast(&objcond);
+  pthread_mutex_unlock(&objlock);
+}
+
+void CALL01(___Object______notifyAll____, struct ___Object___ * ___this___) {
+  pthread_mutex_lock(&objlock);
+  pthread_cond_broadcast(&objcond);
+  pthread_mutex_unlock(&objlock);
+}
+
+void CALL01(___Object______wait____, struct ___Object___ * ___this___) {
+  //release lock
+  int lockcount=VAR(___this___)->lockcount;
+  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;  
+  //lock released
+  //wait
+#ifdef PRECISE_GC
+  stopforgc((struct garbagelist *)___params___);
+#endif
+  pthread_cond_wait(&objcond, &objlock);
+
+  //grab lock
+  pthread_mutex_lock(&objlock);
+#ifdef PRECISE_GC
+  restartaftergc();
+#endif
+  while(1) {
+    if (VAR(___this___)->tid==0) {
+      VAR(___this___)->___prevlockobject___=NULL;
+      VAR(___this___)->___nextlockobject___=(struct ___Object___ *)pthread_getspecific(threadlocks);
+      if (VAR(___this___)->___nextlockobject___!=NULL)
+	VAR(___this___)->___nextlockobject___->___prevlockobject___=VAR(___this___);
+      pthread_setspecific(threadlocks, VAR(___this___));
+      VAR(___this___)->lockcount=lockcount;
+      VAR(___this___)->tid=self;
+      pthread_mutex_unlock(&objlock);
+      break;
+    }
+    {
+#ifdef PRECISE_GC
+      stopforgc((struct garbagelist *)___params___);
+#endif
+      pthread_cond_wait(&objcond, &objlock);
+#ifdef PRECISE_GC
+      restartaftergc();
+#endif
+    }
+  }
+}
 
 int CALL01(___Object______MonitorExit____, struct ___Object___ * ___this___) {
 #ifndef NOLOCK
-- 
2.34.1