per Sanjay's request, added an opaque strcture CkFuture, and exposed function API.
authorGengbin Zheng <gzheng@illinois.edu>
Tue, 10 May 2011 18:04:52 +0000 (13:04 -0500)
committerGengbin Zheng <gzheng@illinois.edu>
Tue, 10 May 2011 18:04:52 +0000 (13:04 -0500)
src/ck-core/charm.h
src/ck-core/ckfutures.C
src/xlat-i/xi-symbol.C

index af75321613a2a3b64ef9b8b584196c1736c6b258..b4284ebc736308936b8a737b54063a4577877578 100644 (file)
@@ -321,6 +321,16 @@ These routines are implemented in ckfutures.C.
 */
 /*@{*/
 typedef int CkFutureID;
+typedef struct _CkFuture {
+  CkFutureID id;
+  int        pe;
+} CkFuture;
+extern CkFuture CkCreateFuture(void);
+extern void  CkSendToFuture(CkFuture fut, void *msg);
+extern void* CkWaitFuture(CkFuture futNum);
+extern void CkReleaseFuture(CkFuture futNum);
+extern int CkProbeFuture(CkFuture futNum);
+
 extern void* CkRemoteCall(int eIdx, void *msg,const CkChareID *chare);
 extern void* CkRemoteBranchCall(int eIdx, void *msg, CkGroupID gID, int pe);
 extern void* CkRemoteNodeBranchCall(int eIdx, void *msg, CkGroupID gID, int node);
@@ -330,11 +340,11 @@ extern CkFutureID CkRemoteBranchCallAsync(int eIdx, void *msg, CkGroupID gID,
 extern CkFutureID CkRemoteNodeBranchCallAsync(int eIdx, void *msg, 
                                               CkGroupID gID, int node);
 
-extern void* CkWaitFuture(CkFutureID futNum);
+extern void* CkWaitFutureID(CkFutureID futNum);
 extern void CkWaitVoidFuture(CkFutureID futNum);
-extern void CkReleaseFuture(CkFutureID futNum);
-extern int CkProbeFuture(CkFutureID futNum);
-extern void  CkSendToFuture(CkFutureID futNum, void *msg, int pe);
+extern void CkReleaseFutureID(CkFutureID futNum);
+extern int CkProbeFutureID(CkFutureID futNum);
+extern void  CkSendToFutureID(CkFutureID futNum, void *msg, int pe);
 extern CkFutureID CkCreateAttachedFuture(void *msg);
 /* forward declare */
 struct CkArrayID;
index 567989dbdfc2f2e8fbb2722328bc7f15fb19fb10..1d7a78cc9c2d953d5082e611775f9283af19f05e 100644 (file)
@@ -133,7 +133,9 @@ static void addedFutures(int lo, int hi)
   fs->freelist = lo;
 }
 
-static int createFuture(void)
+static 
+inline
+int createFuture(void)
 {
   FutureState *fs = &(CpvAccess(futurestate));
   Future *fut; int handle, origsize;
@@ -157,7 +159,16 @@ static int createFuture(void)
 }
 
 extern "C"
-void CkReleaseFuture(CkFutureID handle)
+CkFuture CkCreateFuture(void)
+{
+  CkFuture fut;
+  fut.id = createFuture();
+  fut.pe = CkMyPe();
+  return fut;
+}
+
+extern "C"
+void CkReleaseFutureID(CkFutureID handle)
 {
   FutureState *fs = &(CpvAccess(futurestate));
   Future *fut = (fs->array)+handle;
@@ -166,7 +177,7 @@ void CkReleaseFuture(CkFutureID handle)
 }
 
 extern "C"
-int CkProbeFuture(CkFutureID handle)
+int CkProbeFutureID(CkFutureID handle)
 {
   FutureState *fs = &(CpvAccess(futurestate));
   Future *fut = (fs->array)+handle;
@@ -174,7 +185,7 @@ int CkProbeFuture(CkFutureID handle)
 }
 
 extern "C"
-void *CkWaitFuture(CkFutureID handle)
+void *CkWaitFutureID(CkFutureID handle)
 {
   CthThread self = CthSelf();
   FutureState *fs = &(CpvAccess(futurestate));
@@ -197,10 +208,28 @@ void *CkWaitFuture(CkFutureID handle)
   return value;
 }
 
+extern "C"
+void CkReleaseFuture(CkFuture fut)
+{
+  CkReleaseFutureID(fut.id);
+}
+
+extern "C"
+int CkProbeFuture(CkFuture fut)
+{
+  return CkProbeFutureID(fut.id);
+}
+
+extern "C"
+void *CkWaitFuture(CkFuture fut)
+{
+  CkWaitFutureID(fut.id);
+}
+
 extern "C"
 void CkWaitVoidFuture(CkFutureID handle)
 {
-  CkFreeMsg(CkWaitFuture(handle));
+  CkFreeMsg(CkWaitFutureID(handle));
 }
 
 static void setFuture(CkFutureID handle, void *pointer)
@@ -329,8 +358,8 @@ extern "C" void *CkWaitReleaseFuture(CkFutureID futNum)
 #if IGET_FLOWCONTROL
   TheIGetControlClass.iget_resend(futNum);
 #endif
-  void *result=CkWaitFuture(futNum);
-  CkReleaseFuture(futNum);
+  void *result=CkWaitFutureID(futNum);
+  CkReleaseFutureID(futNum);
 #if IGET_FLOWCONTROL
   TheIGetControlClass.iget_free(1);
 //  TheIGetControlClass.iget_free(sizeof(result));
@@ -362,13 +391,19 @@ public:
 };
 
 extern "C" 
-void CkSendToFuture(CkFutureID futNum, void *m, int PE)
+void CkSendToFutureID(CkFutureID futNum, void *m, int PE)
 {
   UsrToEnv(m)->setRef(futNum);
   CProxy_FutureBOC fBOC(_fbocID);
   fBOC[PE].SetFuture((FutureInitMsg *)m);
 }
 
+extern "C"
+void  CkSendToFuture(CkFuture fut, void *msg)
+{
+  CkSendToFutureID(fut.id, msg, fut.pe);
+}
+
 extern "C"
 CkSemaID CkSemaCreate(void)
 {
@@ -419,6 +454,8 @@ void CkSemaDestroy(CkSemaID id)
   CpvAccess(semapool)->release(id.idx);
 }
 
+PUPbytes(CkFuture);
+
 /*@}*/
 #include "CkFutures.def.h"
 
index 3758304f6b494413f9553396cfda90c436d04003..33c31b5bbf664c9976f1531098900f817c26ba06 100644 (file)
@@ -4558,7 +4558,7 @@ void Entry::genDefs(XStr& str)
       preCall << "(void *) ";
     }
 
-    postCall << "  CkSendToFuture(impl_ref, impl_retMsg, impl_src);\n";
+    postCall << "  CkSendToFutureID(impl_ref, impl_retMsg, impl_src);\n";
   } else if(isExclusive()) {
   //An exclusive method
     if(!container->isNodeGroup()) die("only nodegroup methods can be exclusive",line);