msgQ: CMK_USE_STL_MSGQ now causes converse to use an STL-based msgq
authorRamprasad Venkataraman <ramv@illinois.edu>
Thu, 28 Jun 2012 15:13:31 +0000 (10:13 -0500)
committerRamprasad Venkataraman <ramv@illinois.edu>
Sun, 28 Oct 2012 01:13:10 +0000 (20:13 -0500)
Works, passes megatest and runs applications like openatom successfully.

src/conv-core/conv-config.h
src/conv-core/convcore.c
src/conv-core/queueing.C
src/conv-core/queueing.h
tests/charm++/queue/pgm.C

index 1b1d3f0e3906a1a3cb3fe09807dc6e45e48de5a9..982f664ec447f7c9b0a478e2b32fcdc938579a29 100644 (file)
 #include "conv-mach-pxshm.h"
 #endif
 
+
+#if CMK_HAS_STD_UNORDERED_MAP
+#define CMK_USE_STL_MSGQ 1
+#else
+#define CMK_USE_STL_MSGQ 0
+#endif
+
 #endif
index cee4024cbfd166aac3bc65cb44b859641a5410ec..8ebcedeb559b347c8b764da827266dba8b23318b 100644 (file)
@@ -2121,6 +2121,9 @@ void CsdInit(argv)
     }
   CpvAccess(CsdLocalCounter) = CsdLocalMax;
   CpvAccess(CsdSchedQueue) = (void *)CqsCreate();
+   #if CMK_USE_STL_MSGQ
+   if (CmiMyPe() == 0) CmiPrintf("Charm++> Using STL-based msgQ:\n");
+   #endif
 
 #if CMK_OBJECT_QUEUE_AVAILABLE
   CpvInitialize(void *,CsdObjQueue);
index 5897e8c459d0713d55e8522082521e579f47fb7c..40a11370005b60ca0e94377823b7261bee828044 100644 (file)
@@ -2,6 +2,10 @@
 #include <converse.h>
 #include <string.h>
 
