#ifdef THREADS
#include "thread.h"
+#endif
+#ifndef MULTICORE
+#include "mlp_lock.h"
+#endif
+
+#ifndef MAC
+__thread struct lockvector lvector;
+__thread int mythreadid;
+#else
+
#endif
#ifdef D___Object______nativehashCode____
}
#endif
+#ifdef D___Object______getType____
int CALL01(___Object______getType____, struct ___Object___ * ___this___) {
return ((int *)VAR(___this___))[0];
}
+#endif
#ifdef THREADS
-int CALL01(___Object______MonitorEnter____, struct ___Object___ * ___this___) {
-#ifndef NOLOCK
- pthread_t self=pthread_self();
+#ifdef D___Object______MonitorEnter____
+void CALL01(___Object______MonitorEnter____, struct ___Object___ * ___this___) {
+#ifdef MAC
+ struct lockvector *lptr=(struct lockvector *)pthread_getspecific(threadlocks);
+ int self=(int)(long)pthread_getspecific(macthreadid);
+#else
+ struct lockvector *lptr=&lvector;
+ int self=mythreadid;
+#endif
+ struct lockpair *lpair=&lptr->locks[lptr->index++];
+ lpair->object=VAR(___this___);
+
if (self==VAR(___this___)->tid) {
- VAR(___this___)->lockcount++;
+ lpair->islastlock=0;
} else {
-#ifdef PRECISE_GC
- stopforgc((struct garbagelist *)___params___);
-#endif
- pthread_mutex_lock(&objlock);
-#ifdef PRECISE_GC
- restartaftergc();
-#endif
+ lpair->islastlock=1;
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=1;
- VAR(___this___)->tid=self;
- pthread_mutex_unlock(&objlock);
- break;
+ if (CAS32(&VAR(___this___)->tid, 0, self)==0) {
+ return;
+ }
}
{
#ifdef PRECISE_GC
- stopforgc((struct garbagelist *)___params___);
-#endif
- pthread_cond_wait(&objcond, &objlock);
-#ifdef PRECISE_GC
- restartaftergc();
+ if (unlikely(needtocollect))
+ checkcollect((struct garbagelist *)___params___);
#endif
}
}
}
-#endif
}
+#endif
+
+
+#ifdef D___Object______notify____
void CALL01(___Object______notify____, struct ___Object___ * ___this___) {
- pthread_mutex_lock(&objlock);
- pthread_cond_broadcast(&objcond);
- pthread_mutex_unlock(&objlock);
+ VAR(___this___)->notifycount++;
}
+#endif
+#ifdef D___Object______notifyAll____
void CALL01(___Object______notifyAll____, struct ___Object___ * ___this___) {
- pthread_mutex_lock(&objlock);
- pthread_cond_broadcast(&objcond);
- pthread_mutex_unlock(&objlock);
+ VAR(___this___)->notifycount++;
}
+#endif
+#ifdef D___Object______wait____
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 MAC
+ int self=(int)(long)pthread_getspecific(macthreadid);
+#else
+ int self=mythreadid;
+#endif
+ int notifycount=VAR(___this___)->notifycount;
+ BARRIER();
+ VAR(___this___)->tid=0;
+ BARRIER();
+
+ while(notifycount==VAR(___this___)->notifycount) {
#ifdef PRECISE_GC
- stopforgc((struct garbagelist *)___params___);
+ if (unlikely(needtocollect))
+ checkcollect((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;
+ if (CAS32(&VAR(___this___)->tid, 0, self)==0) {
+ BARRIER();
+ return;
+ }
}
- {
-#ifdef PRECISE_GC
- stopforgc((struct garbagelist *)___params___);
-#endif
- pthread_cond_wait(&objcond, &objlock);
#ifdef PRECISE_GC
- restartaftergc();
+ if (unlikely(needtocollect))
+ checkcollect((struct garbagelist *)___params___);
#endif
- }
}
}
+#endif
-int CALL01(___Object______MonitorExit____, struct ___Object___ * ___this___) {
-#ifndef NOLOCK
- pthread_t self=pthread_self();
- if (self==VAR(___this___)->tid) {
- VAR(___this___)->lockcount--;
- 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);
- } else {
-#ifdef MULTICORE
- BAMBOO_EXIT(0xf201);
+#ifdef D___Object______MonitorExit____
+void CALL01(___Object______MonitorExit____, struct ___Object___ * ___this___) {
+#ifdef MAC
+ struct lockvector *lptr=(struct lockvector *)pthread_getspecific(threadlocks);
#else
- printf("ERROR...UNLOCKING LOCK WE DON'T HAVE\n");
- exit(-1);
+ struct lockvector *lptr=&lvector;
#endif
+ struct lockpair *lpair=&lptr->locks[--lptr->index];
+
+ if (lpair->islastlock) {
+ MBARRIER();
+ lpair->object->tid=0;
}
-#endif
}
#endif
+#endif