Merge commit 'bad1e25ac34e5b0c0cba41a71d136e9c667990a1' into charm reviewed-6.2.2
authorIsaac Dooley <idooley2@illinois.edu>
Wed, 21 Jul 2010 16:34:01 +0000 (11:34 -0500)
committerIsaac Dooley <idooley2@illinois.edu>
Wed, 21 Jul 2010 16:34:01 +0000 (11:34 -0500)
48 files changed:
.gitignore
doc/install/run.tex
examples/ParFUM/simple2D/Makefile
src/arch/cuda/hybridAPI/Makefile
src/arch/cuda/hybridAPI/cuda-hybrid-api.cu
src/arch/cuda/hybridAPI/cuda-hybrid-api.h
src/arch/lapi/machine.c
src/arch/mpi-crayxt/conv-mach.h
src/arch/net-linux-amd64-cuda/Makefile.machine [new file with mode: 0644]
src/arch/net-linux-amd64-cuda/special.sh
src/arch/net/charmrun/Makefile
src/ck-core/ck.C
src/ck-core/ck.h
src/ck-core/debug-charm.C
src/ck-core/debug-charm.h
src/ck-core/middle-blue.h
src/ck-core/middle.h
src/ck-ldb/BaseLB.h
src/ck-ldb/CentralLB.C
src/ck-ldb/CentralLB.ci
src/ck-ldb/CentralLB.h
src/conv-ccs/conv-ccs.c
src/conv-core/converse.h
src/conv-core/debug-conv.c
src/conv-core/memory-charmdebug.c
src/conv-core/memory.c
src/langs/bluegene/blue.C
src/langs/charj/src/charj/libs/Array.cpp
src/langs/charj/src/charj/libs/Array.h
src/langs/charj/src/charj/translator/Charj.g
src/langs/charj/src/charj/translator/Charj.stg
src/langs/charj/src/charj/translator/CharjASTModifier.g
src/langs/charj/src/charj/translator/CharjASTModifier2.g
src/langs/charj/src/charj/translator/CharjEmitter.g
src/langs/charj/src/charj/translator/ClassSymbol.java
src/langs/charj/src/charj/translator/ExternalSymbol.java [new file with mode: 0644]
src/langs/charj/src/charj/translator/InitPUPCollector.g
src/langs/charj/src/charj/translator/MethodSymbol.java
src/langs/charj/src/charj/translator/PackageScope.java
src/langs/charj/src/charj/translator/SymbolResolver.g
src/langs/charj/src/charj/translator/SymbolTable.java
src/langs/charj/src/charj/translator/Translator.java
src/langs/charj/src/charj/translator/VariableInitializer.java [new file with mode: 0644]
src/langs/charj/tests/unit/ArrayTest.cj
src/libs/ck-libs/cache/Makefile
src/libs/ck-libs/liveViz/Makefile
src/libs/ck-libs/pythonCCS/charmdebug-python.C
src/util/ckliststring.h

index d4763e22636362a49a54859e8c1a5f8aaef039bb..0c74885e2b77422261eac21aa1b2dacb281f8bbd 100644 (file)
@@ -17,13 +17,13 @@ lib_so
 tmp
 
 # Ignore directories created from compilation
-net-*
-mpi-*
-lapi*
-vmi-*
-multicore-*
-uth-*
-bluegenep*
+/net-*
+/mpi-*
+/lapi*
+/vmi-*
+/multicore-*
+/uth-*
+/bluegenep*
 
 # Ignore cruft that would result from compiling charm example/test code
 # Note this is negated inside src/arch to permit addition of new charmrun files in there
index 453767e9f34cbc83bc6728c630cf9184293f0aa5..30554e92aff326a8dd262a26abc62ace827fa5ce 100644 (file)
@@ -75,9 +75,7 @@ method.
 This will pass {\tt -np \$P} to indicate how many processes to
 launch. An executable named something other than {\tt mpiexec} can be
 used with the additional argument {\tt ++remote-shell} {\it runmpi},
-with `runmpi' replaced by the necessary name. At present, this depends
-on the environment variables {\tt OMPI\_COMM\_WORLD\_RANK} and {\tt
-  OMPI\_COMM\_WORLD\_SIZE} being set in each launched process.
+with `runmpi' replaced by the necessary name.
 
 Use of this option can potentially provide a few benefits:
 
@@ -89,6 +87,11 @@ Use of this option can potentially provide a few benefits:
   from the head/login nodes to the compute nodes
 \end{itemize}
 
+At present, this option depends on the environment variables for some
+common MPI implementations. It supports OpenMPI ({\tt OMPI\_COMM\_WORLD\_RANK} and
+{\tt OMPI\_COMM\_WORLD\_SIZE}) and M(VA)PICH ({\tt MPIRUN\_RANK} and {\tt
+  MPIRUN\_NPROCS} or {\tt PMI\_RANK} and {\tt PMI\_SIZE}).
+
 \item[{\tt ++debug}] Run each node under gdb in an xterm window, prompting
 the user to begin execution.
 
