doc: Add serial to list of ci file reserved words
[charm.git] / src / ck-ldb / ComboCentLB.C
1 /**
2  * \addtogroup CkLdb
3 */
4 /*@{*/
5
6 /*
7 Status:
8   * support nonmigratable attrib
9   * does not support processor avail bitvector
10 */
11
12 #include "ComboCentLB.h"
13
14 extern LBAllocFn getLBAllocFn(char *lbname);
15
16 CreateLBFunc_Def(ComboCentLB, "Allow multiple strategies to work serially")
17
18 ComboCentLB::ComboCentLB(const CkLBOptions &opt): CentralLB(opt)
19 {
20   lbname = "ComboCentLB";
21   const char *lbs = theLbdb->loadbalancer(opt.getSeqNo());
22   if (CkMyPe() == 0)
23     CkPrintf("[%d] ComboCentLB created with %s\n",CkMyPe(), lbs);
24   
25   char *lbcopy = strdup(lbs);
26   char *p = strchr(lbcopy, ':');
27   if (p==NULL) return;
28   p = strtok(p+1, ",");
29   while (p) {
30     LBAllocFn fn = getLBAllocFn(p);
31     if (fn == NULL) {
32       CkPrintf("LB> Invalid load balancer: %s.\n", p);
33       CmiAbort("");
34     }
35     BaseLB *alb = fn();
36     clbs.push_back((CentralLB*)alb);
37     p = strtok(NULL, ",");
38   }
39 }
40
41 void ComboCentLB::work(LDStats* stats)
42 {
43   int nlbs = clbs.length();
44   int n_objs = stats->n_objs;
45   int *from_orig = new int[n_objs];
46   int obj;
47
48   // stats->from_proc should remain untouched at end
49   for (obj=0; obj<n_objs; obj++) from_orig[obj] = stats->from_proc[obj];
50
51   for (int i=0; i<nlbs; i++) {
52     clbs[i]->work(stats);
53     if (i!=nlbs-1) {
54       for (obj=0; obj<stats->n_objs; obj++) 
55         stats->from_proc[obj] = stats->to_proc[obj];
56     }
57   }
58
59   for (obj=0; obj<n_objs; obj++) stats->from_proc[obj] = from_orig[obj];
60
61   delete [] from_orig;
62 }
63
64 #include "ComboCentLB.def.h"
65
66
67 /*@}*/