use swap atomic at sender side.
authorGengbin Zheng <gzheng@illinois.edu>
Thu, 22 Oct 2009 23:01:14 +0000 (23:01 +0000)
committerGengbin Zheng <gzheng@illinois.edu>
Thu, 22 Oct 2009 23:01:14 +0000 (23:01 +0000)
src/arch/shmem/machine.c

index dca5e4101f77d56db18085c2ebeff9858b61ead1..e48121a3886fa547346b55c4deeeb15a3835ee3c 100644 (file)
@@ -27,6 +27,8 @@
 #define globalexit exit
 #endif 
 
+#define USE_SWAP                                             1
+
 /*
  *  We require statically allocated variables for locks.  This defines
  *  the max number of processors available.
@@ -732,10 +734,20 @@ static void McEnqueueRemote(void *msg, int msg_sz, int dst_pe)
   /* First, get current head pointer, and stick it in this 
    * message data area.
    */
+#if !USE_SWAP
   shmem_int_get((int*)msg_link, (int*)&head, sizeof(McDistList)/sizeof(int), dst_pe);
   /* Next, write the new message into the top of the list */
   shmem_int_put((int*)&head, (int*)&tmp_link, sizeof(McDistList)/sizeof(int),dst_pe);
   shmem_quiet();
+#else
+  {
+  int i, n = sizeof(McDistList)/sizeof(int);
+  int *dst = (int*)&head;
+  int *src = (int*)&tmp_link;
+  int *olddst = (int*)msg_link;
+  for (i=0; i<n; i++)  olddst[i] = shmem_int_swap(dst+i, src[i], dst_pe);
+  }
+#endif
 
 #ifdef DEBUG
   printf("[%d] Adding Message to pe %d\n",_Cmi_mype,dst_pe);