@@ -175,6 +178,26 @@ network and MPI versions, smp and non-smp versions.
 
 \item[{\tt +excludecore <core \#>}]       does not set cpu affinity for the given core number. One can use this option multiple times to provide a list of core numbers to avoid.
 
+\item[{\tt +pemap L[-U[:S[.R]]][,...]}] Bind the execution threads to
+  the sequence of cores described by the arguments using the operating
+  system's CPU affinity functions.
+
+A single number identifies a particular core. Two numbers separated by
+a dash identify an inclusive range (\emph{lower bound} and \emph{upper
+  bound}). If they are followed by a colon and another number (a
+\emph{stride}), that range will be stepped through in increments of
+the additional number. Within each stride, a dot followed by a
+\emph{run} will indicate how many cores to use from that starting
+point.
+
+For example, the sequence {\tt 0-8:2,16,20-24} includes cores 0, 2, 4,
+6, 8, 16, 20, 21, 22, 23, 24. On a 4-way quad-core system, if one
+wanted to use 3 cores from each socket, one could write this as {\tt
+  0-15:4.3}.
+
+\item[{\tt +commap p[,q,...]}] Bind communication threads to the
+  listed cores, one per process.
+
 \end{description}
 
 \subsection{Nodelist file}
index e6de92ba48f13965a0f742aa0707c6dc110ff3a0..87e77be4078a1702ac93fec0644bc37e88e2ac47 100644 (file)
@@ -1,4 +1,4 @@
-CHARMC=../../../bin/charmc $(OPTS) 
+CHARMC=../../../bin/charmc $(OPTS)
 
 all: pgm
 
index 4a4ad0c37dd50a447039b8c3f36668b1bfa5896d..639071004b1c11b00ea592586d92ed352cd31b6e 100644 (file)
@@ -1,8 +1,10 @@
+CUDA_DIR=/usr/local/cuda/cuda
+NVIDIA_CUDA_SDK=/usr/local/NVIDIA_CUDA_SDK
 CHARMDIR=../../
 CHARMC=$(CHARMDIR)/bin/charmc
 
 NVCC = $(CUDA_DIR)/bin/nvcc
-NVCC_FLAGS = -c -use_fast_math #-DGPU_MEMPOOL -DGPU_MEMPOOL_DEBUG -DGPU_WRQ_VERBOSE #-device-debug -deviceemu
+NVCC_FLAGS = -c -use_fast_math -DGPU_MEMPOOL #-DGPU_PROFILE -DGPU_TRACE #-DGPU_MEMPOOL_DEBUG -DGPU_WRQ_VERBOSE #-device-debug -deviceemu
 NVCC_INC = -I$(CUDA_DIR)/include -I$(NVIDIA_CUDA_SDK)/common/inc -I.. 
 
 RM = rm -f
index eec793c726bf0ce4aea1b264ddc982592dec6970..14c73dc0d22fad75bae52ea52aeeb0867c4d2712 100644 (file)
@@ -58,11 +58,19 @@ unsigned int currentDfr = 0;
 void *delayedFreeReqs[MAX_DELAYED_FREE_REQS];
 
 #ifdef GPU_MEMPOOL
-#define GPU_MEMPOOL_NUM_SLOTS 15
+#define GPU_MEMPOOL_NUM_SLOTS 19
+// pre-allocated buffers will be at least this big
+#define GPU_MEMPOOL_MIN_BUFFER_SIZE 256
 
 CkVec<BufferPool> memPoolFreeBufs;
 CkVec<int> memPoolBoundaries;
 //int memPoolBoundaries[GPU_MEMPOOL_NUM_SLOTS];
+
+#ifdef GPU_DUMMY_MEMPOOL
+CkVec<int> memPoolMax;
+CkVec<int> memPoolSize;
+#endif
+
 #endif
 
 /* The runtime system keeps track of all allocated buffers on the GPU.
@@ -448,9 +456,16 @@ void initHybridAPI(int myPe) {
 #endif
 
 #ifdef GPU_MEMPOOL
+
   int nslots = GPU_MEMPOOL_NUM_SLOTS;
-  int *sizes;
-  sizes = (int *)malloc(sizeof(int)*nslots); 
+  int sizes[GPU_MEMPOOL_NUM_SLOTS];
+
+#ifdef GPU_DUMMY_MEMPOOL
+  memPoolMax.reserve(nslots);
+  memPoolMax.length() = nslots;
+  memPoolSize.reserve(nslots);
+  memPoolSize.length() = nslots;
+#endif
 
   memPoolBoundaries.reserve(GPU_MEMPOOL_NUM_SLOTS);
   memPoolBoundaries.length() = GPU_MEMPOOL_NUM_SLOTS;
@@ -459,40 +474,37 @@ void initHybridAPI(int myPe) {
   for(int i = 0; i < GPU_MEMPOOL_NUM_SLOTS; i++){
     memPoolBoundaries[i] = bufSize;
     bufSize = bufSize << 1;
+#ifdef GPU_DUMMY_MEMPOOL
+    memPoolSize[i] = 0;
+    memPoolMax[i] = -1;
+#endif
   }
 
-  //1K
-  sizes[0] = 512; 
-  //2K
-  sizes[1] = 512;
-  //4K
-  sizes[2] = 64;
-  //8K
-  sizes[3] = 64;
-  //16K
-  sizes[4] = 32;
-  //32K
-  sizes[5] = 32;
-  //64K
-  sizes[6] = 32;
-  //128K
-  sizes[7] = 32;
-  //256K
-  sizes[8] = 32;
-  //512K
-  sizes[9] = 32;
-  //1M
-  sizes[10] = 170;
-  //2M
-  sizes[11] = 16;
-  //4M
-  sizes[12] = 4;
-  //8M
-  sizes[13] = 2;
-  //16M
-  sizes[14] = 2; 
-
-  createPool(sizes, nslots, memPoolFreeBufs);
+
+#ifndef GPU_DUMMY_MEMPOOL
+/*256*/ sizes[0] = 20;
+/*512*/ sizes[1] = 10;
+/*1024*/ sizes[2] = 10;
+/*2048*/ sizes[3] = 20;
+/*4096*/ sizes[4] = 10;
+/*8192*/ sizes[5] = 30;
+/*16384*/ sizes[6] = 25;
+/*32768*/ sizes[7] = 10;
+/*65536*/ sizes[8] = 5;
+/*131072*/ sizes[9] = 5;
+/*262144*/ sizes[10] = 5;
+/*524288*/ sizes[11] = 5;
+/*1048576*/ sizes[12] = 5;
+/*2097152*/ sizes[13] = 10;
+/*4194304*/ sizes[14] = 10;
+/*8388608*/ sizes[15] = 10;
+/*16777216*/ sizes[16] = 8;
+/*33554432*/ sizes[17] = 6;
+/*67108864*/ sizes[18] = 7;
+
+createPool(sizes, nslots, memPoolFreeBufs);
+#endif
+
   printf("[%d] done creating buffer pool\n", CmiMyPe());
 
 #endif
@@ -814,6 +826,24 @@ void releasePool(CkVec<BufferPool> &pools);
  *  cleans up and deletes memory allocated for the queue and the CUDA streams
  */
 void exitHybridAPI() {
+  printf("EXIT HYBRID API\n");
+
+#ifdef GPU_MEMPOOL
+
+#ifndef GPU_DUMMY_MEMPOOL
+  releasePool(memPoolFreeBufs);
+#else
+  for(int i = 0; i < memPoolBoundaries.length(); i++){
+    printf("(%d) slot %d size: %d max: %d\n", CmiMyPe(), i, memPoolBoundaries[i], memPoolMax[i]);
+  }
+
+  if(memPoolBoundaries.length() != memPoolMax.length()){
+    abort();
+  }
+#endif
+  
+#endif
+
   deleteWRqueue(wrQueue); 
   CUDA_SAFE_CALL_NO_SYNC(cudaStreamDestroy(kernel_stream)); 
   CUDA_SAFE_CALL_NO_SYNC(cudaStreamDestroy(data_in_stream)); 
@@ -842,16 +872,18 @@ void exitHybridAPI() {
 
 #endif
 
-#ifdef GPU_MEMPOOL
-  releasePool(memPoolFreeBufs);
-#endif
-
 }
 
 #ifdef GPU_MEMPOOL
 void releasePool(CkVec<BufferPool> &pools){
   for(int i = 0; i < pools.length(); i++){
-    CUDA_SAFE_CALL_NO_SYNC(cudaFreeHost((void *)pools[i].head));
+    Header *hdr;
+    Header *next;
+    for(hdr = pools[i].head; hdr != NULL;){
+      next = hdr->next; 
+      CUDA_SAFE_CALL_NO_SYNC(cudaFreeHost((void *)hdr));
+      hdr = next;
+    }
   }
   pools.free();
 }
@@ -870,25 +902,26 @@ void createPool(int *nbuffers, int nslots, CkVec<BufferPool> &pools){
     int bufSize = memPoolBoundaries[i];
     int numBuffers = nbuffers[i];
     pools[i].size = bufSize;
+    pools[i].head = NULL;
     
+    /*
     CUDA_SAFE_CALL_NO_SYNC(cudaMallocHost((void **)(&pools[i].head), 
                                           (sizeof(Header)+bufSize)*numBuffers));
-    if(pools[i].head == NULL){
-      abort();
-    }
+    */
 
     Header *hd = pools[i].head;
     Header *previous = NULL;
-    char *memory;
 
     for(int j = 0; j < numBuffers; j++){
+      CUDA_SAFE_CALL_NO_SYNC(cudaMallocHost((void **)&hd,
+                                            (sizeof(Header)+bufSize)));
+      if(hd == NULL){
+        printf("(%d) failed to allocate %dth block of size %d, slot %d\n", CmiMyPe(), j, bufSize, i);
+        abort();
+      }
       hd->slot = i;
       hd->next = previous;
       previous = hd;
-      hd++; // move ptr past header
-      memory = (char *)hd;
-      memory += bufSize;
-      hd = (Header *)memory;
     }
 
     pools[i].head = previous;
@@ -906,9 +939,17 @@ int findPool(int size){
   else if(size > memPoolBoundaries[boundaryArrayLen-1]){
     // create new slot
     memPoolBoundaries.push_back(size);
+#ifdef GPU_DUMMY_MEMPOOL
+    memPoolMax.push_back(-1);
+    memPoolSize.push_back(0);
+#endif
 
     BufferPool newpool;
     CUDA_SAFE_CALL_NO_SYNC(cudaMallocHost((void **)&newpool.head, size+sizeof(Header)));
+    if(newpool.head == NULL){
+      printf("(%d) findPool: failed to allocate newpool %d head, size %d\n", CmiMyPe(), boundaryArrayLen, size);
+      abort();
+    }
     newpool.size = size;
 #ifdef GPU_MEMPOOL_DEBUG
     newpool.num = 1;
@@ -921,7 +962,7 @@ int findPool(int size){
 
     return boundaryArrayLen;
   }
-  for(int i = 0; i < GPU_MEMPOOL_NUM_SLOTS-1; i++){
+  for(int i = 0; i < memPoolBoundaries.length()-1; i++){
     if(memPoolBoundaries[i] < size && size <= memPoolBoundaries[i+1]){
       return (i+1);
     }
@@ -931,12 +972,23 @@ int findPool(int size){
 
 void *getBufferFromPool(int pool, int size){
   Header *ret;
-  if(pool < 0 || pool >= memPoolFreeBufs.length() || memPoolFreeBufs[pool].head == NULL){
+  if(pool < 0 || pool >= memPoolFreeBufs.length()){
+    printf("(%d) getBufferFromPool, pool: %d, size: %d invalid pool\n", CmiMyPe(), pool, size);
 #ifdef GPU_MEMPOOL_DEBUG
-    printf("(%d) pool %d size: %d, num: %d\n", CmiMyPe(), pool, size, memPoolFreeBufs[pool].num);
+    printf("(%d) num: %d\n", CmiMyPe(), memPoolFreeBufs[pool].num);
 #endif
     abort();
   }
+  else if (memPoolFreeBufs[pool].head == NULL){
+    Header *hd;
+    CUDA_SAFE_CALL_NO_SYNC(cudaMallocHost((void **)&hd, sizeof(Header)+memPoolFreeBufs[pool].size));
+    printf("(%d) getBufferFromPool, pool: %d, size: %d expand by 1\n", CmiMyPe(), pool, size);
+    if(hd == NULL){
+      abort();
+    }
+    hd->slot = pool;
+    return (void *)(hd+1);
+  }
   else{
     ret = memPoolFreeBufs[pool].head;
     memPoolFreeBufs[pool].head = ret->next;
@@ -959,7 +1011,25 @@ void returnBufferToPool(int pool, Header *hd){
 
 void *hapi_poolMalloc(int size){
   int pool = findPool(size);
-  void *buf = getBufferFromPool(pool, size);
+  void *buf;
+#ifdef GPU_DUMMY_MEMPOOL
+  CUDA_SAFE_CALL_NO_SYNC(cudaMallocHost((void **)&buf, size+sizeof(Header)));
+  if(pool < 0 || pool >= memPoolSize.length()){
+    printf("(%d) need to create up to pool %d; malloc size: %d\n", CmiMyPe(), pool, size);
+    abort();
+  }
+  memPoolSize[pool]++;
+  if(memPoolSize[pool] > memPoolMax[pool]){
+    memPoolMax[pool] = memPoolSize[pool];
+  }
+  Header *hdr = (Header *)buf;
+  hdr->slot = pool;
+  hdr = hdr+1;
+  buf = (void *)hdr;
+#else
+  buf = getBufferFromPool(pool, size);
+#endif
+  
 #ifdef GPU_MEMPOOL_DEBUG
   printf("(%d) hapi_malloc size %d pool %d left %d\n", CmiMyPe(), size, pool, memPoolFreeBufs[pool].num);
 #endif
@@ -969,7 +1039,18 @@ void *hapi_poolMalloc(int size){
 void hapi_poolFree(void *ptr){
   Header *hd = ((Header *)ptr)-1;
   int pool = hd->slot;
+
+#ifdef GPU_DUMMY_MEMPOOL
+  if(pool < 0 || pool >= memPoolSize.length()){
+    printf("(%d) free pool %d\n", CmiMyPe(), pool);
+    abort();
+  }
+  memPoolSize[pool]--;
+  delayedFree((void *)hd); 
+#else
   returnBufferToPool(pool, hd);
+#endif
+
 #ifdef GPU_MEMPOOL_DEBUG
   int size = hd->size;
   printf("(%d) hapi_free size %d pool %d left %d\n", CmiMyPe(), size, pool, memPoolFreeBufs[pool].num);
index 4e46988c141072e8724ad17674ce695c14973979..e51429a9214028ccf71c9780aec16c5acb2a62b5 100644 (file)
@@ -58,8 +58,6 @@ typedef struct _bufferPool{
 #endif
 }BufferPool;
 
-// pre-allocated buffers will be at least this big
-#define GPU_MEMPOOL_MIN_BUFFER_SIZE 1024
 
 
 #endif
index 9ddfb7937e9db1fd5afd162caa169dd9aa7ca7f1..24f8abe5c94c4f3b80b602656b3b6ab2bd477ecc 100755 (executable)
@@ -1960,7 +1960,10 @@ static void ConverseRunPE(int everReturn) {
     
     CpvAccess(CmiLocalQueue) = CmiGetState()->localqueue;
 
-    CmiMyArgv=CmiCopyArgs(Cmi_argv);
+    if(CmiMyRank())
+        CmiMyArgv=CmiCopyArgs(Cmi_argv);
+    else
+       CmiMyArgv=Cmi_argv;
 
     CthInit(CmiMyArgv);
 
@@ -2086,8 +2089,6 @@ void ConverseInit(int argc, char **argv, CmiStartFn fn, int usched, int initret)
     CmiNumPes() = CmiNumNodes() * CmiMyNodeSize();
     Cmi_nodestart = CmiMyNode() * CmiMyNodeSize();
 
-    /*Cmi_argvcopy = CmiCopyArgs(argv);  Not needed?? --Chao Mei*/
-
     Cmi_argv = argv;
     Cmi_startfn = fn;
     Cmi_usrsched = usched;
index c2b12d0857d1efd83e32bed344f17a82e64a35f7..3dbf9317441641c73fa35c657d0428d76b0eeed7 100644 (file)
@@ -73,5 +73,7 @@
 
 #define CMK_LBDB_ON                                       1
 
+#define CMK_DISABLE_SYNC                                   1
+
 #endif
 
diff --git a/src/arch/net-linux-amd64-cuda/Makefile.machine b/src/arch/net-linux-amd64-cuda/Makefile.machine
new file mode 100644 (file)
index 0000000..53db1e4
--- /dev/null
@@ -0,0 +1,6 @@
+hybridAPI:
+       cd hybridAPI && make install
+
+charm++: hybridAPI
+
+.PHONY: hybridAPI
index 4b6660d4ec2ea4cfb28553ec6ef0b34c412f14de..8290d1ed181ade84322d1e42cc8057ca2b6181c7 100755 (executable)
@@ -22,5 +22,3 @@ export CHARMINC=../include
 #PPU_EMBEDSPU = $CMK_PPU_EMBEDSPU
 #SPERT_LIBS = $CMK_SPERT_LIBS
 #EOF
-
-cd hybridAPI && make install
index 9e99bb14d47f113db87d03a8bb4f18b0e36dac01..6f5e6c562c35f35335f28d7ac8684c31afdeca8f 100644 (file)
@@ -1,5 +1,5 @@
 BIN=../../bin
-CHARMC=$(BIN)/charmc $(OPTS)
+CHARMC=$(BIN)/charmc $(OPTS) -I..
 
 SHELL=/bin/sh
 
index b9443a649191a033e815f929ece6138fafe7fe1d..88cd9f6248925f9d68584e3dea3706daa442c51e 100644 (file)
@@ -2011,13 +2011,37 @@ int _recplay_crc = 0;
 int _recplay_checksum = 0;
 int _recplay_logsize = 1024*1024;
 
+//#define REPLAYDEBUG(args) ckout<<"["<<CkMyPe()<<"] "<< args <<endl;
+#define REPLAYDEBUG(args) /* empty */
+
 CkMessageWatcher::~CkMessageWatcher() { if (next!=NULL) delete next;}
 
+#include "trace-common.h" /* For traceRoot and traceRootBaseLength */
+
+static FILE *openReplayFile(const char *prefix, const char *suffix, const char *permissions) {
+
+    int i;
+    char *fName = new char[CkpvAccess(traceRootBaseLength)+strlen(prefix)+strlen(suffix)+7];
+    strncpy(fName, CkpvAccess(traceRoot), CkpvAccess(traceRootBaseLength));
+    sprintf(fName+CkpvAccess(traceRootBaseLength), "%s%06d%s",prefix,CkMyPe(),suffix);
+    FILE *f=fopen(fName,permissions);
+    REPLAYDEBUG("openReplayfile "<<fName);
+    if (f==NULL) {
+        CkPrintf("[%d] Could not open replay file '%s' with permissions '%w'\n",
+            CkMyPe(),fName,permissions);
+        CkAbort("openReplayFile> Could not open replay file");
+    }
+    return f;
+}
+
+#include "BaseLB.h" /* For LBMigrateMsg message */
+
 class CkMessageRecorder : public CkMessageWatcher {
   char *buffer;
   unsigned int curpos;
+  bool firstOpen;
 public:
-  CkMessageRecorder(FILE *f_): curpos(0) { f=f_; buffer=new char[_recplay_logsize]; }
+  CkMessageRecorder(FILE *f_): curpos(0), firstOpen(true) { f=f_; buffer=new char[_recplay_logsize]; }
   ~CkMessageRecorder() {
     flushLog(0);
     fprintf(f,"-1 -1 -1 ");
@@ -2059,10 +2083,24 @@ private:
     }
     return CmiTrue;
   }
-  virtual int process(CthThreadToken *token,CkCoreState *ck) {
+  virtual CmiBool process(CthThreadToken *token,CkCoreState *ck) {
     curpos+=sprintf(&buffer[curpos], "%d %d %d\n",CkMyPe(), -2, token->serialNo);
     if (curpos > _recplay_logsize-128) flushLog();
-    return 1;
+    return CmiTrue;
+  }
+  
+  virtual CmiBool process(LBMigrateMsg **msg,CkCoreState *ck) {
+    FILE *f;
+    if (firstOpen) f = openReplayFile("ckreplay_",".lb","w");
+    else f = openReplayFile("ckreplay_",".lb","a");
+    firstOpen = false;
+    if (f != NULL) {
+      PUP::toDisk p(f);
+      p | (*msg)->n_moves; // Need to store to be able to reload the message during replay
+      (*msg)->pup(p);
+      fclose(f);
+    }
+    return CmiTrue;
   }
 };
 
@@ -2090,9 +2128,6 @@ private:
   }
 };
 
-//#define REPLAYDEBUG(args) ckout<<"["<<CkMyPe()<<"] "<< args <<endl;
-#define REPLAYDEBUG(args) /* empty */
-
 extern "C" void CkMessageReplayQuiescence(void *rep, double time);
 extern "C" void CkMessageDetailReplayDone(void *rep, double time);
 
@@ -2106,6 +2141,7 @@ class CkMessageReplay : public CkMessageWatcher {
        int nextPE, nextSize, nextEvent, nexttype; //Properties of next message we need:
        int nextEP;
        unsigned int crc1, crc2;
+       FILE *lbFile;
        /// Read the next message we need from the file:
        void getNext(void) {
          if (3!=fscanf(f,"%d%d%d", &nextPE,&nextSize,&nextEvent)) CkAbort("CkMessageReplay> Syntax error reading replay file");
@@ -2225,7 +2261,7 @@ class CkMessageReplay : public CkMessageWatcher {
        }
 
 public:
-       CkMessageReplay(FILE *f_) {
+       CkMessageReplay(FILE *f_) : lbFile(NULL) {
          counter=0;
          f=f_;
          getNext();
@@ -2268,19 +2304,34 @@ private:
                        return CmiFalse;
                }
        }
-       virtual int process(CthThreadToken *token, CkCoreState *ck) {
+       virtual CmiBool process(CthThreadToken *token, CkCoreState *ck) {
       REPLAYDEBUG("ProcessToken token: "<<token->serialNo);
          if (isNext(token)) {
         REPLAYDEBUG("Executing token: "<<token->serialNo)
            getNext();
            flush();
-           return 1;
+           return CmiTrue;
          } else {
         REPLAYDEBUG("Queueing token: "<<token->serialNo
             <<" because we wanted "<<nextPE<<" "<<nextSize<<" "<<nextEvent)
            delayedTokens.enq(token);
-           return 0;
+           return CmiFalse;
+         }
+       }
+
+       virtual CmiBool process(LBMigrateMsg **msg,CkCoreState *ck) {
+         if (lbFile == NULL) lbFile = openReplayFile("ckreplay_",".lb","r");
+         if (lbFile != NULL) {
+           int num_moves;
+        PUP::fromDisk p(lbFile);
+           p | num_moves;
+           if (num_moves != (*msg)->n_moves) {
+             delete *msg;
+             *msg = new (num_moves,CkNumPes(),CkNumPes(),0) LBMigrateMsg;
+           }
+           (*msg)->pup(p);
          }
+         return CmiTrue;
        }
 };
 
@@ -2338,12 +2389,12 @@ extern "C" void CkMessageDetailReplayDone(void *rep, double time) {
   ConverseExit();
 }
 
-static int CpdExecuteThreadResume(CthThreadToken *token) {
+static CmiBool CpdExecuteThreadResume(CthThreadToken *token) {
   CkCoreState *ck = CkpvAccess(_coreState);
   if (ck->watcher!=NULL) {
     return ck->watcher->processThread(token,ck);
   }
-  return 1;
+  return CmiTrue;
 }
 
 CpvCExtern(int, CthResumeNormalThreadIdx);
@@ -2370,22 +2421,11 @@ extern "C" void CthResumeNormalThreadDebug(CthThreadToken* token)
   }
 }
 
-#include "trace-common.h" /* For traceRoot and traceRootBaseLength */
-
-static FILE *openReplayFile(const char *prefix, const char *suffix, const char *permissions) {
-
-       int i;
-       char *fName = new char[CkpvAccess(traceRootBaseLength)+strlen(prefix)+strlen(suffix)+7];
-       strncpy(fName, CkpvAccess(traceRoot), CkpvAccess(traceRootBaseLength));
-       sprintf(fName+CkpvAccess(traceRootBaseLength), "%s%06d%s",prefix,CkMyPe(),suffix);
-       FILE *f=fopen(fName,permissions);
-       REPLAYDEBUG("openReplayfile "<<fName);
-       if (f==NULL) {
-               CkPrintf("[%d] Could not open replay file '%s' with permissions '%w'\n",
-                       CkMyPe(),fName,permissions);
-               CkAbort("openReplayFile> Could not open replay file");
-       }
-       return f;
+void CpdHandleLBMessage(LBMigrateMsg **msg) {
+  CkCoreState *ck = CkpvAccess(_coreState);
+  if (ck->watcher!=NULL) {
+    ck->watcher->processLBMessage(msg, ck);
+  }
 }
 
 #if CMK_BLUEGENE_CHARM
@@ -2394,6 +2434,7 @@ CpvExtern(int      , CthResumeBigSimThreadIdx);
 
 #include "ckliststring.h"
 void CkMessageWatcherInit(char **argv,CkCoreState *ck) {
+    CmiArgGroup("Charm++","Record/Replay");
     CmiBool forceReplay = CmiFalse;
     char *procs = NULL;
     _replaySystem = 0;
@@ -2408,6 +2449,7 @@ void CkMessageWatcherInit(char **argv,CkCoreState *ck) {
     if (CmiGetArgStringDesc(argv,"+record-detail",&procs,"Record full message content for the specified processors")) {
         CkListString list(procs);
         if (list.includes(CkMyPe())) {
+          CkPrintf("Charm++> Recording full detail for processor %d\n",CkMyPe());
           CpdSetInitializeMemory(1);
           ck->addWatcher(new CkMessageDetailRecorder(openReplayFile("ckreplay_",".detail","w")));
         }
index 4063a65f4708c6f92774943eba4ee69831ecc1cc..66e822f1c0157134fb46c418daf41dfb31df00ca 100644 (file)
@@ -131,28 +131,23 @@ public:
         * The message is processed by the watcher starting from the innermost one
         * up to the outermost
         */
-       inline CmiBool processMessage(envelope **env,CkCoreState *ck) {
-         CmiBool result = CmiTrue;
-         if (next != NULL) result &= next->processMessage(env, ck);
-         result &= process(env, ck);
-#if CMK_BLUEGENE_CHARM
-         //if (!result) BgRewindRecord();
-#endif
-         return result;
-       }
-       inline int processThread(CthThreadToken *token, CkCoreState *ck) {
-          int result = 1;
-          if (next != NULL) result &= next->processThread(token, ck);
-          result &= process(token, ck);
-#if CMK_BLUEGENE_CHARM
-          //if (!result) BgRewindRecord();
-#endif
-          return result;
-       }
+#define PROCESS_MACRO(name,type) inline CmiBool process##name(type *input,CkCoreState *ck) { \
+  CmiBool result = CmiTrue; \
+    if (next != NULL) result &= next->process##name(input, ck); \
+    result &= process(input, ck); \
+    return result; \
+  }
+
+    PROCESS_MACRO(Message,envelope*);
+    PROCESS_MACRO(Thread,CthThreadToken);
+    PROCESS_MACRO(LBMessage,LBMigrateMsg*);
+
+#undef PROCESS_MACRO
 protected:
     /** These are used internally by this class to call the correct subclass method */
        virtual CmiBool process(envelope **env,CkCoreState *ck) =0;
-       virtual int process(CthThreadToken *token, CkCoreState *ck) {return 1;}
+       virtual CmiBool process(CthThreadToken *token, CkCoreState *ck) {return CmiTrue;}
+       virtual CmiBool process(LBMigrateMsg **msg, CkCoreState *ck) {return CmiTrue;}
 public:
     inline void setNext(CkMessageWatcher *w) { next = w; }
 };
@@ -200,6 +195,7 @@ public:
 
 CkpvExtern(CkCoreState *, _coreState);
 
+void CpdHandleLBMessage(LBMigrateMsg **msg);
 void CkMessageWatcherInit(char **argv,CkCoreState *ck);
 
 extern void _processHandler(void *converseMsg,CkCoreState *ck);
index 236f06b94c6c93dd6aa492acfb10351cdda0ca57..48daa77ae9c35332d5ec4a087e97e5d3a87b8634 100644 (file)
@@ -78,6 +78,7 @@ void CpdBeforeEp(int ep, void *obj, void *msg) {
     memoryBackup = &_debugData.peek().memoryBackup;
     if (!_entryTable[ep]->inCharm) {
       CpdResetMemory();
+      CpdSystemExit();
     }
     CkVec<DebugPersistentCheck> &preExecutes = CkpvAccess(_debugEntryTable)[ep].preProcess;
     for (int i=0; i<preExecutes.size(); ++i) {
@@ -98,6 +99,7 @@ void CpdAfterEp(int ep) {
     }
     memoryBackup = &entry.memoryBackup;
     if (!_entryTable[ep]->inCharm) {
+      CpdSystemEnter();
       CpdCheckMemory();
     }
     if (entry.msg != NULL) CmiFree(UsrToEnv(entry.msg));
@@ -428,6 +430,7 @@ void CpdPupMessage(PUP::er &p, void *msg)
 
 struct ConditionalList {
   int count;
+  int deliver;
   int msgs[1];
 };
 CkpvStaticDeclare(void *, lastBreakPointMsg);
@@ -592,6 +595,7 @@ static pid_t CpdConditional_SetupComm() {
     int shmemid = shmget(IPC_PRIVATE, 1024*1024, IPC_CREAT | 0666);
     conditionalShm = (ConditionalList*)shmat(shmemid, NULL, 0);
     conditionalShm->count = 0;
+    conditionalShm->deliver = 0;
     shmctl(shmemid, IPC_RMID, &dummy);
   }
   
@@ -642,10 +646,29 @@ extern "C" void CpdEndConditionalDeliver_master() {
   close(conditionalPipe[1]);
   conditionalPipe[1] = 0;
   wait(NULL);
+  int i;
+  // Check if we have to deliver unconditionally some messages
+  if (conditionalShm->deliver > 0) {
+    // Deliver the requested number of messages
+    for (i=0; i < conditionalShm->deliver; ++i) {
+      int msgNum = conditionalShm->msgs[i];
+      if (msgNum == -1) CpdDeliverSingleMessage();
+      else CpdDeliverMessageInt(msgNum);
+    }
+    // Move back the remaining messages accordingly
+    for (i=conditionalShm->deliver; i < conditionalShm->count; ++i) {
+      conditionalShm->msgs[i-conditionalShm->deliver] = conditionalShm->msgs[i];
+    }
+    conditionalShm->count -= conditionalShm->deliver;
+    conditionalShm->deliver = 0;
+    CmiMachineProgressImpl();
+  }
+  CkAssert(conditionalShm->count >= 0);
   if (conditionalShm->count == 0) {
     CcsSendReply(0,NULL);
     shmdt((char*)conditionalShm);
     conditionalShm = NULL;
+    CkPrintf("Conditional delivery on %d concluded; normal mode resumed\n",CkMyPe());
   } else {
     if (CpdConditional_SetupComm()==0) {
       // We are in the child, deliver again the messages
@@ -674,6 +697,14 @@ void CpdDeliverMessageConditionally(char * msg) {
   }
 }
 
+void CpdCommitConditionalDelivery(char * msg) {
+  int msgNum;
+  sscanf(msg+CmiMsgHeaderSizeBytes, "%d", &msgNum);\
+  conditionalShm->deliver = msgNum;
+  shmdt((char*)conditionalShm);
+  _exit(0);
+}
+
 class CpdList_msgStack : public CpdListAccessor {
   virtual const char * getPath(void) const {return "charm/messageStack";}
   virtual size_t getLength(void) const {
@@ -829,6 +860,7 @@ void CpdSetBreakPoint (char *msg)
     // Replace entry in entry table with _call_freeze_on_break_point
     tableIdx = atoi(functionName);
     if (tableIdx >= 0 && tableIdx < tableSize) {
+      if (! CkpvAccess(_debugEntryTable)[tableIdx].isBreakpoint) {
            EntryInfo * breakPointEntryInfo = (EntryInfo *)CpvAccess(breakPointEntryTable)->get(tableIdx);
            if (breakPointEntryInfo == 0) {
              breakPointEntryInfo = new EntryInfo(_entryTable[tableIdx]->name, _entryTable[tableIdx]->call, 1, 0 );
@@ -837,6 +869,11 @@ void CpdSetBreakPoint (char *msg)
              _entryTable[tableIdx]->name = "debug_breakpoint_ep";
              _entryTable[tableIdx]->call = (CkCallFnPtr)_call_freeze_on_break_point;
            } else {
+             if (breakPointEntryInfo->msgIdx == 0) {
+               // Reset the breakpoint info
+               _entryTable[tableIdx]->name = "debug_breakpoint_ep";
+               _entryTable[tableIdx]->call = (CkCallFnPtr)_call_freeze_on_break_point;
+             }
              breakPointEntryInfo->msgIdx ++;
              //CkAssert(breakPointEntryInfo->name == _entryTable[tableIdx]->name);
              //CkAssert(breakPointEntryInfo->call == _entryTable[tableIdx]->call);
@@ -845,6 +882,7 @@ void CpdSetBreakPoint (char *msg)
            }
            CkpvAccess(_debugEntryTable)[tableIdx].isBreakpoint = CmiTrue;
            reply = ~0;
+      }
     }
 
   }
@@ -866,17 +904,19 @@ void CpdRemoveBreakPoint (char *msg)
   if (strlen(functionName) > 0) {
     int idx = atoi(functionName);
     if (idx >= 0 && idx < _entryTable.size()) {
-      EntryInfo * breakPointEntryInfo = CpvAccess(breakPointEntryTable)->get(idx);
-      if (breakPointEntryInfo != NULL) {
-        if (--breakPointEntryInfo->msgIdx == 0) {
-          // If we are the last to delete the breakpoint, then restore the original name and call function pointer
-          _entryTable[idx]->name =  breakPointEntryInfo->name;
-          _entryTable[idx]->call = (CkCallFnPtr)breakPointEntryInfo->call;
+      if (CkpvAccess(_debugEntryTable)[idx].isBreakpoint) {
+        EntryInfo * breakPointEntryInfo = CpvAccess(breakPointEntryTable)->get(idx);
+        if (breakPointEntryInfo != NULL) {
+          if (--breakPointEntryInfo->msgIdx == 0) {
+            // If we are the last to delete the breakpoint, then restore the original name and call function pointer
+            _entryTable[idx]->name =  breakPointEntryInfo->name;
+            _entryTable[idx]->call = (CkCallFnPtr)breakPointEntryInfo->call;
+          }
+          reply = ~0 ;
+          CkpvAccess(_debugEntryTable)[idx].isBreakpoint = CmiFalse;
+          //CmiPrintf("Breakpoint is removed for function %s with epIdx %ld\n", _entryTable[idx]->name, idx);
+          //CkpvAccess(breakPointEntryTable)->remove(idx);
         }
-        reply = ~0 ;
-        CkpvAccess(_debugEntryTable)[idx].isBreakpoint = CmiFalse;
-        //CmiPrintf("Breakpoint is removed for function %s with epIdx %ld\n", _entryTable[idx]->name, idx);
-        //CkpvAccess(breakPointEntryTable)->remove(idx);
       }
     }
   }
@@ -998,14 +1038,17 @@ void CpdCharmInit()
   CcsRegisterHandler("ccs_remove_all_break_points",(CmiHandler)CpdRemoveAllBreakPoints);
   CcsSetMergeFn("ccs_remove_all_break_points",CmiReduceMergeFn_random);
   CcsRegisterHandler("ccs_continue_break_point",(CmiHandler)CpdContinueFromBreakPoint);
+  CcsSetMergeFn("ccs_continue_break_point",CmiReduceMergeFn_random);
   CcsRegisterHandler("ccs_single_step",(CmiHandler)CpdDeliverSingleMessage);
   CcsRegisterHandler("ccs_debug_quit",(CmiHandler)CpdQuitDebug);
+  CcsSetMergeFn("ccs_debug_quit",CmiReduceMergeFn_random);
   CcsRegisterHandler("ccs_debug_startgdb",(CmiHandler)CpdStartGdb);
   CpdListRegister(new CpdListAccessor_c("hostinfo",hostInfoLength,0,hostInfo,0));
   CpdListRegister(new CpdList_localQ());
   CcsRegisterHandler("deliverMessage",(CmiHandler)CpdDeliverMessage);
   CcsRegisterHandler("deliverConditional",(CmiHandler)CpdDeliverMessageConditionally);
   CcsRegisterHandler("endConditional",(CmiHandler)CpdEndConditionalDelivery);
+  CcsRegisterHandler("commitConditional",(CmiHandler)CpdCommitConditionalDelivery);
   CpdListRegister(new CpdList_arrayElementNames());
   CpdListRegister(new CpdList_arrayElements());
   CpdListRegister(new CpdList_objectNames());
index e63803b27d0e8be56ff1181bab6186a3194fe57c..374fb0c02c89f87182a1de361cfd21bf3c70526d 100644 (file)
@@ -15,7 +15,7 @@
 #include "cklists.h"
 
 #define CHARMDEBUG_MAJOR   10
-#define CHARMDEBUG_MINOR    3
+#define CHARMDEBUG_MINOR    4
 
 void *CpdGetCurrentObject();
 void *CpdGetCurrentMsg();
index 120626d2cb192dbc7074cf984faee64a398ce1ba..d6e158de570b7e721712373326b2e46bc01c3fb3 100644 (file)
@@ -154,6 +154,9 @@ static inline void CksdScheduler(int ret) { BgScheduler(ret); }
 static inline void CksdExitScheduler() { BgExitScheduler(); }
 static inline void CkDeliverMsgs(int nmsg)     { BgDeliverMsgs(nmsg); }
 
+#ifdef __cplusplus
+extern "C"
+#endif
 void CkReduce(void *msg, int size, CmiReduceMergeFn mergeFn);
 
 }  /* end of namespace */
index 41ce168af010a7ec102ab6328b05e6c822abfc09..79ab7a9af267fd72d6821f8f0378f5014de0a194 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef _MIDDLE_H_
 #define _MIDDLE_H_
 
+#include "charm.h"  /* If we don't make sure this is included, we may miss CMK_BLUEGENE_CHARM */
+
 #if CMK_NAMESPACES_BROKEN
 # if CMK_BLUEGENE_CHARM
 #  error "BLUEGENE Charm++ cannot be compiled without namespace support"
index 78912c24b0527610df2a8dc3e4281b4f229ca114..ea18817016e89267370831067603d179da7096c9 100644 (file)
@@ -136,6 +136,13 @@ struct MigrateInfo {
     int to_pe;
     int async_arrival;     // if an object is available for immediate migrate
     MigrateInfo():  async_arrival(0) {}
+    void pup(PUP::er &p) {
+      p | index;
+      p | obj;
+      p | from_pe;
+      p | to_pe;
+      p | async_arrival;
+    }
 };
 
 /**
@@ -159,6 +166,20 @@ public:
        int lbDecisionCount;
 #endif
   LBMigrateMsg(): level(0), n_moves(0), next_lb(0) {}
+  void pup(PUP::er &p) {
+    int i;
+    p | level;
+    p | n_moves;
+    // Warning: it relies on the fact that the message has been allocated already
+    // with the correct number of moves!
+    p | next_lb;
+    int numPes = CkNumPes();
+    p | numPes;
+    CkAssert(numPes == CkNumPes());
+    for (i=0; i<n_moves; ++i) p | moves[i];
+    p(avail_vector, numPes);
+    for (i=0; i<numPes; ++i) p | expectedLoad[i];
+  }
 };
 
 struct VectorMigrateInfo {  
index 566ee8c5650f3a27cd24edebbb3a14c82fc43cce..1f2b0598290c554042eaf0c0c9a66f4c010c00cf 100644 (file)
@@ -11,6 +11,7 @@
 /*@{*/
 
 #include <charm++.h>
+#include "ck.h"
 #include "envelope.h"
 #include "CentralLB.h"
 #include "LBDBManager.h"
@@ -100,6 +101,9 @@ void CentralLB::initLB(const CkLBOptions &opt)
   statsMsgsList = NULL;
   statsData = NULL;
 
+  storedMigrateMsg = NULL;
+  reduction_started = 0;
+
   // for future predictor
   if (_lb_predict) predicted_model = new FutureModel(_lb_predict_window);
   else predicted_model=0;
@@ -186,8 +190,9 @@ void CentralLB::AtSync()
 
 void CentralLB::ProcessAtSync()
 {
-
 #if CMK_LBDB_ON
+  if (reduction_started) return;              // reducton in progress
+
   CmiAssert(CmiNodeAlive(CkMyPe()));
   if (CkMyPe() == cur_ld_balancer) {
     start_lb_time = CkWallTimer();
@@ -211,6 +216,7 @@ void CentralLB::ProcessAtSync()
   CkCallback cb(CkIndex_CentralLB::ReceiveCounts((CkReductionMsg*)NULL), 
                   thisProxy[0]);
   contribute(2*sizeof(int), counts, CkReduction::sum_int, cb);
+  reduction_started = 1;
 #else
   SendStats();
 #endif
@@ -288,6 +294,7 @@ void CentralLB::SendStats()
 {
 #if CMK_LBDB_ON
   CmiAssert(statsMsg != NULL);
+  reduction_started = 0;
 
 #if USE_LDB_SPANNING_TREE
   if(CkNumPes()>1024)
@@ -573,6 +580,14 @@ void CentralLB::LoadBalance()
 //      }
   }
 
+#if CMK_REPLAYSYSTEM
+  LDHandle *loadBalancer_pointers;
+  if (_replaySystem) {
+    loadBalancer_pointers = (LDHandle*)malloc(CkNumPes()*sizeof(LDHandle));
+    for (int i=0; i<statsData->n_objs; ++i) loadBalancer_pointers[statsData->from_proc[i]] = statsData->objData[i].handle.omhandle.ldb;
+  }
+#endif
+  
   double strat_start_time = CkWallTimer();
   LBMigrateMsg* migrateMsg = Strategy(statsData, clients);
 #if (defined(_FAULT_MLOG_) || defined(_FAULT_CAUSAL_))
@@ -587,6 +602,14 @@ void CentralLB::LoadBalance()
 
 //    CkPrintf("returned successfully\n");
 
+#if CMK_REPLAYSYSTEM
+  CpdHandleLBMessage(&migrateMsg);
+  if (_replaySystem) {
+    for (int i=0; i<migrateMsg->n_moves; ++i) migrateMsg->moves[i].obj.omhandle.ldb = loadBalancer_pointers[migrateMsg->moves[i].from_pe];
+    free(loadBalancer_pointers);
+  }
+#endif
+  
   LBDatabaseObj()->get_avail_vector(migrateMsg->avail_vector);
   migrateMsg->next_lb = LBDatabaseObj()->new_lbbalancer();
 
@@ -613,7 +636,20 @@ void CentralLB::LoadBalance()
     lbDecisionCount++;
     migrateMsg->lbDecisionCount = lbDecisionCount;
 #endif
-  thisProxy.ReceiveMigration(migrateMsg);
+
+  envelope *env = UsrToEnv(migrateMsg);
+  if (1) {
+      // broadcast
+    thisProxy.ReceiveMigration(migrateMsg);
+  }
+  else {
+    // split the migration for each processor
+    for (int p=0; p<CkNumPes(); p++) {
+      LBMigrateMsg *m = extractMigrateMsg(migrateMsg, p);
+      thisProxy[p].ReceiveMigration(m);
+    }
+    delete migrateMsg;
+  }
 
   // Zero out data structures for next cycle
   // CkPrintf("zeroing out data\n");
@@ -731,9 +767,20 @@ extern int restarted;
 #endif
 
 void CentralLB::ReceiveMigration(LBMigrateMsg *m)
+{
+  storedMigrateMsg = m;
+  CkCallback cb(CkIndex_CentralLB::ProcessReceiveMigration((CkReductionMsg*)NULL),
+                  thisProxy);
+  contribute(0, NULL, CkReduction::max_int, cb);
+}
+
+void CentralLB::ProcessReceiveMigration(CkReductionMsg  *msg)
 {
 #if CMK_LBDB_ON
        int i;
+        LBMigrateMsg *m = storedMigrateMsg;
+        CmiAssert(m!=NULL);
+        delete msg;
 
 #if (defined(_FAULT_MLOG_) || defined(_FAULT_CAUSAL_))
        int *dummyCounts;
@@ -749,6 +796,9 @@ void CentralLB::ReceiveMigration(LBMigrateMsg *m)
        lbDecisionCount = m->lbDecisionCount;
 #endif
 
+  if (_lb_args.debug() > 1) 
+    if (CkMyPe()%1024==0) CmiPrintf("[%d] Starting ReceiveMigration step %d at %f\n",CkMyPe(),step(), CmiWallTimer());
+
   for (i=0; i<CkNumPes(); i++) theLbdb->lastLBInfo.expectedLoad[i] = m->expectedLoad[i];
   CmiAssert(migrates_expected <= 0 || migrates_completed == migrates_expected);
 /*FAULT_EVAC*/
@@ -990,6 +1040,9 @@ void CentralLB::preprocess(LDStats* stats,int count)
 LBMigrateMsg* CentralLB::Strategy(LDStats* stats,int count)
 {
 #if CMK_LBDB_ON
+  if (_lb_args.debug())
+    CkPrintf("[%d] %s started at: %f. \n",CkMyPe(), lbname, CmiWallTimer());
+
   work(stats, count);
 
   if (_lb_args.debug()>1)  {
@@ -998,7 +1051,14 @@ LBMigrateMsg* CentralLB::Strategy(LDStats* stats,int count)
     CkPrintf("\n");
   }
 
-  return createMigrateMsg(stats, count);
+  LBMigrateMsg *msg = createMigrateMsg(stats, count);
+
+  if (_lb_args.debug()) {
+    envelope *env = UsrToEnv(msg);
+    CkPrintf("[%d] %s finished at: %f. %d objects migrating. Total LBMigrateMsg size:%.2fMB\n", CkMyPe(), lbname, CmiWallTimer(), msg->n_moves, env->getTotalsize()/1024.0/1024.0);
+  }
+
+  return msg;
 #else
   return NULL;
 #endif
@@ -1045,6 +1105,40 @@ LBMigrateMsg * CentralLB::createMigrateMsg(LDStats* stats,int count)
   return msg;
 }
 
+LBMigrateMsg * CentralLB::extractMigrateMsg(LBMigrateMsg *m, int p)
+{
+  int nmoves = 0;
+  int nunavail = 0;
+  int i;
+  for (i=0; i<m->n_moves; i++) {
+    MigrateInfo* item = (MigrateInfo*) &m->moves[i];
+    if (item->from_pe == p || item->to_pe == p) nmoves++;
+  }
+  for (i=0; i<CkNumPes();i++) {
+    if (!m->avail_vector[i]) nunavail++;
+  }
+  LBMigrateMsg* msg;
+  if (nunavail) msg = new(nmoves,CkNumPes(),CkNumPes(),0) LBMigrateMsg;
+  else msg = new(nmoves,0,0,0) LBMigrateMsg;
+  msg->n_moves = nmoves;
+  msg->level = m->level;
+  msg->next_lb = m->next_lb;
+  for (i=0,nmoves=0; i<m->n_moves; i++) {
+    MigrateInfo* item = (MigrateInfo*) &m->moves[i];
+    if (item->from_pe == p || item->to_pe == p) {
+      msg->moves[nmoves] = *item;
+      nmoves++;
+    }
+  }
+  // copy processor data
+  if (nunavail)
+  for (i=0; i<CkNumPes();i++) {
+    msg->avail_vector[i] = m->avail_vector[i];
+    msg->expectedLoad[i] = m->expectedLoad[i];
+  }
+  return msg;
+}
+
 void CentralLB::simulationWrite() {
   if(step() == LBSimulation::dumpStep)
   {
@@ -1243,6 +1337,15 @@ void CentralLB::pup(PUP::er &p) {
   if (p.isUnpacking())  {
     initLB(CkLBOptions(seqno)); 
   }
+  p|reduction_started;
+  int has_statsMsg=0;
+  if (p.isPacking()) has_statsMsg = (statsMsg!=NULL);
+  p|has_statsMsg;
+  if (has_statsMsg) {
+    if (p.isUnpacking())
+      statsMsg = new CLBStatsMsg;
+    statsMsg->pup(p);
+  }
 #if (defined(_FAULT_MLOG_) || defined(_FAULT_CAUSAL_))
   p | lbDecisionCount;
   p | resumeCount;
index c9ac99e150b5f5b8377b52da96b74bd4119bbf88..92806016babd64a12f95c112b23dee8d9939c311 100644 (file)
@@ -22,6 +22,7 @@ group [migratable] CentralLB : BaseLB {
   entry void ResumeClients(int);
   entry void ResumeClients(CkReductionMsg *);
   entry void ReceiveMigration(LBMigrateMsg*);  
+  entry void ProcessReceiveMigration(CkReductionMsg  *);
   entry void MissMigrate(int);
 };
 
index 0bf2edccfb4d8d2e93499d293ee4e3cdfb1ab4e1..702e790fda07e74db63e673b51b97023d91a71ab 100644 (file)
@@ -104,6 +104,7 @@ public:
                                                // to be resumed via message
   void ResumeClients(CkReductionMsg *);
   void ReceiveMigration(LBMigrateMsg *);       // Receive migration data
+  void ProcessReceiveMigration(CkReductionMsg  *);
 #if (defined(_FAULT_MLOG_) || defined(_FAULT_CAUSAL_))
        void ReceiveDummyMigration(int _step);
 #endif
@@ -222,6 +223,7 @@ public:
   virtual LBMigrateMsg* Strategy(LDStats* stats,int count);
   virtual void work(LDStats* stats,int count);
   virtual LBMigrateMsg * createMigrateMsg(LDStats* stats,int count);
+  virtual LBMigrateMsg * extractMigrateMsg(LBMigrateMsg *m, int p);
 protected:
   virtual CmiBool QueryBalanceNow(int) { return CmiTrue; };  
   virtual CmiBool QueryDumpData() { return CmiFalse; };  
@@ -245,6 +247,8 @@ private:
   int future_migrates_expected;
   int lbdone;
   double start_lb_time;
+  LBMigrateMsg   *storedMigrateMsg;
+  int  reduction_started;
 
   FutureModel *predicted_model;
 
index 03e6c6d76877352a7f64a33168383e68de5b93c7..63348884e87ea384f8a915dc93ce3d6c21157fe0 100644 (file)
@@ -238,10 +238,8 @@ void CcsHandleRequest(CcsImplHeader *hdr,const char *reqData)
   CpvAccess(ccsReq)=hdr;
 #if CMK_CHARMDEBUG
   if (conditionalPipe[1]!=0 && _conditionalDelivery==0) {
-    /* We are conditionally delivering, send the message to the child and wait for its response */
-    int bytes = reqLen+((int)(reqData-((char*)hdr)))+CmiReservedHeaderSize;
-    write(conditionalPipe[1], &bytes, 4);
-    write(conditionalPipe[1], ((char*)hdr)-CmiReservedHeaderSize, bytes);
+    /* We are conditionally delivering, the message has been sent to the child, wait for its response */
+    int bytes;
     if (4==read(conditionalPipe[0], &bytes, 4)) {
       char *buf = malloc(bytes);
       read(conditionalPipe[0], buf, bytes);
index fabc93fadc2652692bd382310a7e11a56a8ea1e1..9d4ac06c7a52e83a15123cb291369d1efbad585c 100644 (file)
@@ -85,6 +85,8 @@ extern "C" {
 
 /* Global variables used by charmdebug to maintain information */
 extern void CpdSetInitializeMemory(int v);
+extern void CpdSystemEnter();
+extern void CpdSystemExit();
 #if CMK_ERROR_CHECKING
 extern int memory_status_info;
 extern int memory_chare_id;
index c5570fa85c4c1d21805aecc428ed0981e5da7e1a..44b710c75ae295534c88b9dc317ff7613b70e15a 100644 (file)
@@ -287,7 +287,12 @@ void CpdFreezeModeScheduler(void)
            / * Debug messages should be handled immediately * /
            CmiHandleMessage(msg);
          } else */
-        
+      if (conditionalPipe[1]!=0 && _conditionalDelivery==0) {
+        // Since we are conditionally delivering, forward all messages to the child
+        int bytes = SIZEFIELD(msg); // reqLen+((int)(reqData-((char*)hdr)))+CmiReservedHeaderSize;
+        write(conditionalPipe[1], &bytes, 4);
+        write(conditionalPipe[1], msg, bytes);
+      }
       if (CpdIsDebugMessage(msg)) {
         CmiHandleMessage(msg);
          }
@@ -317,10 +322,10 @@ void CpdInit(void)
 
   CpvInitialize(void *, debugQueue);
   CpvAccess(debugQueue) = CdsFifo_Create();
+#endif
 
   CpvInitialize(void *, conditionalQueue);
   CpvAccess(conditionalQueue) = CdsFifo_Create();
-#endif
   
   CcsRegisterHandler("ccs_debug", (CmiHandler)CpdDebugHandler);
   CcsSetMergeFn("ccs_debug", CcsMerge_concat);
index d024bf1d02026152d75aeacaf00093cd111d0243..e834d3fdef5348a39e37caa09f4f432d762c6922 100644 (file)
@@ -51,6 +51,7 @@ struct _Slot {
   int userSize;
 
 #define FLAGS_MASK        0xFF
+#define BLOCK_PROTECTED   0x80
 #define MODIFIED          0x40
 #define NEW_BLOCK         0x20
 #define LEAK_CLEAN        0x10
@@ -134,6 +135,10 @@ static int isLeakSlot(Slot *s) {
   return s->magic & LEAK_FLAG;
 }
 
+static int isProtected(Slot *s) {
+  return s->magic & BLOCK_PROTECTED;
+}
+
 int Slot_ChareOwner(void *s) {
   return ((Slot*)s)->chareID;
 }
@@ -1049,6 +1054,7 @@ static void protectMemory() {
 #else
       char * data = (char *)cur;
 #endif
+      cur->magic |= BLOCK_PROTECTED;
       mprotect(data, cur->userSize+SLOTSPACE+cur->stackLen*sizeof(void*), PROT_READ);
     } /*else printf(" (%p)",cur->userData);*/
   SLOT_ITERATE_END
@@ -1066,6 +1072,7 @@ static void unProtectMemory() {
       char * data = (char *)cur;
 #endif
     mprotect(data, cur->userSize+SLOTSPACE+cur->stackLen*sizeof(void*), PROT_READ|PROT_WRITE);
+    cur->magic &= ~BLOCK_PROTECTED;
   SLOT_ITERATE_END
   /*printf("unprotecting memory\n");*/
 #endif
@@ -1102,11 +1109,20 @@ void CpdSystemEnter() {
   Slot *cur;
   if (++cpdInSystem == 1) {
     if (CpdMprotect) {
+      int count=0;
       SLOT_ITERATE_START(cur)
         if (cur->chareID == 0) {
-          mprotect(cur, cur->userSize+SLOTSPACE+cur->stackLen*sizeof(void*), PROT_READ|PROT_WRITE);
+#ifdef CMK_SEPARATE_SLOT
+          char * data = cur->userData;
+#else
+          char * data = (char *)cur;
+#endif
+          mprotect(data, cur->userSize+SLOTSPACE+cur->stackLen*sizeof(void*), PROT_READ|PROT_WRITE);
+          cur->magic &= ~BLOCK_PROTECTED;
+          count++;
         }
       SLOT_ITERATE_END
+      //printf("CpdSystemEnter: unprotected %d elements\n",count);
     }
   }
 #endif
@@ -1118,11 +1134,20 @@ void CpdSystemExit() {
   int i;
   if (--cpdInSystem == 0) {
     if (CpdMprotect) {
+      int count=0;
       SLOT_ITERATE_START(cur)
         if (cur->chareID == 0) {
-          mprotect(cur, cur->userSize+SLOTSPACE+cur->stackLen*sizeof(void*), PROT_READ);
+#ifdef CMK_SEPARATE_SLOT
+          char * data = cur->userData;
+#else
+          char * data = (char *)cur;
+#endif
+          cur->magic |= BLOCK_PROTECTED;
+          mprotect(data, cur->userSize+SLOTSPACE+cur->stackLen*sizeof(void*), PROT_READ);
+          count++;
         }
       SLOT_ITERATE_END
+      //printf("CpdSystemExit: protected %d elements\n",count);
       /* unprotect the pages that have been unprotected by a signal SEGV */
       for (i=0; i<unProtectedPagesSize; ++i) {
         mprotect(unProtectedPages[i], 4, PROT_READ|PROT_WRITE);
@@ -1229,13 +1254,15 @@ static void *setSlot(Slot **sl,int userSize) {
   Slot *s = *sl;
   char *user=(char*)(s+1);
 
-  /* TODO: Handle correctly memory protection while changing neighbor blocks */
-  if (CpdMprotect) {
-    if (s->next->chareID != 0); 
-  }
-  /* Splice into the slot list just past the head */
+  /* Splice into the slot list just past the head (part 1) */
   s->next=slot_first->next;
   s->prev=slot_first;
+  /* Handle correctly memory protection while changing neighbor blocks */
+  if (CpdMprotect) {
+    mprotect(s->next, 4, PROT_READ | PROT_WRITE);
+    mprotect(s->prev, 4, PROT_READ | PROT_WRITE);
+  }
+  /* Splice into the slot list just past the head (part 2) */
   s->next->prev=s;
   s->prev->next=s;
 
@@ -1244,6 +1271,10 @@ static void *setSlot(Slot **sl,int userSize) {
     resetSlotCRC(s->next + 1);
     resetSlotCRC(s->prev + 1);
   }
+  if (CpdMprotect) {
+    if (isProtected(s->next)) mprotect(s->next, 4, PROT_READ);
+    if (isProtected(s->prev)) mprotect(s->prev, 4, PROT_READ);
+  }
 #endif
 
   /* Set the last 4 bits of magic to classify the memory together with the magic */
@@ -1290,6 +1321,11 @@ static void freeSlot(Slot *s) {
    * the pointer "s" becomes invalid.
    */
 #else
+  /* Handle correctly memory protection while changing neighbor blocks */
+  if (CpdMprotect) {
+    mprotect(s->next, 4, PROT_READ | PROT_WRITE);
+    mprotect(s->prev, 4, PROT_READ | PROT_WRITE);
+  }
   /* Splice out of the slot list */
   s->next->prev=s->prev;
   s->prev->next=s->next;
@@ -1298,6 +1334,10 @@ static void freeSlot(Slot *s) {
     resetSlotCRC(s->next + 1);
     resetSlotCRC(s->prev + 1);
   }
+  if (CpdMprotect) {
+    if (isProtected(s->next)) mprotect(s->next, 4, PROT_READ);
+    if (isProtected(s->prev)) mprotect(s->prev, 4, PROT_READ);
+  }
   s->prev=s->next=(Slot *)0;//0x0F00; why was it not 0?
 
   s->magic=SLOTMAGIC_FREED;
@@ -1358,6 +1398,7 @@ static void meta_init(char **argv) {
   }
   if (CmiGetArgFlagDesc(argv,"+memory_backup", "Backup all memory at every entry method")) {
     CpdMemBackup = 1;
+    saveAllocationHistory = 1;
   }
   if (CmiGetArgFlagDesc(argv,"+memory_crc", "Use CRC32 to detect memory changes")) {
     CpdCRC32 = 1;
index 04d53b7a7d47aedfaf7936d14ebed0565591e2ff..64f2f4bbda3f599619ffb6146f72b973f7d8a222 100644 (file)
@@ -57,7 +57,7 @@
 #include "converse.h"
 
 void * memory_stack_top; /*The higher end of the stack (approximation)*/
-int cpdInSystem=0;
+int cpdInSystem=1; /*Start inside the system (until we start executing user code)*/
 
 /*Choose the proper default configuration*/
 #if CMK_MEMORY_BUILD_DEFAULT
@@ -305,6 +305,7 @@ void CmiMemoryInit(argv)
 {
   CmiMemoryIs_flag |= CMI_MEMORY_IS_OS;
 #if CMK_MEMORY_BUILD_OS_WRAPPED || CMK_MEMORY_BUILD_GNU_HOOKS
+  CmiArgGroup("Converse","Memory module");
   meta_init(argv);
 #endif
   CmiOutOfMemoryInit();
@@ -558,6 +559,7 @@ The locking code is common to all implementations except OS-builtin.
 
 void CmiMemoryInit(char **argv)
 {
+  CmiArgGroup("Converse","Memory module");
   meta_init(argv);
   CmiOutOfMemoryInit();
 }
index c614ad469a9aaa47e7c1a8ab7cc4948b7836f4b6..a2d11a341168d23d46731202bf0077398a6e27c7 100644 (file)
@@ -2249,6 +2249,11 @@ extern "C" void CkReduce(void *msg, int size, CmiReduceMergeFn mergeFn) {
       numLocal ++;
     }
   }
+  
+  /* Since the current message is passed is as "local" to the merge function,
+   * and it will not be nullified in the upcoming loop, make it NULL explicitely. */
+  ((workThreadInfo*)cta(threadinfo))->reduceMsg = NULL;
+  
   void **msgLocal = (void**)malloc(sizeof(void*)*(numLocal-1));
   for (int j=0; j<cva(numNodes); j++){
     for(int i=0;i<cva(bgMach).numWth;i++){
@@ -2261,7 +2266,7 @@ extern "C" void CkReduce(void *msg, int size, CmiReduceMergeFn mergeFn) {
   CmiAssert(count==numLocal-1);
   msg = mergeFn(&size, msg, msgLocal, numLocal-1);
   CmiReduce(msg, size, mergeFn);
-  CmiPrintf("Called CmiReduce %d\n",CmiMyPe());
+  //CmiPrintf("Called CmiReduce %d\n",CmiMyPe());
   for (int i=0; i<numLocal-1; ++i) CmiFree(msgLocal[i]);
   free(msgLocal);
 }
index 3ed7df718d557c09cf72e44eef7ecdaeb55b5b5d..01853f05eb946e55634888a921bff26e78a3d6c4 100644 (file)
@@ -41,15 +41,15 @@ int main(void) {
   arr.init(domain);
 
   //arr[0] = 10;
-  arr[Point<1>(0)] = 10000;
-  arr[Point<1>(1)] = 20;
-  arr[Point<1>(8)] = 200;
+  arr[0] = 10000;
+  arr[1] = 20;
+  arr[8] = 200;
 
   //Array<int> aaa;
   //aaa(Domain<1>(Range(3));
 
   for (int i = 0; i < arr.size(); i++) {
-    cout << i << " -> " << arr[i] << endl;
+    cout << i << ": " << arr[i] << endl;
   }
 
   cout << endl;
@@ -58,7 +58,7 @@ int main(void) {
   at.test1();
 
   for (int i = 0; i < at.test.size(); i++) {
-    cout << i << " -> " << at.test[i] << endl;
+    cout << i << ": " << at.test[i] << endl;
   }
 
   return 0;
index ed3cfc9194594b834e8392b7306fce1e6a6979c6..36de6660247afcb7bb5f614855ced74af361e1b1 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef ARRAY_H
 #define ARRAY_H
 
+#include <charm++.h>
+
 namespace CharjArray {
   class Range {
   public:
@@ -45,40 +47,44 @@ namespace CharjArray {
 
   enum ArrayType { RECT, JAGGED, ROW_MAJOR, COL_MAJOR };
  
-  template<class type, int dims = 1, int atype = RECT>
+  template<class type, int dims = 1, ArrayType atype = RECT>
   class Array {
   private:
     Domain<dims> domain;
     type *block;
-    bool initialized;
 
   public:
-    Array() : initialized(false) {}
+    Array(Domain<dims> domain_) {
+      init(domain_);
+    }
 
-    void init(Domain<dims> domain_) {
+    void init(Domain<dims> &domain_) {
       domain = domain_;
       if (atype == RECT)
        block = new type[domain.size()];
-      initialized = true;
     }
 
     ~Array() {
       delete block;
     }
     
+    type* operator[] (const Domain<dims> &domain) {
+      return block[domain.ranges[0].size];
+    }
+
     type& operator[] (const Point<dims> &point) {
       return block[point.ranges[0].size];
-      //return block[index];
     }
-    
-    /*Array<type, dims, atype>& operator[] (const Domain<dims> &domain) {
-      
-      }*/
+
+    type& operator[] (const int index) {
+      return block[index];
+    }
 
     int size() {
       return domain.size();
     }
 
+    void pup(PUP::er& p) { }
   };
 }
 
index 53ebbb230ba5c141b01635db2557f2731ada640d..5c26db6fd51254c968667a8a2572f9706d3c0dd3 100644 (file)
@@ -853,6 +853,7 @@ primaryExpression
     |   literal
     |   newExpression
     |   qualifiedIdentExpression
+    |   domainExpression
     |   templateInstantiation
         (   s=SUPER
             (   arguments
index 341c07b37f1d825e019f02a0dd99a6fa4e545eda..1b549e247c96883dbbe2086401e95287b3a1a8fc 100644 (file)
@@ -6,14 +6,26 @@ charjSource_ci(basename, pd, imports, types, ros, debug) ::=
 // interface for <basename>
 <imports; separator="\n">
 <types; separator="\n\n">
-<if(ros)>
 
 module <basename>_readonly {
-    <ros; separator="\n">
-}
+<if(ros)>
+    <charjReadonly_ci(pds = pd, ros = ros)>
 <endif>
+
+}
+
 >>
 
+charjReadonly_ci(pds, ros) ::=
+<<
+<if(first(pds))>namespace <first(pds)>
+{
+    <charjReadonly_ci(pds = rest(pds), ros = ros)>
+} // namespace <first(pds)>
+<else>
+<ros; separator="\n">
+<endif>
+>>
 
 charjSource_h(basename, pd, imports, types, ros, debug) ::=
 <<
@@ -73,9 +85,9 @@ readonlys_cc(pds, ros, basename) ::=
 {
     <readonlys_cc(pds = rest(pds), ros = ros, basename = basename)>
 } // namespace <first(pds)>
+#include "<basename>_readonly.def.h"
 <else>
 <ros; separator="\n">
-#include "<basename>_readonly.def.h"
 <endif>
 
 >>
@@ -121,22 +133,22 @@ chare_epilogue_h(sym) ::=
 <type_epilogue_h(sym)>
 >>
 
-classDeclaration_h(sym, ident, ext, csds, tident, hasDefaultCtor) ::=
+classDeclaration_h(sym, ident, ext, csds, tident) ::=
 <<
 <type_preamble_h(sym)>
 <if(tident)>
-<templateDeclaration_h_cont(pds = sym.packageNames, sym = sym, ident = ident, ext = ext, csds = csds, tident = tident, hasDefaultCtor = hasDefaultCtor)>
+<templateDeclaration_h_cont(pds = sym.packageNames, sym = sym, ident = ident, ext = ext, csds = csds, tident = tident)>
 <else>
-<classDeclaration_h_cont(pds = sym.packageNames, sym = sym, ident = ident, ext = ext, csds = csds, hasDefaultCtor = hasDefaultCtor)>
+<classDeclaration_h_cont(pds = sym.packageNames, sym = sym, ident = ident, ext = ext, csds = csds)>
 <endif>
 <type_epilogue_h(sym)>
 >>
 
-classDeclaration_h_cont(pds, sym, ident, ext, csds, hasDefaultCtor) ::=
+classDeclaration_h_cont(pds, sym, ident, ext, csds) ::=
 <<
 <if(first(pds))>namespace <first(pds)>
 {
-    <classDeclaration_h_cont(pds = rest(pds), sym = sym, ident = ident, ext = ext, csds = csds, hasDefaultCtor = hasDefaultCtor)>
+    <classDeclaration_h_cont(pds = rest(pds), sym = sym, ident = ident, ext = ext, csds = csds)>
 } // namespace <first(pds)>
 <else>
 <if(ext)>
@@ -146,7 +158,7 @@ class <ident> {
 <endif>
 
     <csds; separator="\n\n">
-    <if(!hasDefaultCtor)>
+    <if(!sym.hasDefaultCtor)>
     public: <ident>();
     <endif>
     protected: void constructorHelper();
@@ -156,30 +168,30 @@ class <ident> {
 <endif>
 >>
 
-templateDeclaration_h(pds, sym, ident, ext, csds, tident, hasDefaultCtor, inits) ::=
+templateDeclaration_h(pds, sym, ident, ext, csds, tident, inits) ::=
 <<
 template \<class <tident; separator=", class ">\>
-<classDeclaration_h_cont(pds=pds, sym=sym, ident=ident, ext=ext, csds=csds, hasDefaultCtor=hasDefaultCtor, inits=inits)>
+<classDeclaration_h_cont(pds=pds, sym=sym, ident=ident, ext=ext, csds=csds, inits=inits)>
 >>
 
-classDeclaration_cc(sym, ident, ext, csds, hasDefaultCtor, inits) ::=
+classDeclaration_cc(sym, ident, ext, csds, inits) ::=
 <<
-<classDeclaration_cc_cont(pds = sym.packageNames, sym = sym, ident = ident, ext = ext, csds = csds, hasDefaultCtor = hasDefaultCtor, inits = inits)>
+<classDeclaration_cc_cont(pds = sym.packageNames, sym = sym, ident = ident, ext = ext, csds = csds, inits = inits)>
 >>
 
-classDeclaration_cc_cont(pds, sym, ident, ext, csds, hasDefaultCtor, inits) ::=
+classDeclaration_cc_cont(pds, sym, ident, ext, csds, inits) ::=
 <<
 <if(first(pds))>namespace <first(pds)>
 {
-    <classDeclaration_cc_cont(pds = rest(pds), sym = sym, ident = ident, ext = ext, csds = csds, hasDefaultCtor = hasDefaultCtor, inits = inits)>
+    <classDeclaration_cc_cont(pds = rest(pds), sym = sym, ident = ident, ext = ext, csds = csds, inits = inits)>
 } // namespace <first(pds)>
 <else>
-#ifdef _CHARJ_TRACE_ALL_METHODS || _CHARJ_TRACE_TRACED_METHODS
+#if _CHARJ_TRACE_ALL_METHODS || _CHARJ_TRACE_TRACED_METHODS
 #include \<trace-projections.h\>
 #endif
 <csds; separator="\n\n">
 
-<if(!hasDefaultCtor)>
+<if(!sym.hasDefaultCtor)>
 <sym.name>::<ident>()
 {
     constructorHelper();
@@ -193,7 +205,7 @@ void <sym.name>::constructorHelper()
 
 bool <sym.name>::_trace_registered = false;
 void <sym.name>::_initTrace() {
-    #ifdef _CHARJ_TRACE_ALL_METHODS || _CHARJ_TRACE_TRACED_METHODS
+    #if _CHARJ_TRACE_ALL_METHODS || _CHARJ_TRACE_TRACED_METHODS
     if (_trace_registered) return;
     <sym.traceInitializers; separator="\n">
     _trace_registered = true;
@@ -203,21 +215,21 @@ void <sym.name>::_initTrace() {
 >>
 
 
-chareDeclaration_cc(sym, ident, ext, csds, pupers, pupInits, hasDefaultCtor, needsMigration, inits) ::=
+chareDeclaration_cc(sym, ident, ext, csds, pupers, pupInits, needsMigration, inits) ::=
 <<
 #include "<ident>.decl.h"
-<chareDeclaration_cc_cont(pds = sym.packageNames, sym = sym, ident = ident, ext = ext, csds = csds, pupers = pupers, pupInits = pupInits, hasDefaultCtor = hasDefaultCtor, needsMigration = needsMigration, inits = inits)>
+<chareDeclaration_cc_cont(pds = sym.packageNames, sym = sym, ident = ident, ext = ext, csds = csds, pupers = pupers, pupInits = pupInits, needsMigration = needsMigration, inits = inits)>
 #include "<ident>.def.h"
 >>
 
-chareDeclaration_cc_cont(pds, sym, ident, ext, csds, pupers, pupInits, hasDefaultCtor, needsMigration, inits) ::=
+chareDeclaration_cc_cont(pds, sym, ident, ext, csds, pupers, pupInits, needsMigration, inits) ::=
 <<
 <if(first(pds))>namespace <first(pds)>
 {
-    <chareDeclaration_cc_cont(pds = rest(pds), sym = sym, ident = ident, ext = ext, csds = csds, pupers = pupers, pupInits = pupInits, hasDefaultCtor = hasDefaultCtor, needsMigration = needsMigration, inits = inits)>
+    <chareDeclaration_cc_cont(pds = rest(pds), sym = sym, ident = ident, ext = ext, csds = csds, pupers = pupers, pupInits = pupInits, needsMigration = needsMigration, inits = inits)>
 } // namespace <first(pds)>
 <else>
-#ifdef _CHARJ_TRACE_ALL_METHODS || _CHARJ_TRACE_TRACED_METHODS
+#if _CHARJ_TRACE_ALL_METHODS || _CHARJ_TRACE_TRACED_METHODS
 #include \<trace-projections.h\>
 #endif
 <csds; separator="\n\n">
@@ -232,18 +244,26 @@ void <sym.name>::pupInitMethod()
 void <sym.name>::pup(PUP::er &p)
 {
 <if(pupInits)>
-    pupInitMethod();
+    if(p.isUnpacking())
+        pupInitMethod();
 
 <endif>
     <pupers; separator="\n">
 }
 
-<if(!hasDefaultCtor)>
+<if(!sym.hasDefaultCtor)>
+<if(sym.isMainChare)>
+<sym.name>::<ident>(CkArgMsg* msg)
+{
+    constructorHelper();
+}
+<else>
 <sym.name>::<ident>()
 {
     constructorHelper();
 }
 <endif>
+<endif>
 
 void <sym.name>::constructorHelper()
 {
@@ -259,7 +279,7 @@ void <sym.name>::constructorHelper()
 
 bool <sym.name>::_trace_registered = false;
 void <sym.name>::_initTrace() {
-    #ifdef _CHARJ_TRACE_ALL_METHODS || _CHARJ_TRACE_TRACED_METHODS
+    #if _CHARJ_TRACE_ALL_METHODS || _CHARJ_TRACE_TRACED_METHODS
     if (_trace_registered) return;
     <sym.traceInitializers; separator="\n">
     _trace_registered = true;
@@ -268,19 +288,19 @@ void <sym.name>::_initTrace() {
 <endif>
 >>
 
-chareDeclaration_h(sym, ident, ext, csds, needsPupInit, hasDefaultCtor, needsMigration) ::=
+chareDeclaration_h(sym, ident, ext, csds, needsPupInit, needsMigration) ::=
 <<
 <chare_preamble_h(sym)>
 #include "<ident>.decl.h"
-<chareDeclaration_h_cont(pds = sym.packageNames, sym = sym, ident = ident, ext = ext, csds = csds, needsPupInit = needsPupInit, hasDefaultCtor = hasDefaultCtor, needsMigration = needsMigration)>
+<chareDeclaration_h_cont(pds = sym.packageNames, sym = sym, ident = ident, ext = ext, csds = csds, needsPupInit = needsPupInit, needsMigration = needsMigration)>
 <chare_epilogue_h(sym)>
 >>
 
-chareDeclaration_h_cont(pds, sym, ident, ext, csds, needsPupInit, hasDefaultCtor, needsMigration) ::=
+chareDeclaration_h_cont(pds, sym, ident, ext, csds, needsPupInit, needsMigration) ::=
 <<
 <if(first(pds))>namespace <first(pds)>
 {
-    <chareDeclaration_h_cont(pds = rest(pds), sym = sym, ident = ident, ext = ext, csds = csds, needsPupInit = needsPupInit, hasDefaultCtor = hasDefaultCtor, needsMigration = needsMigration)>
+    <chareDeclaration_h_cont(pds = rest(pds), sym = sym, ident = ident, ext = ext, csds = csds, needsPupInit = needsPupInit, needsMigration = needsMigration)>
 } // namespace <first(pds)>
 <else>
 <if(ext)>/* superclass: <ext> */<endif>
@@ -290,9 +310,13 @@ class <ident>: public CBase_<ident> {
     private: void pupInitMethod();
     <endif>
     public: void pup(PUP::er& p);
-    <if(!hasDefaultCtor)>
+    <if(!sym.hasDefaultCtor)>
+    <if(sym.isMainChare)>
+    public: <ident>(CkArgMsg *msg);
+    <else>
     public: <ident>();
     <endif>
+    <endif>
     protected: void constructorHelper();
     <if(needsMigration)>
     public: <ident>(CkMigrateMessage*);
@@ -303,13 +327,16 @@ class <ident>: public CBase_<ident> {
 <endif>
 >>
 
-chareDeclaration_ci(sym, chareType, arrayDim, ident, ext, csds) ::=
+chareDeclaration_ci(basename, sym, chareType, arrayDim, ident, ext, csds) ::=
 <<
 <if(sym.isMainChare)>main<endif>module <ident> {
 <if(ext)>
     extern module <ext>;
 <endif>
     <sym.Externs:{ext| extern module <ext>;
+<if(sym.isMainChare)>
+extern module <basename>_readonly;
+<endif>
     }>
     <chareDeclaration_ci_cont(pds = sym.packageNames, chareType = chareType, arrayDim = arrayDim, ident = ident, ext = ext, csds = csds)>
 }
@@ -345,11 +372,11 @@ funcMethodDecl_cc(classSym, methodSym, modl, gtpl, ty, id, fpl, adl, block) ::=
 <<
 <modl><ty><gtpl> <classSym.Name>::<id><fpl><adl>
 {
-    #ifdef _CHARJ_TRACE_ALL_METHODS<if(methodSym.isTraced)> || _CHARJ_TRACE_TRACED_METHODS<endif>
+    #if _CHARJ_TRACE_ALL_METHODS<if(methodSym.isTraced)> || _CHARJ_TRACE_TRACED_METHODS<endif>
     int _charj_method_trace_timer = CkWallTimer();
     #endif
     <block>
-    #ifdef _CHARJ_TRACE_METHODS<if(methodSym.isTraced)> || _CHARJ_TRACE_TRACED_METHODS<endif>
+    #if _CHARJ_TRACE_METHODS<if(methodSym.isTraced)> || _CHARJ_TRACE_TRACED_METHODS<endif>
     traceUserBracketEvent(<methodSym.traceID>, _charj_method_trace_timer, CkWallTimer());
     #endif
 }
index 853521905c8ae488058c4e779e995ad264add981..146d5c4687eb1b774dfbd5fce32006303bbf2c0b 100644 (file)
@@ -239,7 +239,10 @@ objectType
     |   ^(REFERENCE_TYPE qualifiedTypeIdent domainExpression?)
     |   ^(POINTER_TYPE qualifiedTypeIdent domainExpression?)
         {
-            astmod.dealWithEntryMethodParam($POINTER_TYPE, $POINTER_TYPE.tree);
+            // TODO: This breaks all pointer types inside chares not used for sending
+            // them in entry methods, converting them to object types, which breaks
+            // Arrays inside chares.
+            //astmod.dealWithEntryMethodParam($POINTER_TYPE, $POINTER_TYPE.tree);
         }
     ;
 
@@ -435,6 +438,7 @@ primaryExpression
     |   GETMYPE
     |   GETMYNODE
     |   GETMYRANK
+    |   domainExpression
     ;
     
 explicitConstructorCall
@@ -479,7 +483,7 @@ rangeExpression
     ;
 
 rangeList
-    :   rangeExpression (','! rangeExpression)*
+    :   rangeExpression+
     ;
 
 domainExpression
index d57aeb9468d4ef49e759a7f18e42543d31bcc09c..607cd302b102da1ad9270fdae19254143d9be3ea 100644 (file)
@@ -442,6 +442,7 @@ primaryExpression
     |   GETMYPE
     |   GETMYNODE
     |   GETMYRANK
+    |   domainExpression
     ;
     
 explicitConstructorCall
@@ -556,6 +557,7 @@ entryPrimaryExpression
     |   GETMYPE
     |   GETMYNODE
     |   GETMYRANK
+    |   domainExpression
     ;
 
 literal 
@@ -582,7 +584,7 @@ rangeExpression
     ;
 
 rangeList
-    :   rangeExpression (','! rangeExpression)*
+    :   rangeExpression+
     ;
 
 domainExpression
index b21cf0181671b00bdd63482b179aa96ddbb6c1f4..8d6a73d913f581ea3a04d28dd8e56e9892332d5f 100644 (file)
@@ -150,22 +150,19 @@ typeDeclaration
                 ident={$IDENT.text}, 
                 ext={$su.st}, 
                 csds={$csds},
-                hasDefaultCtor={currentClass.hasDefaultConstructor},
                 inits={initializers})
         -> {emitH()}?  classDeclaration_h(
                 sym={currentClass},
                 ident={$IDENT.text}, 
                 ext={$su.st}, 
-                csds={$csds},
-                hasDefaultCtor={currentClass.hasDefaultConstructor})
+                csds={$csds})
         ->
     |   ^('template' (i0+=IDENT*) ^('class' i1=IDENT (^('extends' su=type))? (^('implements' type+))? (csds+=classScopeDeclaration)*))
         -> {emitH()}? templateDeclaration_h(
             tident={$i0},
             ident={$i1.text},
             ext={$su.st},
-            csds={$csds},
-            hasDefaultCtor={currentClass.hasDefaultConstructor})
+            csds={$csds})
         -> 
     |   ^(INTERFACE IDENT (^('extends' type+))? interfaceScopeDeclaration*)
         -> template(t={$text}) "/*INTERFACE-not implemented*/ <t>"
@@ -174,7 +171,7 @@ typeDeclaration
     |   ^(TYPE chareType IDENT (^('extends' type))? (^('implements' type+))?
         {
             currentClass = (ClassSymbol)$IDENT.def;
-            needsMigration = currentClass.isChareArray && !currentClass.hasMigrationConstructor;
+            needsMigration = currentClass.isChareArray && !currentClass.hasMigrationCtor;
 
             for (VariableInitializer init : currentClass.initializers) {
                 initializers.add(init.emit());
@@ -188,10 +185,10 @@ typeDeclaration
                 csds={$csds},
                 pupInits={currentClass.generateInits()},
                 pupers={currentClass.generatePUPers()},
-                hasDefaultCtor={currentClass.hasDefaultConstructor},
                 needsMigration={needsMigration},
                 inits={initializers})
         -> {emitCI()}? chareDeclaration_ci(
+                basename={basename()},
                 sym={currentClass},
                 chareType={$chareType.st},
                 arrayDim={null},
@@ -204,7 +201,6 @@ typeDeclaration
                 ext={$su.st}, 
                 csds={$csds},
                 needsPupInit={currentClass.generateInits() != null},
-                hasDefaultCtor={currentClass.hasDefaultConstructor},
                 needsMigration={needsMigration})
         ->
     ;
@@ -286,13 +282,13 @@ classScopeDeclaration
                 fpl={$f.st}, 
                 block={$b.st})
         ->
-    |   ^(PRIMITIVE_VAR_DECLARATION modifierList? simpleType variableDeclaratorList[null, false])
+    |   ^(PRIMITIVE_VAR_DECLARATION modifierList? simpleType variableDeclaratorList[null])
         -> {emitH()}? class_var_decl(
             modl={$modifierList.st},
             type={$simpleType.st},
             declList={$variableDeclaratorList.st})
         ->
-    |   ^(OBJECT_VAR_DECLARATION modifierList? objectType variableDeclaratorList[$objectType.st, false])
+    |   ^(OBJECT_VAR_DECLARATION modifierList? objectType variableDeclaratorList[$objectType.st])
         -> {emitH()}? class_var_decl(
             modl={$modifierList.st},
             type={$objectType.st},
@@ -345,39 +341,34 @@ classScopeDeclaration
 interfaceScopeDeclaration
     :   ^(FUNCTION_METHOD_DECL modifierList? genericTypeParameterList? type IDENT formalParameterList)
         -> template(t={$text}) "/*interfaceScopeDeclarations-not implemented */ <t>"
-    |   ^(PRIMITIVE_VAR_DECLARATION modifierList? simpleType variableDeclaratorList[$simpleType.st, false])
+    |   ^(PRIMITIVE_VAR_DECLARATION modifierList? simpleType variableDeclaratorList[$simpleType.st])
         -> template(t={$text}) "/*interfaceScopeDeclarations-not implemented */ <t>"
-    |   ^(OBJECT_VAR_DECLARATION modifierList? objectType variableDeclaratorList[$objectType.st, false])
+    |   ^(OBJECT_VAR_DECLARATION modifierList? objectType variableDeclaratorList[$objectType.st])
         -> template(t={$text}) "/*interfaceScopeDeclarations-not implemented */ <t>"
     ;
 
-variableDeclaratorList[StringTemplate obtype, boolean output]
-    :   ^(VAR_DECLARATOR_LIST (var_decls+=variableDeclarator[obtype, output])+ )
+variableDeclaratorList[StringTemplate obtype]
+    :   ^(VAR_DECLARATOR_LIST (var_decls+=variableDeclarator[obtype])+ )
         -> var_decl_list(var_decls={$var_decls})
     ;
 
-variableDeclarator[StringTemplate obtype, boolean output]
-    :   ^(VAR_DECLARATOR id=variableDeclaratorId[output] initializer=variableInitializer[obtype, output]?)
-        -> {$output && emitCC()}? var_decl_cc(id={$id.st}, initializer={$initializer.st})
-        -> {$output && emitH()}?  var_decl_h(id={$id.st}, initializer={$initializer.st})
-        -> {$output && emitCI()}? var_decl_ci(id={$id.st}, initializer={$initializer.st})
-        -> {!$output && emitCC()}? var_decl_cc(id={$id.st})
-        -> {!$output && emitH()}?  var_decl_h(id={$id.st})
-        -> {!$output && emitCI()}? var_decl_ci(id={$id.st})
+variableDeclarator[StringTemplate obtype]
+    :   ^(VAR_DECLARATOR id=variableDeclaratorId initializer=variableInitializer[obtype]?)
+        -> {emitCC()}? var_decl_cc(id={$id.st}, initializer={$initializer.st})
+        -> {emitH()}?  var_decl_h(id={$id.st}, initializer={$initializer.st})
+        -> {emitCI()}? var_decl_ci(id={$id.st}, initializer={$initializer.st})
         ->
     ; 
     
-variableDeclaratorId[boolean output]
+variableDeclaratorId
     :   ^(IDENT de=domainExpression[null]?)
-        -> {$output}? var_decl_id(id={$IDENT.text}, domainExp={$de.st})
-        -> {!$output}? var_decl_id(id={$IDENT.text})
-        ->
+        -> var_decl_id(id={$IDENT.text}, domainExp={$de.st})
     ;
 
-variableInitializer[StringTemplate obtype, boolean output]
+variableInitializer[StringTemplate obtype]
     :   arrayInitializer
         -> {$arrayInitializer.st}
-    |   newExpression[obtype, output]
+    |   newExpression[obtype]
         -> {$newExpression.st}
     |   expression
         -> {$expression.st}
@@ -409,7 +400,7 @@ domainExpression[List<StringTemplate> otherParams]
     ;
 
 arrayInitializer
-    :   ^(ARRAY_INITIALIZER variableInitializer[null, false]*)
+    :   ^(ARRAY_INITIALIZER variableInitializer[null]*)
         -> template(t={$text}) "/* arrayInitializer-not implemented */ <t>"
     ;
 
@@ -533,7 +524,7 @@ simpleType
         -> simple_type(typeID={$primitiveType.st}, arrDeclList={$domainExpression.st})
     ;
 
-objectType
+objectType //[boolean forNewExpression]
     : proxyType -> {$proxyType.st;}
     | nonProxyType -> {$nonProxyType.st}
     ;
@@ -616,12 +607,12 @@ formalParameterList
     ;
     
 formalParameterStandardDecl
-    :   ^(FORMAL_PARAM_STD_DECL lms=localModifierList? t=type vdid=variableDeclaratorId[true])
+    :   ^(FORMAL_PARAM_STD_DECL lms=localModifierList? t=type vdid=variableDeclaratorId)
         -> formal_param_decl(modList={$lms.st}, type={$t.st}, declID={$vdid.st})
     ;
     
 formalParameterVarargDecl
-    :   ^(FORMAL_PARAM_VARARG_DECL localModifierList? type variableDeclaratorId[true])
+    :   ^(FORMAL_PARAM_VARARG_DECL localModifierList? type variableDeclaratorId)
         -> template(t={$text}) "/*formal parameter varargs not implemented*/ <t>"
     ;
     
@@ -650,12 +641,12 @@ blockStatement
 
 
 localVariableDeclaration
-    :   ^(PRIMITIVE_VAR_DECLARATION localModifierList? simpleType vdl=variableDeclaratorList[null, true])
+    :   ^(PRIMITIVE_VAR_DECLARATION localModifierList? simpleType vdl=variableDeclaratorList[null])
         -> local_var_decl(
             modList={$localModifierList.st},
             type={$simpleType.st},
             declList={$vdl.st})
-    |   ^(OBJECT_VAR_DECLARATION localModifierList? objectType vdl=variableDeclaratorList[$objectType.st, true])
+    |   ^(OBJECT_VAR_DECLARATION localModifierList? objectType vdl=variableDeclaratorList[$objectType.st])
         -> local_var_decl(
             modList={$localModifierList.st},
             type={$objectType.st},
@@ -858,10 +849,12 @@ primaryExpression
     |   explicitConstructorCall
         -> {$explicitConstructorCall.st}
     |   ^(ARRAY_ELEMENT_ACCESS pe=primaryExpression ex=expression)
-        -> template(pe={$pe.st}, ex={$ex.st}) "<pe>[<ex>]"
+        -> {$pe.start.symbolType != null && $pe.start.symbolType instanceof PointerType}?
+               template(pe={$pe.st}, ex={$ex.st}) "(*(<pe>))[<ex>]"
+        -> template(pe={$pe.st}, ex={$ex.st}) "(<pe>)[<ex>]"
     |   literal
         -> {$literal.st}
-    |   newExpression[null, false]
+    |   newExpression[null]
         -> {$newExpression.st}
     |   THIS
         -> {%{$start.getText()}}
@@ -879,7 +872,8 @@ primaryExpression
         ->  template() "CkMyNode()"
     |   GETMYRANK
         ->  template() "CkMyRank()"
-
+    |   domainExpression[null]
+        ->  {$domainExpression.st}
     ;
     
 explicitConstructorCall
@@ -894,11 +888,9 @@ arrayTypeDeclarator
         -> template(t={$text}) "<t>"
     ;
 
-newExpression[StringTemplate obtype, boolean output] returns [StringTemplate initArray]
+newExpression[StringTemplate obtype]
     :   ^(NEW_EXPRESSION arguments? domainExpression[$arguments.args])
-        -> {$output}? template(domain={$domainExpression.st},type={$obtype}) "new <type>(<domain>)"
-        -> {!$output}? template() ""
-        ->
+        -> template(domain={$domainExpression.st},type={$obtype}) "new <type>(<domain>)"
     |   ^(NEW proxyType arguments)
         -> template(t={$proxyType.st}, a={$arguments.st}) "<t>::ckNew(<a>)"
     |   ^(NEW nonProxyType arguments)
index 28a37eb68392d3819a5f29b781e157ab4549ee61..c46e7e1e3e290379ff254caa4c607cb26b6145aa 100644 (file)
@@ -27,8 +27,8 @@ public class ClassSymbol extends SymbolWithScope implements Scope, Type {
     public boolean isChare = false;
     public boolean isMainChare = false;
     public boolean isChareArray = false;
-    public boolean hasDefaultConstructor = false;
-    public boolean hasMigrationConstructor = false;
+    public boolean hasDefaultCtor = false;
+    public boolean hasMigrationCtor = false;
 
     public CharjAST migrationCtor = null;
 
@@ -64,6 +64,12 @@ public class ClassSymbol extends SymbolWithScope implements Scope, Type {
         this.includes.add("iostream");
         this.usings.add("std::cout");
         this.usings.add("std::endl");
+
+        // For now always include the array package
+        this.includes.add("Array.h");
+        this.usings.add("CharjArray::Array");
+        this.usings.add("CharjArray::Domain");
+        this.usings.add("CharjArray::Range");
     }
 
     public Scope getEnclosingScope() {
diff --git a/src/langs/charj/src/charj/translator/ExternalSymbol.java b/src/langs/charj/src/charj/translator/ExternalSymbol.java
new file mode 100644 (file)
index 0000000..dc98e90
--- /dev/null
@@ -0,0 +1,9 @@
+
+package charj.translator;
+
+public class ExternalSymbol extends ClassSymbol implements Scope, Type {
+    
+    public ExternalSymbol(SymbolTable symtab, String name) {
+        super(symtab, name);
+    }
+}
index fb39e5126c4258e4e0caa2d90bcc6be40b1ef29e..cf25cafb9293e63059cc9f3d56e10941ddb65024 100644 (file)
@@ -8,7 +8,7 @@ options {
 }
 
 @header {
-package charj.translator;
+    package charj.translator;
 }
 
 @members {
@@ -29,25 +29,34 @@ bottomup
     :   exitMethod
     ;
 
+classType
+    :   CLASS
+    |   CHARE
+    |   GROUP
+    |   NODEGROUP
+    |   MAINCHARE
+    |   ^(CHARE_ARRAY ARRAY_DIMENSION)
+    ;
+
 enterClass
-    :   ^(TYPE .* IDENT
-            (^('extends' .*))?
-            (^('implements' .*))?
-            (^((FUNCTION_METHOD_DECL | ENTRY_FUNCTION_DECL | PRIMITIVE_VAR_DECLARATION |
-                OBJECT_VAR_DECLARATION | CONSTRUCTOR_DECL | ENTRY_CONSTRUCTOR_DECL) .*))*)
+    :   ^(TYPE classType IDENT
+        (^('extends' .*))?
+        (^('implements' .*))?
+        (^((FUNCTION_METHOD_DECL | ENTRY_FUNCTION_DECL | PRIMITIVE_VAR_DECLARATION |
+            OBJECT_VAR_DECLARATION | CONSTRUCTOR_DECL | ENTRY_CONSTRUCTOR_DECL) .*))*)
         {
             currentClass = (ClassSymbol)$IDENT.def.type;
+            currentClass.isMainChare = $classType.text.equals("mainchare");
         }
     ;
 
 enterDefaultConstructor
-    :    FORMAL_PARAM_LIST
+    :   FORMAL_PARAM_LIST
         {
             if (($FORMAL_PARAM_LIST.hasParentOfType(CONSTRUCTOR_DECL) ||
-                 $FORMAL_PARAM_LIST.hasParentOfType(ENTRY_CONSTRUCTOR_DECL)) &&
-                currentClass != null) {
-                currentClass.hasDefaultConstructor = true;
-            }
+                 $FORMAL_PARAM_LIST.hasParentOfType(ENTRY_CONSTRUCTOR_DECL)) && currentClass != null)
+
+                    currentClass.hasDefaultCtor = true;
         }
     ;
 
@@ -57,10 +66,12 @@ enterMigrationConstructor
             ))
         {
             if (($FORMAL_PARAM_LIST.hasParentOfType(CONSTRUCTOR_DECL) ||
-                 $FORMAL_PARAM_LIST.hasParentOfType(ENTRY_CONSTRUCTOR_DECL)) &&
-                currentClass != null && $IDENT.text.equals("CkMigrateMessage")) {
-                currentClass.hasMigrationConstructor = true;
-            }
+                 $FORMAL_PARAM_LIST.hasParentOfType(ENTRY_CONSTRUCTOR_DECL)) && currentClass != null)
+
+                if($IDENT.text.equals("CkMigrateMessage")) 
+                    currentClass.hasMigrationCtor = true;
+                else if($IDENT.text.equals("CkArgMsg") && currentClass.isMainChare)
+                    currentClass.hasDefaultCtor = true;
         }
     ;
 
index 4e4059b4e504503544b5227787bc595a21457872..c195b12dad46e22c16a025c18beac0229b12c2b1 100644 (file)
@@ -24,11 +24,14 @@ public class MethodSymbol
     public boolean isCtor = false;
     public boolean isTraced = false;
 
-    public MethodSymbol(SymbolTable symtab)
-    {
+    public MethodSymbol(SymbolTable symtab) {
         super(symtab);
     }
 
+    public MethodSymbol(SymbolTable symtab, String name) {
+        super(symtab, name);
+    }
+
     public MethodSymbol(
             SymbolTable symtab,
             String name,
index 1bb5706fe0abffa35909737d53fa993c6f6ce06e..7bbdfc076ed5331f1a0c900caefa54eb89cd919d 100644 (file)
@@ -24,8 +24,8 @@ public class PackageScope extends SymbolWithScope {
 
     /** See if type is already defined in this package.  If not, look
      *  for type on the disk in same package.  For example, first time
-     *  charj.lang.Chare fails to resolve.  Load from disk and put File
-     *  in package io which is in package charj.  Next time, File will
+     *  charj.lang.Chare fails to resolve.  Load from disk and put Chare
+     *  in package lang which is in package charj.  Next time, Chare will
      *  be found.
      */
     public ClassSymbol resolveType(String type) {
@@ -34,6 +34,9 @@ public class PackageScope extends SymbolWithScope {
                 " PackageScope.resolveType(" + type + 
                 "): examine " + toString());
 
+        ClassSymbol cs = symtab.primitiveTypes.get(type);
+        if (cs != null) return cs;
+
         // break off leading package names and look them up,
         // then look up the base class name within the appropriate package scope.
         String[] nameParts = type.split("[.]", 2);
index efe6a6fd5f68a84c3aaa5963a4a82e6411ca6d58..9abbb0498f1302e577cac8afda74a2d7fadf57c2 100644 (file)
@@ -237,6 +237,7 @@ primaryExpression returns [Type type]
         {
             Type et = $e.type;
             if (et instanceof ProxyType) et = ((ProxyType)et).baseType;
+            if (et instanceof PointerType) et = ((PointerType)et).baseType;
             ClassSymbol cxt = (ClassSymbol)et;
             Symbol s;
             if (cxt == null) {
@@ -337,6 +338,14 @@ type returns [Type sym]
     //System.out.println("symbolType: " + $start.symbolType);
     if (proxy && $start.symbolType != null) $start.symbolType = new ProxyType(symtab, $start.symbolType);
     if (pointer && $start.symbolType != null) $start.symbolType = new PointerType(symtab, $start.symbolType);
+
+    // TODO: Special case for Arrays, should be fixed
+    if (typeText.equals("Array") && $start.symbolType == null) {
+        System.out.println("found Array XXXX");
+        ClassSymbol cs = new ClassSymbol(symtab, "Array");
+        $start.symbolType = new PointerType(symtab, cs);
+    }
+
     $sym = $start.symbolType;
     if ($sym == null) System.out.println("Couldn't resolve type: " + typeText);
 }
index 83e3bb5edbdf20df1333b061334e853f081d0380..72b8e84ed1bc5009d870348e55107281d8128fa5 100644 (file)
@@ -74,6 +74,13 @@ public class SymbolTable {
             lang.define(entry.getKey(), c);
             c.isPrimitive = true;
         }
+
+        defaultPkg.define("CkArgMsg", new ExternalSymbol(this, "CkArgMsg"));
+        defaultPkg.define("CkPrintf", new MethodSymbol(this, "CkPrintf"));
+        defaultPkg.define("CkNumPes", new MethodSymbol(this, "CkNumPes"));
+        defaultPkg.define("CkMyPe", new MethodSymbol(this, "CkMyPe"));
+        defaultPkg.define("CkExit", new MethodSymbol(this, "CkExit"));
+        defaultPkg.define("CmiWallTimer", new MethodSymbol(this, "CmiWallTimer"));
     }
 
     public ClassSymbol resolveBuiltinType(String type) {
index fce9d4f1aa85f708722ae5962e5265f621a17fd1..9f8b210b437d1a47726d768057fc9a7f4ee7e017 100644 (file)
@@ -379,8 +379,8 @@ public class Translator {
         }
 
         // Compile c++ output
-        cmd = charmc + " -c " + baseTempFilename + ".cc" + 
-            " -o " + baseTempFilename + ".o";
+        cmd = charmc + " -I" + m_stdlib + "/charj/libs -c " +
+            baseTempFilename + ".cc" + " -o " + baseTempFilename + ".o";
         retVal = exec(cmd, currentDir);
         if (retVal != 0) {
             error("Could not compile generated C++ file");
diff --git a/src/langs/charj/src/charj/translator/VariableInitializer.java b/src/langs/charj/src/charj/translator/VariableInitializer.java
new file mode 100644 (file)
index 0000000..066b7b9
--- /dev/null
@@ -0,0 +1,60 @@
+package charj.translator;
+
+import org.antlr.runtime.*;
+import org.antlr.runtime.tree.*;
+import org.antlr.stringtemplate.*;
+import org.antlr.stringtemplate.StringTemplate;
+import org.antlr.stringtemplate.language.AngleBracketTemplateLexer;
+
+/** 
+ *  Encapsulates a "variableInitializer" in the CharjAST, used for sending the
+ *  reference of the AST to the emitter. 
+ */
+public class VariableInitializer {
+    private CharjAST init;
+    private CharjAST ident;
+
+    public VariableInitializer(CharjAST init_, CharjAST ident_) {
+        init = init_;
+        ident = ident_;
+    }
+    
+    public static TreeAdaptor m_adaptor = new CommonTreeAdaptor() {
+        public Object create(Token token) {
+            return new CharjAST(token);
+        }
+        
+        public Object dupNode(Object t) {
+            if (t == null) {
+                return null;
+            }
+            return create(((CharjAST)t).token);
+        }
+    };
+
+    public String emit() {
+        CommonTree m_ast = (CommonTree)init;
+        CommonTreeNodeStream m_nodes = new CommonTreeNodeStream(m_ast);
+        m_nodes.setTreeAdaptor(m_adaptor);
+        CharjEmitter emitter = new CharjEmitter(m_nodes);
+        emitter.setTemplateLib(Translator.
+                               getTemplates(Translator.templateFile));
+        try {
+            StringTemplate st = 
+                (StringTemplate)emitter.expression().getTemplate();
+
+            StringTemplate st2 = new StringTemplate
+                ("<name> = <init>;", AngleBracketTemplateLexer.class);
+
+            st2.setAttribute("name", ident.def.name);
+            st2.setAttribute("init", st.toString());
+
+            return st2.toString();
+        } catch (RecognitionException ex) {
+            //TODO: Decouple Translator's error handling and mix with this
+            System.err.println(ex.getMessage());
+            ex.printStackTrace(System.err);
+            return "";
+        }
+    }
+}
\ No newline at end of file
index 623c81cf8f2d52b894350b7c7d4c06eedc5b0e32..fe5a4520a10a3fece5024534a966bb4f3da0504e 100644 (file)
@@ -1,14 +1,22 @@
 
-class ArrayTest {
-      Array<int> test[10];
+public mainchare ArrayTest {
+      public entry ArrayTest(CkArgMsg msg) {
+           thisProxy@entry1();
+      }
 
-      void test() {
-           test[0] = 0;
+      public entry void entry1() {
+           Array<int> test = new Array<int>([10]);
 
-          int i;
+          for (int i = 0; i < test.size(); i++) {
+               test[i] = i;
+           }
 
-          for (i = 0; i < 10; i++) {
-               test[i] = 0;
+           for (int i = 0; i < test.size(); i++) {
+                printf("%d\n", test[i]);
            }
+
+           delete test;
+
+           CkExit();
       }
 }
index 90b056bedb0bac4dee2147735138f70e781136e4..7a14076295734fdcffce1aa467a4f8962c469143 100644 (file)
@@ -22,10 +22,10 @@ INTERFACE: $(CIFILES)
        touch INTERFACE
 
 CkCache.o: CkCache.C $(HEADERS)
-       $(CHARMC) -c -o CkCache.o CkCache.C
+       $(CHARMC) -I../../.. -c -o CkCache.o CkCache.C
 
 clean:
        rm -f conv-host *.o *.decl.h *.def.h core  $(LIB) INTERFACE
 
 realclean: clean
-       rm -f $(LIBDEST) $(HEADERS)
\ No newline at end of file
+       rm -f $(LIBDEST) $(HEADERS)
index ad146ac9076d32a25b5344c72c9180ee7eaf6fda..e7c1f48dfd117508c5065116e281c53579b85319 100644 (file)
@@ -1,5 +1,5 @@
 CDIR=../../../..
-CHARMC=$(CDIR)/bin/charmc $(OPTS)
+CHARMC=$(CDIR)/bin/charmc $(OPTS) -I../../..
 FLAGS=-DEXTERIOR_BLACK_PIXEL_ELIMINATION
 
 HEADERS=liveViz.h liveViz.decl.h liveVizPoll.decl.h liveViz0.h colorScale.h ImageData.h
index 574e14befa1f384ae4a7bf068f2e486d6f27689f..9eeadad76cf16faf0db78f95b987e564ce5f8bc2 100644 (file)
@@ -213,7 +213,7 @@ void CpdPythonGroup::registerPersistent(CkCcsRequestMsg *msg) {
   pyMsg->unpack();
   CmiUInt4 pyReference = prepareInterpreter(pyMsg);
   PyEval_ReleaseLock();
-  CcsSendDelayedReply(msg->reply, sizeof(pyReference), &pyReference);
+  replyIntFn(this, &msg->reply, &pyReference);
   if (pyReference == 0) return;
   pyMsg->setInterpreter(pyReference);
   PythonIterator *iter = pyMsg->info.info;
@@ -226,7 +226,6 @@ void CpdPythonGroup::registerPersistent(CkCcsRequestMsg *msg) {
     else CkpvAccess(_debugEntryTable)[-ep].preProcess.push_back(dpc);
   }
   CkPrintf("[%d] Registering Persistent method (reference=%d)\n",CkMyPe(),pyReference);
-
 }
 
 #include "charmdebug_python.def.h"
index 01f5e20cfd19c2736a852ca20fa83c0ebe1a284d..852a0e665a7d48176494164988d83b5bbc120129 100644 (file)
@@ -60,9 +60,7 @@ public:
       }
       //CmiPrintf("GOT %d %d %d %d\n", start, end, block, stride);
       if (p<=end && p>=start) {
-          //if ((p-start)%stride == 0) ret = 1;
-          int n = (p-start)/stride*stride;
-          if ((p - n) < block) ret = 1;
+          if ((p-start)%stride < block) ret = 1;
           break;
       }
       str = strtok(NULL, ",");