Adding leanmd simplified as an example
[charm.git] / examples / charm++ / ring / ring.C
1 #include <string.h>
2 #include "ring.h"
3
4 void *
5 Msg::pack(Msg* m)
6 {
7   int *p = (int *) CkAllocBuffer(m, (m->listsize+3)*sizeof(int));  
8   int *t = p;
9
10   *t = m->value; t++;
11   *t = m->hop; t++;
12   *t = m->listsize; t++;
13   for(int i=0;i<m->listsize; i++, t++)
14     *t = m->list1[i];
15   delete [] m->list1;
16   CkFreeMsg(m);
17   return(p);
18 }
19
20 Msg *
21 Msg::unpack(void *buf)
22 {
23    int *in = (int *) buf;
24    Msg *t = new (CkAllocBuffer(in, sizeof(Msg))) Msg;
25    t->value = in[0];
26    t->hop = in[1];
27    t->listsize = in[2];
28    t->list1 = new int[t->listsize];
29    for(int i=0;i<t->listsize;i++)
30      t->list1[i] = in[i+3];
31    CkFreeMsg(buf);
32    return t;
33 }
34
35 Btest::Btest(Msg *m)
36 {
37   CkPrintf("branch created on %d\n", CkMyPe());
38
39 // Uses the hop information from the message.
40   nexthop=(CkMyPe()+(m->hop)) % CkNumPes();
41
42 // Takes care of negative hops
43   if (nexthop < 0) nexthop += CkNumPes();
44
45   if (CkMyPe()==0) {
46     CProxy_Btest btest(thisgroup);
47     btest[nexthop].recv_msg(m);
48   } else  {
49     delete m;
50   }
51 }
52
53 void 
54 Btest::recv_msg(Msg * m)
55 {
56   CkPrintf("Message received on  %d for ring %d\n", CkMyPe(), m->value);
57
58 // BOC at Processor 0 initiates and terminates a ring.
59   if (CkMyPe() == 0) {
60      CkPrintf("Message got back! %d \n", m->value);
61      CProxy_main mainchare(main::mainhandle);
62      mainchare.quit_when_done(m);
63   } else {
64     CProxy_Btest btest(thisgroup);
65     btest[nexthop].recv_msg(m);
66   }
67 }
68
69 CkChareID main::mainhandle;
70
71 main::main(CkArgMsg* m)
72 {
73   Msg *msg1 = new Msg;
74   mainhandle=thishandle;
75
76   msg1->value = 1;
77   msg1->hop=1;
78   msg1->listsize=10;
79   msg1->list1=new int[msg1->listsize];
80   for (int i=0;i<msg1->listsize;i++) 
81     msg1->list1[i]=i;
82   CProxy_Btest::ckNew(msg1);
83   delete m;
84 }
85
86 // Keeps track of the number of rings that terminated. An alternative 
87 // would be to use quiscence detection.
88 void 
89 main::quit_when_done(Msg *m)
90 {
91    CkPrintf("The ring %d terminated\n", m->value);
92    for (int i=0;i<m->listsize;i++)
93      CkPrintf("%d\n", m->list1[i]);
94    delete m;
95    CkExit();
96 }
97
98 #include "ring.def.h"
99