persistent work with SMP
authorGengbin Zheng <gzheng@illinois.edu>
Wed, 21 Mar 2012 21:47:16 +0000 (14:47 -0700)
committerGengbin Zheng <gzheng@illinois.edu>
Wed, 21 Mar 2012 21:47:16 +0000 (14:47 -0700)
src/arch/gemini_gni/machine-persistent.c
src/arch/gemini_gni/machine.c
src/arch/util/persist-comm.c

index 9d9bf4627866d364ea97f97192f872aa97e753fb..e436889632e5130ba6d1ed5e66e63cf1238c2b08 100644 (file)
@@ -23,8 +23,8 @@ void LrtsSendPersistentMsg(PersistentHandle h, int destNode, int size, void *m)
     gni_return_t status;
     RDMA_REQUEST        *rdma_request_msg;
     
-    CmiAssert(h!=NULL);
     PersistentSendsTable *slot = (PersistentSendsTable *)h;
+    if (h==NULL) CmiAbort("LrtsSendPersistentMsg: not a valid PersistentHandle");
     CmiAssert(slot->used == 1);
     CmiAssert(CmiNodeOf(slot->destPE) == destNode);
     if (size > slot->sizeMax) {
index 185e3c78588c4f6fe3652b89cb768354a9fdf05e..bbaad4242729cba668158cc4863b32241c5db7d0 100644 (file)
@@ -680,7 +680,7 @@ static void IndexPool_init(IndexPool *pool)
     }
     pool->indexes[i].next = -1;
     pool->freehead = 0;
-#if MULTI_THREAD_SEND 
+#if MULTI_THREAD_SEND  || REMOTE_EVENT
     pool->lock  = CmiCreateLock();
 #endif
 }
@@ -690,11 +690,13 @@ inline int IndexPool_getslot(IndexPool *pool, void *addr, int type)
 {
     int i;
     int s;
-    CMI_GNI_LOCK(pool->lock);
+#if MULTI_THREAD_SEND  || REMOTE_EVENT
+    CmiLock(pool->lock);
+#endif
     s = pool->freehead;
     if (s == -1) {
         int newsize = pool->size * 2;
-        printf("[%d] AckPool_getslot expand to: %d\n", myrank, newsize);
+        printf("[%d] IndexPool_getslot expand to: %d\n", myrank, newsize);
         if (newsize > (1<<(32-ACK_SHIFT))) CmiAbort("AckPool too large");
         struct IndexStruct *old_ackpool = pool->indexes;
         pool->indexes = (struct IndexStruct *)malloc(newsize*sizeof(struct IndexStruct));
@@ -711,7 +713,9 @@ inline int IndexPool_getslot(IndexPool *pool, void *addr, int type)
     pool->freehead = pool->indexes[s].next;
     pool->indexes[s].addr = addr;
     pool->indexes[s].type = type;
-    CMI_GNI_UNLOCK(pool->lock);
+#if MULTI_THREAD_SEND  || REMOTE_EVENT
+    CmiUnlock(pool->lock);
+#endif
     return s;
 }
 
@@ -719,10 +723,14 @@ static
 inline  void IndexPool_freeslot(IndexPool *pool, int s)
 {
     CmiAssert(s>=0 && s<pool->size);
-    CMI_GNI_LOCK(pool->lock);
+#if MULTI_THREAD_SEND  || REMOTE_EVENT
+    CmiLock(pool->lock);
+#endif
     pool->indexes[s].next = pool->freehead;
     pool->freehead = s;
-    CMI_GNI_UNLOCK(pool->lock);
+#if MULTI_THREAD_SEND  || REMOTE_EVENT
+    CmiUnlock(pool->lock);
+#endif
 }
 
 
index 73f670e4b8f91e5b0379994ea38a00be3b12a99c..6456c3122d2458c0dc3e1ef5cb20e1764e242e0b 100644 (file)
@@ -149,9 +149,13 @@ PersistentHandle CmiCreatePersistent(int destPE, int maxBytes)
 
   PersistentSendsTable *slot = (PersistentSendsTable *)h;
 
+  if (CmiMyNode() == CmiNodeOf(destPE)) return NULL;
+
+/*
   if (CmiMyPe() == destPE) {
     CmiAbort("CmiCreatePersistent Error: setting up persistent communication to the same processor is not allowed.");
   }
+*/
 
   slot->used = 1;
   slot->destPE = destPE;
@@ -320,10 +324,10 @@ void persistentDestoryHandler(void *env)
 /* FIXME: need to buffer until ReqGranted message come back? */
 void CmiDestoryPersistent(PersistentHandle h)
 {
-  if (h == 0) CmiAbort("CmiDestoryPersistent: not a valid PersistentHandle\n");
+  if (h == NULL) return;
 
   PersistentSendsTable *slot = (PersistentSendsTable *)h;
-  //CmiAssert(slot->destHandle != 0);
+  /* CmiAssert(slot->destHandle != 0); */
 
   PersistentDestoryMsg *msg = (PersistentDestoryMsg *)
                               CmiAlloc(sizeof(PersistentDestoryMsg));
@@ -407,7 +411,7 @@ void CmiPersistentInit()
 void CmiUsePersistentHandle(PersistentHandle *p, int n)
 {
   if (n==1 && *p == NULL) { p = NULL; n = 0; }
-#if  CMK_ERROR_CHECKING
+#if  CMK_ERROR_CHECKING && 0
   {
   int i;
   for (i=0; i<n; i++)