conv-com/routerstrategy.h

Go to the documentation of this file.
00001 
00002 /* Class that calls Krishnan's routers from the new Comlib.
00003    Developed to be called from Converse
00004    Sameer Kumar 05/14/04
00005 */
00006    
00007 
00008 #ifndef ROUTER_STRATEGY
00009 #define ROUTER_STRATEGY
00010 
00011 #include "convcomlibmanager.h"
00012 
00013 #include "gridrouter.h"
00014 #include "graphrouter.h"
00015 #include "de.h"
00016 #include "treerouter.h"
00017 #include "3dgridrouter.h"
00018 #include "prefixrouter.h"
00019 
00020 class RouterStrategy : public Strategy {
00021 
00022     Router * router;
00023     CkQ<MessageHolder *> msgQ;
00024     CkQ<char *> recvQ, procQ;
00025     CkQ<DummyMsg *> dummyQ;
00026 
00027     comID id;
00028     int *pelist;
00029     int npes;
00030     int *procMap;
00031     int *bcast_pemap;
00032     int myPe;
00033     int routerID;
00034 
00035     int doneHandle;    //Array strategy done handle
00036     int myDoneHandle;   //my own done handle, which will inturn call
00037                        //array strategy done handle
00038  
00039    int doneFlag, bufferedDoneInserting;
00040 
00041     void setReverseMap();
00042 
00043  public:
00044     //constructor
00045     //stratid = which topology to use ? (Mesh?, Grid?, Hypercube ?)
00046     //npes = number of processors in the all to all operation
00047     //pelist = list of processors
00048     RouterStrategy(int stratid, int handle, int npes, int *pelist);
00049     RouterStrategy(CkMigrateMessage *m): Strategy(m){}
00050     
00051     ~RouterStrategy();
00052 
00053     //Insert messages
00054     void insertMessage(MessageHolder *msg);
00055     //Finished inserting
00056     void doneInserting();
00057 
00058     //Call Krishnan's router functions
00059     void RecvManyMsg(char *msg);
00060     void ProcManyMsg(char *msg);
00061     void DummyEP(DummyMsg *m);
00062     
00063     void Done(DummyMsg *m);
00064 
00065     int * getProcMap() {return procMap;}
00066 
00067     virtual void pup(PUP::er &p);
00068     PUPable_decl(RouterStrategy);
00069 };
00070 
00071 
00072 //Call the router functions
00073 inline void RouterStrategy::RecvManyMsg(char *msg) {
00074 
00075     //comID new_id;
00076     int new_refno =0;
00077 
00078     //FOO BAR when structure of comid changes this will break !!!!!
00079     ComlibPrintf("In RecvManyMsg at %d\n", CkMyPe());
00080     //memcpy(&new_id,(msg+CmiReservedHeaderSize+sizeof(int)), sizeof(comID));
00081     //ComlibPrintf("REFNO = %d, %d\n", new_id.refno, id.refno);
00082     
00083     //First int in comid is refno
00084     memcpy(&new_refno, (char*) msg + CmiReservedHeaderSize + sizeof(int), 
00085            sizeof(int)); 
00086 
00087     if(new_refno != id.refno)
00088         recvQ.push(msg);
00089     else
00090         router->RecvManyMsg(id, msg);
00091 }
00092 
00093 inline void RouterStrategy::ProcManyMsg(char *msg) {    
00094 
00095     //comID new_id;
00096     int new_refno =0;
00097     ComlibPrintf("In ProcManyMsg at %d\n", CkMyPe());
00098     //memcpy(&new_id,(msg+CmiReservedHeaderSize+sizeof(int)), sizeof(comID));
00099     //First int in comid is refno
00100     memcpy(&new_refno, (char*) msg + CmiReservedHeaderSize + sizeof(int), 
00101            sizeof(int)); 
00102     
00103     if(new_refno != id.refno)
00104         procQ.push(msg);
00105     else
00106         router->ProcManyMsg(id, msg);
00107 }
00108 
00109 inline void RouterStrategy::DummyEP(DummyMsg *m) {
00110 
00111     if(id.refno != m->id.refno)
00112         dummyQ.push(m);
00113     else {
00114         router->DummyEP(m->id, m->magic);
00115         CmiFree(m);
00116     }
00117 }
00118 
00119 #endif

Generated on Sun Jun 29 13:29:11 2008 for Charm++ by  doxygen 1.5.1