From 0e142443b2d110e0f3f1b33b6b5f0314dd2965dc Mon Sep 17 00:00:00 2001 From: bdemsky Date: Tue, 13 Oct 2009 01:14:13 +0000 Subject: [PATCH] changes --- Robust/src/Runtime/DSTM/interface/trans.c | 2 +- Robust/src/Runtime/STM/commit.c | 3 ++ Robust/src/Runtime/STM/delaycomp.h | 6 ++-- Robust/src/Runtime/STM/sandbox.c | 41 ++++++++++++++++++++--- Robust/src/Runtime/STM/stm.c | 16 +++++++++ Robust/src/Runtime/STM/tm.h | 1 + Robust/src/Runtime/thread.c | 41 +++++++++++++++++++++-- 7 files changed, 99 insertions(+), 11 deletions(-) diff --git a/Robust/src/Runtime/DSTM/interface/trans.c b/Robust/src/Runtime/DSTM/interface/trans.c index 81cd2081..4ba7c47c 100644 --- a/Robust/src/Runtime/DSTM/interface/trans.c +++ b/Robust/src/Runtime/DSTM/interface/trans.c @@ -287,7 +287,7 @@ inline int findmax(int *array, int arraylength) { return max; } -//#define INLINEPREFETCH +#define INLINEPREFETCH #define PREFTHRESHOLD 4 /* This function is a prefetch call generated by the compiler that diff --git a/Robust/src/Runtime/STM/commit.c b/Robust/src/Runtime/STM/commit.c index b4500520..b05d63c6 100644 --- a/Robust/src/Runtime/STM/commit.c +++ b/Robust/src/Runtime/STM/commit.c @@ -1,4 +1,7 @@ #include +#ifdef DELAYCOMP +#include +#endif /* ================================================================ * transCommit diff --git a/Robust/src/Runtime/STM/delaycomp.h b/Robust/src/Runtime/STM/delaycomp.h index 48af9933..16719996 100644 --- a/Robust/src/Runtime/STM/delaycomp.h +++ b/Robust/src/Runtime/STM/delaycomp.h @@ -12,17 +12,17 @@ struct pointerlist { int count; void * prev; - void * array[MAXPOINTERS]; + void * array[MAXPOINTERS+1024]; }; struct primitivelist { int count; - int array[MAXVALUES]; + int array[MAXVALUES+1024]; }; struct branchlist { int count; - char array[MAXBRANCHES]; + char array[MAXBRANCHES+4096]; }; extern __thread struct pointerlist ptrstack; diff --git a/Robust/src/Runtime/STM/sandbox.c b/Robust/src/Runtime/STM/sandbox.c index 3c07025e..052c0f16 100644 --- a/Robust/src/Runtime/STM/sandbox.c +++ b/Robust/src/Runtime/STM/sandbox.c @@ -5,25 +5,58 @@ __thread int transaction_check_counter; __thread jmp_buf aborttrans; __thread int abortenabled; __thread int * counter_reset_pointer; +#ifdef DELAYCOMP +#include "delaycomp.h" +#endif void checkObjects() { if (abortenabled&&checktrans()) { - printf("Abort\n"); + printf("Loop Abort\n"); transaction_check_counter=(*counter_reset_pointer=HIGH_CHECK_FREQUENCY); - longjmp(aborttrans, 1); +#ifdef TRANSSTATS + numTransAbort++; +#endif + freenewobjs(); + objstrReset(); + t_chashreset(); +#ifdef READSET + rd_t_chashreset(); +#endif +#ifdef DELAYCOMP + dc_t_chashreset(); + ptrstack.count=0; + primstack.count=0; + branchstack.count=0; +#endif + _longjmp(aborttrans, 1); } transaction_check_counter=*counter_reset_pointer; } /* Do sandboxing */ void errorhandler(int sig, struct sigcontext ctx) { - printf("Error\n"); + // printf("Error\n"); if (abortenabled&&checktrans()) { sigset_t toclear; sigemptyset(&toclear); sigaddset(&toclear, sig); sigprocmask(SIG_UNBLOCK, &toclear,NULL); - longjmp(aborttrans, 1); +#ifdef TRANSSTATS + numTransAbort++; +#endif + freenewobjs(); + objstrReset(); + t_chashreset(); +#ifdef READSET + rd_t_chashreset(); +#endif +#ifdef DELAYCOMP + dc_t_chashreset(); + ptrstack.count=0; + primstack.count=0; + branchstack.count=0; +#endif + _longjmp(aborttrans, 1); } threadhandler(sig, ctx); } diff --git a/Robust/src/Runtime/STM/stm.c b/Robust/src/Runtime/STM/stm.c index 0b35efc7..4699540f 100644 --- a/Robust/src/Runtime/STM/stm.c +++ b/Robust/src/Runtime/STM/stm.c @@ -129,6 +129,22 @@ void randomdelay(int softaborted) { * -copies the object into the transaction cache * ============================================================= */ + +//void *TR(void *x, void * y, void *z) { +// void * inputvalue; +// if ((inputvalue=y)==NULL) x=NULL; +// else { +// chashlistnode_t * cnodetmp=&c_table[(((unsigned INTPTR)inputvalue)&c_mask)>>4]; +// do { +// if (cnodetmp->key==inputvalue) {x=cnodetmp->val; break;} +// cnodetmp=cnodetmp->next; +// if (cnodetmp==NULL) {if (((struct ___Object___*)inputvalue)->___objstatus___&NEW) {x=inputvalue; break;} else +// {x=transRead(inputvalue,z); asm volatile ("" : "=m" (c_table),"\=m" (c_mask)); break;}} +// } while(1); +// } +// return x; +//} + //__attribute__ ((pure)) void *transRead(void * oid, void *gl) { objheader_t *tmp, *objheader; diff --git a/Robust/src/Runtime/STM/tm.h b/Robust/src/Runtime/STM/tm.h index 864de75e..9f3bdb9f 100644 --- a/Robust/src/Runtime/STM/tm.h +++ b/Robust/src/Runtime/STM/tm.h @@ -94,6 +94,7 @@ typedef struct objheader { #define NEED_LOCK_THRESHOLD 0.020000 #define OSUSED(x) (((unsigned INTPTR)(x)->top)-((unsigned INTPTR) (x+1))) #define OSFREE(x) ((x)->size-OSUSED(x)) + #define TRANSREAD(x,y,z) { \ void * inputvalue; \ if ((inputvalue=y)==NULL) x=NULL;\ diff --git a/Robust/src/Runtime/thread.c b/Robust/src/Runtime/thread.c index e76b0d9d..5244d306 100644 --- a/Robust/src/Runtime/thread.c +++ b/Robust/src/Runtime/thread.c @@ -1,5 +1,6 @@ #include "runtime.h" #include +#include #include #include #include @@ -148,7 +149,7 @@ void threadhandler(int sig, struct sigcontext ctx) { threadexit(); } -struct primitivelist *pl; +#define downpage(x) ((void *)(((INTPTR)x)&~((INTPTR)4095))) void initializethreads() { struct sigaction sig; @@ -173,6 +174,7 @@ void initializethreads() { //deprecated use of sighandler, but apparently still works #ifdef SANDBOX sig.sa_handler=(void *)errorhandler; + abortenabled=0; #else sig.sa_handler=(void *)threadhandler; #endif @@ -196,7 +198,16 @@ void initializethreads() { dc_t_chashCreate(CHASH_SIZE, CLOADFACTOR); ptrstack.count=0; primstack.count=0; - pl=&primstack; + branchstack.count=0; + int a=mprotect((downpage(&ptrstack.array[MAXPOINTERS])), 4096, PROT_NONE); + if (a==-1) + perror("ptrstack"); + a=mprotect(downpage(&primstack.array[MAXVALUES]), 4096, PROT_NONE); + if (a==-1) + perror("primstack"); + a=mprotect(downpage(&branchstack.array[MAXBRANCHES]), 4096, PROT_NONE); + if (a==-1) + perror("branchstack"); #endif #ifdef STMSTATS trec=calloc(1, sizeof(threadrec_t)); @@ -207,7 +218,9 @@ void initializethreads() { { int i; for(i=0; i