a bug fix for LFIFO long priority queue. For little endian machines such as intel...
authorGengbin Zheng <gzheng@illinois.edu>
Tue, 28 Oct 2008 16:01:29 +0000 (16:01 +0000)
committerGengbin Zheng <gzheng@illinois.edu>
Tue, 28 Oct 2008 16:01:29 +0000 (16:01 +0000)
src/conv-core/queueing.c
src/conv-core/queueing.h

index 76798e258f9d9a297a7afb1348cfd555fe0812eb..0756a963c690d3e838071ef9fac34c2ec6a4bbd9 100644 (file)
@@ -539,7 +539,7 @@ void CqsEnqueueGeneral(Queue q, void *data, int strategy,
            int priobits,unsigned int *prioptr)
 {
   deq d; int iprio;
-  CmiInt8 *lprio;
+  CmiInt8 lprio0, lprio;
   switch (strategy) {
   case CQS_QUEUEING_FIFO: 
     CqsDeqEnqueueFifo(&(q->zeroprio), data); 
@@ -575,24 +575,34 @@ void CqsEnqueueGeneral(Queue q, void *data, int strategy,
     break;
 
   case CQS_QUEUEING_LFIFO:     
-    /* allow signed priority queueing on 64 bit integers */
-    lprio =(CmiInt8 *)prioptr;
-    if (*lprio<0)
-      {
-       d=CqsPrioqGetDeq(&(q->negprioq), priobits, prioptr);
-      }
+    CmiAssert(priobits == CLONGBITS);
+    lprio0 =((CmiUInt8 *)prioptr)[0];
+    lprio0 += (1ULL<<(CLONGBITS-1));
+    if (CmiEndianness() == 0) {           /* little-endian */
+      lprio =(((CmiUInt4 *)&lprio0)[0]*1LL)<<CINTBITS | ((CmiUInt4 *)&lprio0)[1];
+    }
+    else {                /* little-endian */
+      lprio = lprio0;
+    }
+    if (lprio0<0)
+        d=CqsPrioqGetDeq(&(q->posprioq), priobits, &lprio);
     else
-      {
-       d=CqsPrioqGetDeq(&(q->posprioq), priobits, prioptr);
-      }
+        d=CqsPrioqGetDeq(&(q->negprioq), priobits, &lprio);
     CqsDeqEnqueueFifo(d, data);
     break;
   case CQS_QUEUEING_LLIFO:
-    lprio =(CmiInt8 *)prioptr;
-    if (*lprio<0)
-      d=CqsPrioqGetDeq(&(q->negprioq), priobits, prioptr);
+    lprio0 =((CmiUInt8 *)prioptr)[0];
+    lprio0 += (1ULL<<(CLONGBITS-1));
+    if (CmiEndianness() == 0) {           /* little-endian happen to compare least significant part first */
+      lprio =(((CmiUInt4 *)&lprio0)[0]*1LL)<<CINTBITS | ((CmiUInt4 *)&lprio0)[1];
+    }
+    else {                /* little-endian */
+      lprio = lprio0;
+    }
+    if (lprio0<0)
+        d=CqsPrioqGetDeq(&(q->posprioq), priobits, &lprio);
     else
-      d=CqsPrioqGetDeq(&(q->posprioq), priobits, prioptr);
+        d=CqsPrioqGetDeq(&(q->negprioq), priobits, &lprio);
     CqsDeqEnqueueLifo(d, data);
     break;
   default:
index 4578fe2863d45f68f50efe49a98837f5158ba749..2b4bba4573c3995115b769ea0ce05d3477c8a0e5 100644 (file)
@@ -16,6 +16,9 @@ extern "C" {
 #ifndef CINTBITS
 #define CINTBITS ((unsigned int) (sizeof(int)*8))
 #endif
+#ifndef CLONGBITS
+#define CLONGBITS ((unsigned int) (sizeof(CmiInt8)*8))
+#endif
 typedef struct prio_struct
 {
   unsigned short bits;