doc: Add serial to list of ci file reserved words
[charm.git] / src / ck-com / DirectMulticastStrategy.h
index 7754ab99e6bf31ea20e98fe22017c08269681369..65e83bbf6f5896267d22cc402ac21e44736c6c23 100644 (file)
@@ -1,96 +1,59 @@
+/**
+   @addtogroup ComlibCharmStrategy
+   @{
+   @file 
+   @brief Send a multicast by sending once directly to each processor owning destination elements.
+
+*/
+
 #ifndef DIRECT_MULTICAST_STRATEGY
 #define DIRECT_MULTICAST_STRATEGY
 
-#include "ComlibManager.h"
+#include "MulticastStrategy.h"
 
-void *DMHandler(void *msg);
-
-class ComlibSectionHashKey{
- public:
 
-    int srcPe;
-    int id;
-    ComlibSectionHashKey(int _pe, int _id):srcPe(_pe), id(_id){};
+/** 
+  Send the multicast by sending once directly to each processor owning destination elements.
 
-    //These routines allow ComlibSectionHashKey to be used in
-    //  a CkHashtableT
-    CkHashCode hash(void) const;
-    static CkHashCode staticHash(const void *a,size_t);
-    int compare(const ComlibSectionHashKey &ind) const;
-    static int staticCompare(const void *a,const void *b,size_t);
-};
-
-inline CkHashCode ComlibSectionHashKey::hash(void) const
-{
-    register int _id = id;
-    register int _pe = srcPe;
-    
-    register CkHashCode ret = (_id << 16) + _pe;
-    return ret;
-}
+  The definition of the section, as well as the location of all the elements in
+  the processors is determined by the sending processor. The other will obey to
+  it, even some elements have already migrated elsewhere.
 
-inline int ComlibSectionHashKey::compare(const ComlibSectionHashKey &k2) const
-{
-    if(id == k2.id && srcPe == k2.srcPe)
-        return 1;
-    
-    return 0;
-}
-
-/*For calls to qsort*/
-int intCompare(void *a, void *b);
-
-class DirectMulticastStrategy: public CharmStrategy {
+*/
+class DirectMulticastStrategy: public MulticastStrategy {
  protected:
-    CkQ <CharmMessageHolder*> *messageBuf;
-
-    int ndestpes, *destpelist; //Destination processors
-    int handlerId;
-    int MaxSectionID;
-
-    int isDestinationArray, isDestinationGroup;
-
-    //Array support
-    CkArrayID destArrayID;
-    CkVec<CkArrayIndexMax> localDestIndices;
-    //Array section support
-    CkHashtableT<ComlibSectionHashKey, void *> sec_ht; 
-    
-    //Initialize and cache information in a section id which can be
-    //used the next time the section is multicast to.
-    virtual void initSectionID(CkSectionID *sid);
-    
-    //Common Initializer for group and array constructors
-    //Every substrategy should implement its own
-    void commonInit();
-    
-    //Called to multicast an array message locally
-    void localMulticast(CkVec<CkArrayIndexMax> *, envelope *env);
-
-    //Create a new multicast message with the array section in it
-    ComlibMulticastMsg * getNewMulticastMessage(CharmMessageHolder *cmsg);
-
+    ///Called when a new section multicast is called by the user locally.
+    ///The strategy should then create a topology for it and return a hash
+    ///object to store that topology.
+  virtual void createObjectOnSrcPe(ComlibSectionHashObject *obj, int npes, ComlibMulticastIndexCount *pelist);
+
+    /**   
+     * Similar to createHashObjectOnSrcPe, but that this call is made on the
+     * destination or intermediate processor. I receives all the information in
+     * the parameters, and it does not use ComlibLastKnown, since in some cases
+     * it can be incoherent.
+
+     * @param nindices number of local elements to multicast
+     * @param idxlist list of local elements
+     * @param npes number of processors involved in the multicast
+     * @param counts list of all the processors involved int the multicast
+     * @param srcpe processor which started the multicast
+     * @return a hash object describing the section
+     */
+    virtual void createObjectOnIntermediatePe(ComlibSectionHashObject *obj, int npes, ComlibMulticastIndexCount *counts, int srcpe);
+   
  public:
-    
-    //Group constructor
-    DirectMulticastStrategy(int ndestpes = 0, int *destpelist = 0);    
+    DirectMulticastStrategy(CkMigrateMessage *m): MulticastStrategy(m){}
+                
+    ///Array constructor
+    DirectMulticastStrategy(): MulticastStrategy() {}
 
-    //Array constructor
-    DirectMulticastStrategy(CkArrayID aid);
-
-    DirectMulticastStrategy(CkMigrateMessage *m): CharmStrategy(m){}
-    
-    virtual void insertMessage(CharmMessageHolder *msg);
-    virtual void doneInserting();
-
-    //Called by the converse handler function
-    virtual void handleMulticastMessage(void *msg);
-    
-    virtual void pup(PUP::er &p);    
-    virtual void beginProcessing(int nelements);
-    
     PUPable_decl(DirectMulticastStrategy);
 
+    virtual void pup(PUP::er &p){ MulticastStrategy::pup(p);}   
+    
 };
 #endif
 
+/*@}*/