Adding a new handler which makes it easy for strategies to
authorSameer Kumar <skumar2@uiuc.edu>
Tue, 22 Mar 2005 15:10:59 +0000 (15:10 +0000)
committerSameer Kumar <skumar2@uiuc.edu>
Tue, 22 Mar 2005 15:10:59 +0000 (15:10 +0000)
communicate with each other.

src/conv-com/convcomlibmanager.C
src/conv-com/convcomlibmanager.h
src/conv-com/convcomlibstrategy.h
src/conv-com/routerstrategy.C

index 64812ef88ed2ea88785c166a7ddf31b69f09e860..1e368905b9e2fb7a30694b1a13f30816919321c6 100644 (file)
@@ -1,3 +1,4 @@
+
 /* Converse ComlibManager 
    Enables communication library strategies to be called from converse code.
    Also called by the Charm Comlibmanager.
@@ -17,6 +18,15 @@ CkpvDeclare(ConvComlibManager, conv_com_object);
 CkpvDeclare(ConvComlibManager *, conv_com_ptr);
 CkpvDeclare(int, RecvdummyHandle);
 
+void *strategyHandler(void *msg) {
+    CmiMsgHeaderBasic *conv_header = (CmiMsgHeaderBasic *) msg;
+    int instid = conv_header->stratid;
+    
+    Strategy *strat = ConvComlibGetStrategy(instid);
+    
+    strat->handleMessage(msg);
+    return NULL;
+}
 
 ConvComlibManager::ConvComlibManager(): strategyTable(MAX_NUM_STRATS){
     nstrats = 0;
@@ -37,9 +47,9 @@ void ConvComlibManager::insertStrategy(Strategy *s) {
 
     s->setInstance(nstrats);
     
-    // if the strategy is pure converse or pure charm the following line is a
-    // duplication, but if a charm strategy embed a converse strategy it is
-    // necessary to set the instanceID in both
+    // if the strategy is pure converse or pure charm the following
+    // line is a duplication, but if a charm strategy embed a converse
+    // strategy it is necessary to set the instanceID in both
     s->getConverseStrategy()->setInstance(nstrats);
     nstrats ++;
 }
@@ -93,8 +103,13 @@ void initComlibManager(){
     CsvInitialize(int, pipeBcastPropagateHandle);
     CsvInitialize(int, pipeBcastPropagateHandle_frag);
     //CsvAccess(pipeBcastPropagateHandle) = CmiRegisterHandler((CmiHandler)propagate_handler);
+    
     CsvAccess(pipeBcastPropagateHandle_frag) = CkRegisterHandler((CmiHandler)propagate_handler_frag);
     
+    CkpvInitialize(int, strategy_handlerid);
+
+    CkpvAccess(strategy_handlerid) = CkRegisterHandler((CmiHandler) strategyHandler);
+
     PUPable_reg(Strategy);
     PUPable_reg(RouterStrategy);
     PUPable_reg(MessageHolder);
index 0635a739b7b000bee827b0c2723bd9d02d5b615a..9158bb55ba73aecd36d4a0cea3ab179fd1f91ac1 100644 (file)
@@ -15,7 +15,7 @@
 #include "comlib.h"
 #include <convcomlibstrategy.h>
 
-#define MAX_NUM_STRATS 128
+#define MAX_NUM_STRATS 32
 
 class ConvComlibManager {
     
@@ -40,4 +40,15 @@ Strategy *ConvComlibGetStrategy(int loc);
 void ConvComlibRegisterStrategy(Strategy *s);
 void ConvComlibScheduleDoneInserting(int loc);
 
+CkpvDeclare(int, strategy_handlerid);
+
+//Send a converse message to a remote strategy instance. On being
+//received the handleMessage method will be invoked.
+inline void ConvComlibSendMessage(int instance, int dest_pe, int size, char *msg) {
+    CmiSetHandler(msg, CkpvAccess(strategy_handlerid));
+    ((CmiMsgHeaderBasic *) msg)->stratid = instance;
+    
+    CmiSyncSendAndFree(dest_pe, size, msg);
+}
+
 #endif
index 6bf78f63e92420f3c8d9e2443cc08fa3df5c2fe8..25f310d26eb7f3c0d62e6932188b56d802e1c7ad 100644 (file)
@@ -132,10 +132,15 @@ class Strategy : public PUP::able{
       return higherLevel;
     }
 
+    //Called when a message is received in the strategy handler
+    virtual void handleMessage(void *msg) {}
+    
     //This method can be used to deliver a message through the correct class
     //when converse does not know if the message was originally sent from
     //converse itself of from a higher level language like charm
-    virtual void deliverer(char*, int) {CmiAbort("Strategy::deliverer: If used, should be first redefined\n");};
+    virtual void deliverer(char*, int) {
+        CmiAbort("Strategy::deliverer: If used, should be first redefined\n");
+    };
 
     //Each strategy must define his own Pup interface.
     virtual void pup(PUP::er &p);
index 35ce32eddd2cc9e70ecf9516f2ab49ca56b47ab9..d049deaf5b09dc5b26ad208823f88c987d383c34 100644 (file)
@@ -104,6 +104,9 @@ RouterStrategy::RouterStrategy(int stratid, int handle, int _npes,
     pelist = _pelist;
     //memcpy(pelist, _pelist, sizeof(int) * npes);    
 
+    if(npes <= 1)
+        routerID = USE_DIRECT;
+
     myPe = -1;
     procMap = new int[CkNumPes()];    
     setReverseMap();