+#if CMK_USE_STL_MSGQ
+#include "msgq.h"
+#endif
+
 /** @defgroup CharmScheduler 
     @brief The portion of Charm++ responsible for scheduling the execution 
     of Charm++ entry methods
@@ -553,6 +557,9 @@ Queue CqsCreate(void)
   CqsDeqInit(&(q->zeroprio));
   CqsPrioqInit(&(q->negprioq));
   CqsPrioqInit(&(q->posprioq));
+#if CMK_USE_STL_MSGQ
+  q->stlQ = (void*) new conv::msgQ<int>;
+#endif
   return q;
 }
 
@@ -560,17 +567,54 @@ void CqsDelete(Queue q)
 {
   CmiFree(q->negprioq.heap);
   CmiFree(q->posprioq.heap);
+#if CMK_USE_STL_MSGQ
+  if (q->stlQ != NULL) delete (conv::msgQ<int>*)(q->stlQ);
+#endif
   CmiFree(q);
 }
 
+unsigned int CqsMaxLength(Queue q)
+{
+  return q->maxlen;
+}
+
+#if CMK_USE_STL_MSGQ
+
 unsigned int CqsLength(Queue q)
+{ return ( (conv::msgQ<int>*)(q->stlQ) )->size(); }
+
+int CqsEmpty(Queue q)
+{ return ( (conv::msgQ<int>*)(q->stlQ) )->empty(); }
+
+void CqsEnqueueGeneral(Queue q, void *data, int strategy, int priobits,unsigned int *prioptr)
 {
-  return q->length;
+    bool isFifo = (strategy == CQS_QUEUEING_FIFO  ||
+                   strategy == CQS_QUEUEING_IFIFO ||
+                   strategy == CQS_QUEUEING_BFIFO ||
+                   strategy == CQS_QUEUEING_LFIFO);
+    if (priobits >= sizeof(int)*8 && strategy != CQS_QUEUEING_FIFO && strategy != CQS_QUEUEING_LIFO)
+        ( (conv::msgQ<int>*)(q->stlQ) )->enq( data, prioptr[0], isFifo);
+    else
+        ( (conv::msgQ<int>*)(q->stlQ) )->enq( data, 0, isFifo);
 }
 
-unsigned int CqsMaxLength(Queue q)
+void CqsEnqueueFifo(Queue q, void *data)
+{ ( (conv::msgQ<int>*)(q->stlQ) )->enq(data); }
+
+void CqsEnqueueLifo(Queue q, void *data)
+{ ( (conv::msgQ<int>*)(q->stlQ) )->enq(data, 0, false); }
+
+void CqsEnqueue(Queue q, void *data)
+{ ( (conv::msgQ<int>*)(q->stlQ) )->enq(data); }
+
+void CqsDequeue(Queue q, void **resp)
+{ *resp = (void*) ( (conv::msgQ<int>*)(q->stlQ) )->deq(); }
+
+#else
+
+unsigned int CqsLength(Queue q)
 {
-  return q->maxlen;
+  return q->length;
 }
 
 int CqsEmpty(Queue q)
@@ -697,6 +741,7 @@ void CqsDequeue(Queue q, void **resp)
   *resp = 0; return;
 }
 
+#endif // CMK_USE_STL_MSGQ
 static struct prio_struct kprio_zero = { 0, 0, {0} };
 static struct prio_struct kprio_max  = { 32, 1, {((unsigned int)(-1))} };
 
@@ -796,6 +841,14 @@ void** CqsEnumeratePrioq(_prioq q, int *num){
   return result;
 }
 
+#if CMK_USE_STL_MSGQ
+void CqsEnumerateQueue(Queue q, void ***resp){
+  conv::msgQ<int> *stlQ = (conv::msgQ<int>*) q->stlQ;
+  *resp = (void **)CmiAlloc(stlQ->size() * sizeof(conv::msg_t*));
+  stlQ->enumerate(*resp, *resp + stlQ->size());
+}
+
+#else
 void CqsEnumerateQueue(Queue q, void ***resp){
   void **result;
   int num;
@@ -825,6 +878,7 @@ void CqsEnumerateQueue(Queue q, void ***resp){
   }
   CmiFree(result);
 }
+#endif
 
 /**
    Remove first occurence of a specified entry from the deq  by
index 7a5bebba75bbb14a3cb347b2a03abe52454af898..d918b683f2895cbdcf64c76dd9d04f2f987d7c31 100644 (file)
@@ -11,6 +11,8 @@
     @{
  */
 
+#include "conv-config.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -127,6 +129,9 @@ typedef struct Queue_struct
   struct deq_struct zeroprio; /**< A double ended queue for zero priority messages */
   struct prioq_struct negprioq; /**< A priority queue for negative priority messages */
   struct prioq_struct posprioq; /**< A priority queue for negative priority messages */
+#if CMK_USE_STL_MSGQ
+  void *stlQ; /**< An STL-based alternative to charm's msg queues */
+#endif
 }
 *Queue;
 /*#else
index 7d8d86cd236909d31a3c1d959b0c0cdd9fa3d4e8..98ee75624fbb19ec2b9adf97f4d6cc33e5385f6e 100644 (file)
@@ -262,6 +262,14 @@ struct main : public CBase_main
 {
   main(CkArgMsg *)
   {
+    #if CMK_USE_STL_MSGQ
+    CkPrintf("Charm has CMK_USE_STL_MSGQ enabled\n");
+    #if CMK_HAS_STD_UNORDERED_MAP
+    CkPrintf("... and its using a msg q implemented with a std::unordered_map\n");
+    #else
+    CkPrintf("... and its using a msg q implemented with a std::map\n");
+    #endif
+    #endif
     int tests = 0, success = 0, fail = 0;
     char message[100];