Two changes, initComlibManager is no longer an initproc call
[charm.git] / src / ck-com / PrioStreaming.h
1
2 #ifndef PRIO_STREAMING
3 #define PRIO_STREAMING
4
5 #include "ComlibManager.h"
6 #include "StreamingStrategy.h"
7
8
9 class PrioStreaming : public StreamingStrategy {
10  protected:
11     int basePriority;
12     CkVec<int> minPrioVec;
13     
14  public:
15     /**
16      Create a priority based streaming strategy, suitable for passing
17      to ComlibManager.  
18      These are the criteria for flushing all pending messages: 
19
20      - it's been at least period (in ms) since the last flush, or 
21
22      - the processor just went idle.  Thses criteria flush a single 
23      PE's pending messages: 
24
25      - more than bufferMax messages to buffered for one PE.
26
27      - Current message is a high priority message
28     */
29
30     PrioStreaming(int periodMs=10, int bufferMax=1000, int prio=0);
31     PrioStreaming(CkMigrateMessage *m) : StreamingStrategy(m) {}
32     
33     virtual void insertMessage(CharmMessageHolder *msg);
34
35     //If new priority is greater than current priority, 
36     //then flush all queues which have relatively high priority messages
37     inline void setBasePriority(int p) {
38         if(p > basePriority) {
39             for(int count =0; count < CkNumPes(); count++)
40                 if(minPrioVec[count] <= p)
41                     flushPE(count);
42         }        
43         basePriority = p;
44     }
45
46     virtual void pup(PUP::er &p);
47     PUPable_decl(PrioStreaming);
48 };
49 #endif