Adding a new simple Comlib Multicast strategy that does not cache array section infor...
[charm.git] / src / ck-com / OneTimeMulticastStrategy.h
1 /**
2    @addtogroup ComlibCharmStrategy
3    @{
4    
5    @file 
6  
7 */
8
9 #ifndef ONE_TIME_MULTICAST_STRATEGY
10 #define ONE_TIME_MULTICAST_STRATEGY
11
12 #include "ComlibManager.h"
13 #include "ComlibSectionInfo.h"
14
15 /**
16    The simplest multicast strategy. This strategy extracts the array section information, and packs the section information and the user message into a single message. The original message is delivered locally, and the new message is sent using CmiSyncListSendAndFree to all other processors containing destination objects.
17
18    This strategy is simpler than those which are derived from the MulticastStrategy class because those maintain a persistant record of previous array section information extracted from the messages, and those provide multiple implementations of the multicast tree (such as ring or multiring or all to all). Those strategies ought to be used when multiple multicasts are sent to the same array section. If an array section is not reused, then this strategy ought to be used.
19
20    The local messages are delivered through the array manager using the CharmStrategy::deliverToIndices methods. If a destination chare is remote, the array manager will forward it on to the pe that contains the chare.
21    
22 */
23 class OneTimeMulticastStrategy: public Strategy, public CharmStrategy {
24  private:
25
26   ComlibSectionInfo sinfo; // This is used to create the multicast messages themselves
27   
28   void remoteMulticast(ComlibMulticastMsg *cmsg);
29   void localMulticast(CharmMessageHolder *cmsg);
30   
31  public:
32
33  OneTimeMulticastStrategy(CkMigrateMessage *m): Strategy(m), CharmStrategy(m){}
34     
35   OneTimeMulticastStrategy();
36   ~OneTimeMulticastStrategy();
37
38   void insertMessage(MessageHolder *msg) {insertMessage((CharmMessageHolder*)msg);}
39   void insertMessage(CharmMessageHolder *msg);
40
41   ///Called by the converse handler function
42   void handleMessage(void *msg);    
43
44   void pup(PUP::er &p);
45
46   PUPable_decl(OneTimeMulticastStrategy);
47
48 };
49 #endif
50
51 /*@}*/