case FKind.FlatBackEdge:
if ((state.THREAD||state.DSM)&&GENERATEPRECISEGC) {
if(state.DSM&&locality.getAtomic(lb).get(fn).intValue()>0) {
- output.println("checkcollect2(&"+localsprefix+",trans);");
+ output.println("if (needtocollect) checkcollect2(&"+localsprefix+",trans);");
} else
- output.println("checkcollect(&"+localsprefix+");");
+ output.println("if (needtocollect) checkcollect(&"+localsprefix+");");
} else
output.println("/* nop */");
return;
#if defined(THREADS)||defined(DSTM)
void checkcollect(void * ptr) {
- if (needtocollect) {
- struct listitem * tmp=stopforgc((struct garbagelist *)ptr);
- pthread_mutex_lock(&gclock); // Wait for GC
- restartaftergc(tmp);
- pthread_mutex_unlock(&gclock);
-
- }
+ struct listitem * tmp=stopforgc((struct garbagelist *)ptr);
+ pthread_mutex_lock(&gclock); // Wait for GC
+ restartaftergc(tmp);
+ pthread_mutex_unlock(&gclock);
}
#ifdef DSTM
void checkcollect2(void * ptr, transrecord_t *trans) {
- if (needtocollect) {
- int ptrarray[]={1, (int)ptr, (int) trans->revertlist};
- struct listitem * tmp=stopforgc((struct garbagelist *)ptrarray);
- pthread_mutex_lock(&gclock); // Wait for GC
- restartaftergc(tmp);
- pthread_mutex_unlock(&gclock);
- trans->revertlist=(struct ___Object___*)ptrarray[2];
- }
+ int ptrarray[]={1, (int)ptr, (int) trans->revertlist};
+ struct listitem * tmp=stopforgc((struct garbagelist *)ptrarray);
+ pthread_mutex_lock(&gclock); // Wait for GC
+ restartaftergc(tmp);
+ pthread_mutex_unlock(&gclock);
+ trans->revertlist=(struct ___Object___*)ptrarray[2];
}
#endif
#endif
#if defined(THREADS)||defined(DSTM)
+extern int needtocollect;
void checkcollect(void * ptr);
struct listitem * stopforgc(struct garbagelist * ptr);
void restartaftergc(struct listitem * litem);