doc: Add serial to list of ci file reserved words
[charm.git] / examples / pose / LBSim / SchedSIM.h
1 #ifndef _SCHEDSIM_H_
2 #define _SCHEDSIM_H_
3
4 #include <math.h>
5 #include "queueing.h"
6 #include "typedefs.h"
7
8 #define WORK_MSG 1
9 #define LDBAL_MSG 2
10 #define MAXOVERLOAD 2
11
12 typedef void (*AppFn)(int n);
13
14 // messages
15 class SchedulerData { // scheduler object constructor message
16  public:
17   int maxObjects;
18   int connectivity;
19   char * lbtopo;
20   int lbtopolen;
21   int id;
22   long int data;
23   int sum;
24   //SchedulerData(){
25   //lbtopo=NULL;
26   //}
27   SchedulerData& operator=(const SchedulerData& obj) {
28     eventMsg::operator=(obj);
29     maxObjects = obj.maxObjects;
30     connectivity = obj.connectivity;
31     lbtopolen = obj.lbtopolen;
32     for (int i=0;i<lbtopolen;i++) lbtopo[i]=obj.lbtopo[i]; //can use strcpy too?
33     id = obj.id;
34     data = obj.data;
35     sum = obj.sum;
36     return *this;
37   }
38 };
39
40 class computeMsg {
41  public:
42   long int data;
43   int sum;
44   int type;
45   computeMsg& operator=(const computeMsg& obj) {
46     eventMsg::operator=(obj);
47     data = obj.data;
48     sum = obj.sum;
49     type = obj.type;
50     return *this;
51   }
52 };
53
54 // posers
55 class schedulerObject {
56   int maxObjects;
57   int connectivity;
58   int id;
59   long int data;
60   int count;
61   //For stats collection
62   int WorkTime;
63   int IdleTime;
64   int lastovt;
65   //FILE *fp;
66   //Neighborlist 
67   int maxNeighbors;
68   int *neighborlist;
69   int *loadlist;
70   //For load balancing
71   int MinProc;
72   int MinLoad;
73   int Mindex; 
74   int prevovt;
75   //Queue data structure
76   QUEUE *queue;
77   //Application function
78   AppFn appfn;
79   //Load (Queue Length)
80   int load;
81   //LoadBalancing Topology
82   char * lbtopo;
83   int lbtopolen;
84   //To detect termination
85   int created;
86   int processed;
87   int Inactivity_Detected;
88 public:
89   // The Essentials
90   schedulerObject() {}
91   schedulerObject(SchedulerData *m);
92   ~schedulerObject() 
93   {
94     free(neighborlist);
95     free(loadlist);
96     free(lbtopo);
97     //free(fp);
98     while(!(myisempty(queue))){
99                   mydequeue(queue);
100     }
101     free(queue->front);
102     delete(queue);
103   }
104   schedulerObject& operator=(const schedulerObject& obj) {
105     chpt<state_schedulerObject>::operator=(obj);
106     maxObjects = obj.maxObjects;
107     connectivity = obj.connectivity;
108     id = obj.id;
109     data = obj.data;
110     count = obj.count;    
111     maxNeighbors=obj.maxNeighbors;
112     load=obj.load;
113     WorkTime=obj.WorkTime;
114     IdleTime=obj.IdleTime;
115     lastovt=obj.lastovt;
116     MinProc=obj.MinProc;
117     MinLoad=obj.MinLoad;
118     Mindex=obj.Mindex;
119     prevovt=obj.prevovt;
120     created=obj.created;
121     processed=obj.processed;
122     lbtopolen=obj.lbtopolen;
123     Inactivity_Detected=obj.Inactivity_Detected;
124     /*fp=(FILE *)malloc(sizeof(FILE));
125     fp=obj.fp;*/
126     neighborlist=(int *)malloc(sizeof(int)*maxNeighbors);
127     loadlist=(int *)malloc(sizeof(int)*maxNeighbors);
128     for(int i=0;i<maxNeighbors;i++){
129                  neighborlist[i]=obj.neighborlist[i];
130                  loadlist[i]=obj.loadlist[i];
131                 }
132     lbtopo=(char*)malloc(sizeof(char)*lbtopolen);
133     NODE* ptr;
134     ptr=obj.queue->front;
135     queue= new QUEUE;
136     myinitialise(queue);
137     while (ptr!=obj.queue->rear) {
138                   ptr=ptr->next;
139                   myenqueue(queue,ptr->data);
140                 } 
141     //printf("I am here");      
142     return *this;
143   }
144   void pup(PUP::er &p) {
145     chpt<state_schedulerObject>::pup(p);
146     p(maxObjects);
147     p(connectivity);
148     p(id);
149     p(data);
150     p(count);
151     p(maxNeighbors);
152     p(lbtopolen);
153     p(load);
154     p(WorkTime);
155     p(IdleTime);
156     p(lastovt);
157     p(MinProc);
158     p(MinLoad);
159     p(Mindex);
160     p(prevovt);
161     p(created);
162     p(processed);
163     p(Inactivity_Detected);
164     //p(fp);
165     if (p.isUnpacking()) {
166                 neighborlist=(int *)malloc(sizeof(int)*maxNeighbors);
167                 loadlist=(int *)malloc(sizeof(int)*maxNeighbors);
168                 lbtopo=(char*)malloc(sizeof(char)*lbtopolen);
169                 //fp=(FILE *)malloc(sizeof(FILE));
170                 //queue=(NODE *)malloc(sizeof(NODE)*load);
171                 }
172   }
173   // Event methods
174   void receiveWork(computeMsg *m);
175   void receiveWork_anti(computeMsg *) { restore(this); }
176   void receiveWork_commit(computeMsg *) { /*printf("Commiting event receiveWork for %d now\n",id);*/}
177   
178   void startWork(computeMsg *m);
179   void startWork_anti(computeMsg *) { restore(this); }
180   void startWork_commit(computeMsg *) { /*printf("Commiting event startWork for %d now\n",id);*/}
181
182   void recvLoad(computeMsg *m);
183   void recvLoad_anti(computeMsg *) { restore(this); }
184   void recvLoad_commit(computeMsg *){ /*printf("Commiting event recvLoad for %d now\n",id);*/}
185
186   void sendData(computeMsg *m);
187   void sendData_anti(computeMsg *) { restore(this); }
188   void sendData_commit(computeMsg *){ /*printf("Commiting event sendData for %d now\n",id);*/} 
189
190   //local functions
191   void ldbalance();
192   void ldminavg(int&);
193   void fibonacci(long int);
194   void findneighbors();
195  };
196
197 #endif
198