added chare_types table for plain chares which store the chare types.
authorGengbin Zheng <gzheng@justice.(none)>
Wed, 27 Jan 2010 16:51:57 +0000 (10:51 -0600)
committerGengbin Zheng <gzheng@justice.(none)>
Wed, 27 Jan 2010 16:51:57 +0000 (10:51 -0600)
Added a new external function CkCreateLocalChare to allocate a new chare locally.

src/ck-core/ck.C
src/ck-core/init.C

index a7e497911eb85b9905356971a6eec490d331d9c2..b6151596beb065dd2495022dc527672bb3b5a6b9 100644 (file)
@@ -27,6 +27,7 @@ void automaticallySetMessagePriority(envelope *env); // in control point framewo
 
 #ifndef CMK_CHARE_USE_PTR
 CpvDeclare(CkVec<void *>, chare_objs);
+CpvDeclare(CkVec<int>, chare_types);
 CpvDeclare(CkVec<VidBlock *>, vidblocks);
 #endif
 
@@ -47,7 +48,7 @@ Chare::Chare(void) {
   thishandle.onPE=CkMyPe();
   thishandle.objPtr=this;
 #ifndef CMK_CHARE_USE_PTR
-     // for plain chare, objPtr is actually the index to chare table
+     // for plain chare, objPtr is actually the index to chare obj table
   if (chareIdx >= 0) thishandle.objPtr=(void*)chareIdx;
 #endif
 #ifdef _FAULT_MLOG_
@@ -774,11 +775,12 @@ static inline void *_allocNewChare(envelope *env, int &idx)
 {
   int chareIdx = _entryTable[env->getEpIdx()]->chareIdx;
   void *tmp=malloc(_chareTable[chareIdx]->size);
+  _MEMCHECK(tmp);
 #ifndef CMK_CHARE_USE_PTR
   CpvAccess(chare_objs).push_back(tmp);
+  CpvAccess(chare_types).push_back(chareIdx);
   idx = CpvAccess(chare_objs).size()-1;
 #endif
-  _MEMCHECK(tmp);
   setMemoryTypeChare(tmp);
   return tmp;
 }
@@ -793,6 +795,12 @@ static void _processNewChareMsg(CkCoreState *ck,envelope *env)
   _invokeEntry(env->getEpIdx(),env,obj);
 }
 
+void CkCreateLocalChare(int epIdx, envelope *env)
+{
+  env->setEpIdx(epIdx);
+  _processNewChareMsg(NULL, env);
+}
+
 static void _processNewVChareMsg(CkCoreState *ck,envelope *env)
 {
   int idx;
@@ -826,7 +834,7 @@ static inline void _processForPlainChareMsg(CkCoreState *ck,envelope *env)
   register int epIdx = env->getEpIdx();
   register int mainIdx = _chareTable[_entryTable[epIdx]->chareIdx]->mainChareType();
   register void *obj;
-  if (mainIdx != -1)  {
+  if (mainIdx != -1)  {           // mainchare
     CmiAssert(CkMyPe()==0);
     obj = _mainTable[mainIdx]->getObj();
   }
index 73ee1ca3bd3947192048ac2dbbd9ac417b26b110..3ae23e06e6425d477d65e8a5a6862f5c8a3d6e09 100644 (file)
@@ -162,6 +162,7 @@ CkpvStaticDeclare(PtrVec*, _bocInitVec);
 
 #ifndef CMK_CHARE_USE_PTR
 CpvExtern(CkVec<void *>, chare_objs);
+CpvExtern(int, chare_types);
 CpvExtern(CkVec<VidBlock *>, vidblocks);
 #endif
 
@@ -858,6 +859,7 @@ void _initCharm(int unused_argc, char **argv)
 #ifndef CMK_CHARE_USE_PTR
           /* chare and vidblock table */
         CpvInitialize(CkVec<void *>, chare_objs);
+        CpvInitialize(CkVec<int>, chare_types);
         CpvInitialize(CkVec<VidBlock *>, vidblocks);
 #endif