00001 #ifndef RECT_MULTICAST_STRATEGY
00002 #define RECT_MULTICAST_STRATEGY
00003
00004
00013
00014
00015 #include "ComlibManager.h"
00016 #include "ComlibSectionInfo.h"
00017
00018 typedef CkHashtableTslow < unsigned int, void *> comRectHashType;
00019
00020
00021 CkpvExtern(comRectHashType *, com_rect_ptr);
00022
00023
00024
00025 class ComlibRectSectionHashObject : public ComlibSectionHashObject
00026 {
00027 public:
00028 bool sourceInRectangle;
00029 int cornerRoot;
00030 CkArrayID aid;
00031 };
00032
00033 void *DMHandler(void *msg);
00042 #ifdef CMK_RECT_API
00043 #include "bgml.h"
00044 class RectMulticastStrategy: public Strategy, public CharmStrategy {
00045 protected:
00046 int handlerId;
00047 ComlibSectionInfo sinfo;
00048
00050 CkHashtableT<ComlibSectionHashKey, ComlibRectSectionHashObject *> sec_ht;
00051
00052
00053 inline unsigned int computeKey(int sectionID, int srcPe, CkArrayID arrId) {
00054
00055 return ((unsigned int) (((CkGroupID) arrId).idx << 24) | (sectionID<<16)| srcPe);}
00056
00057 inline unsigned int computeKey(int sectionID, int srcPe, int id) {
00058
00059 return ((unsigned int) (id << 24) | (sectionID<<16)| srcPe);}
00060
00062 void insertSectionID(CkSectionID *sid);
00063
00067 virtual ComlibRectSectionHashObject *createObjectOnSrcPe(int nindices, CkArrayIndex *idx_list, unsigned int sectionid);
00068
00082 virtual ComlibRectSectionHashObject *createObjectOnIntermediatePe(int nindices, CkArrayIndex *idxlist, int npes, ComlibMulticastIndexCount *counts, int srcpe, int sectionID);
00083
00085 virtual int needSorting() { return 0; }
00086
00088 void localMulticast(envelope *env, ComlibRectSectionHashObject *obj);
00089
00092 virtual void remoteMulticast(envelope *env, ComlibRectSectionHashObject *obj);
00093
00095 virtual void forwardMulticast(envelope *env, ComlibRectSectionHashObject *obj);
00096
00097
00100 void handleNewMulticastMessage(envelope *env);
00101
00102 void sendRectDest(ComlibRectSectionHashObject *obj, int srcpe, envelope *env);
00103 BGTsRC_Geometry_t *getRectGeometry(ComlibRectSectionHashObject *obj, int srcpe);
00104 int assignCornerRoot(BGTsRC_Geometry_t *geom, int srcpe);
00105
00106 public:
00107
00108
00109
00110 RectMulticastStrategy(CkMigrateMessage *m): Strategy(m), CharmStrategy(m){}
00111
00113 RectMulticastStrategy(CkArrayID aid);
00114
00115
00116
00117 ~RectMulticastStrategy();
00118
00119 virtual void insertMessage(CharmMessageHolder *msg);
00120 virtual void doneInserting();
00121
00123 virtual void handleMessage(void *msg);
00124 virtual void handleMessageForward(void *msg);
00125
00126 virtual void pup(PUP::er &p);
00127 virtual void beginProcessing(int nelements);
00128
00129 PUPable_decl(RectMulticastStrategy);
00130 };
00131 #else
00132 class RectMulticastStrategy : public Strategy, public CharmStrategy {
00133 RectMulticastStrategy(CkMigrateMessage *m): Strategy(m), CharmStrategy(m){}
00134
00135 ~RectMulticastStrategy(){}
00136 void insertMessage(MessageHolder*) {}
00137 void handleMessage(void*) {}
00138 void pup(PUP::er &p) {}
00139 PUPable_decl(RectMulticastStrategy);
00140 };
00141 #endif
00142
00143
00146 #endif