make work on mac
authorbdemsky <bdemsky>
Wed, 13 Apr 2011 01:51:41 +0000 (01:51 +0000)
committerbdemsky <bdemsky>
Wed, 13 Apr 2011 01:51:41 +0000 (01:51 +0000)
Robust/src/Runtime/garbage.c
Robust/src/Runtime/runtime.c
Robust/src/Runtime/thread.c
Robust/src/Runtime/thread.h

index 3a121cc3dfe6d3b137405285a03207a850e9844c..ad9ea2c292467c26a77fc834c56b14350b67bddb 100644 (file)
@@ -321,9 +321,11 @@ void enqueuetag(struct ___TagDescriptor___ *ptr) {
 #endif
 
 #if defined(STM)||defined(THREADS)||defined(MLP)
+#ifndef MAC
 __thread char * memorybase=NULL;
 __thread char * memorytop=NULL;
 #endif
+#endif
 
 
 void collect(struct garbagelist * stackptr) {
@@ -378,7 +380,11 @@ void collect(struct garbagelist * stackptr) {
   }
 #endif
 #if defined(STM)||defined(THREADS)||defined(MLP)
+#ifdef MAC
+  *((char **)pthread_getspecific(memorybasekey))=NULL;
+#else
   memorybase=NULL;
+#endif
 #endif
 
   /* Check current stack */
@@ -865,8 +871,12 @@ void stopforgc(struct garbagelist * ptr) {
 #ifndef MAC
   litem.stackptr=ptr;
 #if defined(STM)||defined(THREADS)||defined(MLP)
+#ifdef MAC
+  litem.base=pthread_getspecific(memorybasekey);
+#else
   litem.base=&memorybase;
 #endif
+#endif
 #ifdef STM
   litem.tc_size=c_size;
   litem.tc_table=&c_table;
@@ -913,6 +923,10 @@ void * helper(struct garbagelist *, int);
 void * mygcmalloc(struct garbagelist * stackptr, int size) {
   if ((size&7)!=0)
     size=(size&~7)+8;
+#ifdef MAC
+  char * memorybase=*(char **)pthread_getspecific(memorybasekey);
+  char * memorytop=*(char **)pthread_getspecific(memorytopkey);
+#endif
   if (memorybase==NULL||size>(memorytop-memorybase)) {
     int toallocate=(size>MEMORYBLOCK)?size:MEMORYBLOCK;
     memorybase=helper(stackptr, toallocate);
index 403fa7975bb78df7582b93893af4a89389924396..f2c81b0fb99616f93c0697c34fb32d86638c789c 100644 (file)
@@ -1,4 +1,3 @@
-
 #include "runtime.h"
 #include "structdefs.h"
 #include <signal.h>
@@ -55,10 +54,12 @@ __thread int objcount=0;
 #endif
 
 #if defined(THREADS)||defined(STM)
+#ifndef MAC
 /* Global barrier for STM */
 pthread_barrier_t barrier;
 pthread_barrierattr_t attr;
 #endif
+#endif
 
 #include <string.h>
 
index f475c17e1752d2ec36c401f031d205e2fd92a2f0..ba0d9b53a3e241d827dfa982384aeb05ff402bb9 100644 (file)
@@ -55,6 +55,8 @@ pthread_key_t oidval;
 #ifndef MAC
 extern __thread struct listitem litem;
 #else
+pthread_key_t memorybasekey;
+pthread_key_t memorytopkey;
 pthread_key_t litemkey;
 #endif
 extern struct listitem * list;
@@ -131,6 +133,15 @@ transstart:
   pthread_exit(NULL);
 }
 
+#ifdef MAC
+void threadhandler(int sig) {
+  printf("We just took sig=%d\n",sig);
+  printf("signal\n");
+  printf("To get stack trace, set breakpoint in threadhandler in gdb\n");
+  
+  threadexit();
+}
+#else
 void threadhandler(int sig, struct sigcontext ctx) {
   void *buffer[100];
   char **strings;
@@ -157,6 +168,7 @@ void threadhandler(int sig, struct sigcontext ctx) {
   
   threadexit();
 }
+#endif
 
 #define downpage(x) ((void *)(((INTPTR)x)&~((INTPTR)4095)))
 
@@ -176,7 +188,8 @@ void initializethreads() {
 #ifdef MAC
   pthread_key_create(&macthreadid, NULL);
   pthread_key_create(&threadlocks, NULL);
-  pthread_key_create(&litem, NULL);
+  pthread_key_create(&memorybasekey, NULL);
+  pthread_key_create(&memorytopkey, NULL);
 #endif
   processOptions();
   initializeexithandler();
@@ -249,11 +262,18 @@ void initializethreads() {
 #ifdef MAC
   struct listitem *litem=malloc(sizeof(struct listitem));
   struct lockvector *lvector=malloc(sizeof(struct lockvector));
-  litem->lockvector=lvector;
+  litem->lvector=lvector;
   lvector->index=0;
   pthread_setspecific(threadlocks, lvector);
-  pthread_setspecific(macthreadid, 0);
+  pthread_setspecific(macthreadid, (void *)0);
   pthread_setspecific(litemkey, litem);
+  char ** memorybase=malloc(sizeof(char *));
+  *memorybase=NULL;
+  pthread_setspecific(memorybasekey, memorybase);
+  char ** memorytop=malloc(sizeof(char *));
+  *memorytop=NULL;
+  pthread_setspecific(memorytopkey, memorytop);
+
   litem->prev=NULL;
   litem->next=list;
   if(list!=NULL)
@@ -302,8 +322,12 @@ void initthread(struct ___Thread___ * ___this___) {
   //Add our litem to list of threads
 #ifdef MAC
   struct listitem litem;
-  pthread_setspecific(litemkey, &litem);
   struct lockvector lvector;
+  char * memorybase=NULL;
+  char * memorytop=NULL;
+  pthread_setspecific(litemkey, &litem);
+  pthread_setspecific(memorybasekey, &memorybase);
+  pthread_setspecific(memorytopkey, &memorytop);
   pthread_setspecific(threadlocks, &lvector);
 #endif
   litem.lvector=&lvector;
@@ -311,7 +335,7 @@ void initthread(struct ___Thread___ * ___this___) {
   litem.prev=NULL;
   pthread_mutex_lock(&gclistlock);
 #ifdef MAC
-  pthread_setspecific(macthreadid, ++threadcounter);
+  pthread_setspecific(macthreadid, (void *)((long)(++threadcounter)));
 #else
   mythreadid=++threadcounter;
 #endif
index 45e8a9d6c438181bbc4443e64772bd187198881d..b07ff45b9c9020f5f11b37757633cbd1a74463dd 100644 (file)
@@ -11,6 +11,12 @@ extern pthread_mutex_t objlock;
 extern pthread_cond_t objcond;
 extern pthread_key_t threadlocks;
 extern pthread_mutex_t atomiclock;
+#ifdef MAC
+extern pthread_key_t litemkey;
+extern pthread_key_t macthreadid;
+extern pthread_key_t memorybasekey;
+extern pthread_key_t memorytopkey;
+#endif
 
 #ifdef PRECISE_GC
 #define ATOMICLOCK if (pthread_mutex_trylock(&atomiclock)!=0) {        \