Merge branch 'charm' of charmgit:charm into charm
[charm.git] / examples / charm++ / queens / counter.C
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4
5 #include "charm++.h"
6
7 #include "counter.h"
8 #include "Counter.def.h"
9
10 counter::counter(DUMMY *m)
11
12   // initialize the local count;
13   mygrp = thisgroup;
14   myCount = totalCount = 0;
15   waitFor = CkNumPes(); // wait for all processors to report
16   threadId = NULL;
17 }
18
19 void counter::increment()
20 {
21   myCount++;
22 }
23
24 void counter::sendCounts(DUMMY *m)
25   // This method is invoked via a broadcast. Each branch then reports 
26   // its count to the branch on 0 (or via a spanning tree.)
27 {
28   CProxy_counter grp(mygrp);
29   grp[0].childCount(new countMsg(myCount));
30   delete m;
31 }
32
33 void counter::childCount(countMsg *m)
34 {
35   totalCount += m->count;
36   waitFor--;
37   if (waitFor == 0) 
38     if (threadId) { CthAwaken(threadId);}
39 }
40
41 int counter::getTotalCount()
42 {
43   CProxy_counter grp(mygrp);
44   grp.sendCounts(new DUMMY);//this is a broadcast, as no processor is mentioned
45   threadId = CthSelf();
46   while (waitFor != 0)  CthSuspend(); 
47   return totalCount;
48 }
49 CkGroupID  counterInit()
50 {
51   DUMMY *m = new  DUMMY;
52   CkGroupID g =CProxy_counter::ckNew(m);  // create a new group of class "counter"
53   return g;
54 }