Fixed a data racing issue in list send for SMP
authorChao Mei <chaomei@login1.intrepid.alcf.anl.gov>
Fri, 26 Aug 2011 03:23:21 +0000 (03:23 +0000)
committerChao Mei <chaomei@login1.intrepid.alcf.anl.gov>
Fri, 26 Aug 2011 03:23:21 +0000 (03:23 +0000)
src/arch/bluegenep/machine.c

index 8a188fd2da0054fccca7c0ed82cba12abcdb600f..a034bd0bf7b3edfcdfe5eca123ffe58f58a56937 100644 (file)
@@ -954,6 +954,7 @@ void CmiFreeListSendFn(int npes, int *pes, int size, char *msg) {
     machineMulticast (new_npes, newpelist, size, msg);
 #else /* non-optimized multicast */
 
+#if !CMK_SMP
     /* Note: if the pe list contains this processor,
      * CmiReference call is dangerous unless the user code
      * calls CmiFree to free the msg instead of "delete"
@@ -965,7 +966,7 @@ void CmiFreeListSendFn(int npes, int *pes, int size, char *msg) {
      */
     int isRefed = 0;
     for (i=0; i<npes-1; i++) {
-       if(CmiNodeOf(pes[i]) == CmiMyNode()){
+       if(pes[i] == CmiMyPe()){
             CmiSyncSend(pes[i], size, msg);
         }else{
             CmiReference(msg);
@@ -974,12 +975,21 @@ void CmiFreeListSendFn(int npes, int *pes, int size, char *msg) {
         }
     }
 
-    if(CmiNodeOf(pes[npes-1]) == CmiMyNode() && isRefed == 1){
+    if(pes[npes-1] == CmiMyPe() && isRefed == 1){
        CmiSyncSend(pes[npes-1], size, msg);
        CmiFree(msg);
     }else{
        CmiFreeSendFn(pes[npes-1], size, msg);
     }
+#else
+   /* Note: in SMP mode, the CmiReferece could not be used because
+    * of the race condition between this thread and the other thread
+    * that calls CmiFree. In this case, CmiSyncSend has to be used
+    * instead.
+    */
+   for(i=0; i<npes-1; i++) CmiSyncSend(pes[i], size, msg);
+   CmiFreeSendFn(pes[npes-1], size, msg);
+#endif
 #endif /* end of #if OPTIMIZED_MULTICAST */
 }
 #endif /* end of #if !CMK_MULTICAST_LIST_USE_COMMON_CODE */