c927ff7366fe573f806249e2501d495aa55c935a
[charm.git] / tests / converse / megacon / multicast.c
1 #include <stdio.h>
2 #include <converse.h>
3
4 void Cpm_megacon_ack();
5
6 typedef struct bchare
7 {
8   CmiGroup grp;
9   int totalsent;
10   int totalreplies;
11 }
12 *bchare;
13
14 typedef struct mesg
15 {
16   char head[CmiMsgHeaderSizeBytes];
17   int reply_pe;
18   bchare reply_ptr;
19   int magic;
20 }
21 *mesg;
22
23 CpvDeclare(int, multicast_recv_idx);
24 CpvDeclare(int, multicast_reply_idx);
25
26 void multicast_recv(mesg m)
27 {
28   if (m->magic != 0x12345678) {
29     CmiPrintf("multicast failed.\n");
30     exit(1);
31   }
32   CmiSetHandler(m, CpvAccess(multicast_reply_idx));
33   CmiSyncSend(m->reply_pe, sizeof(struct mesg), m);
34 }
35
36 void multicast_start_cycle(bchare c)
37 {
38   struct mesg m; struct mesg *mp;
39   switch (c->totalsent) {
40   case 0:
41     CmiSetHandler(&m, CpvAccess(multicast_recv_idx));
42     m.reply_ptr = c; m.reply_pe = CmiMyPe(); m.magic = 0x12345678;
43     CmiSyncMulticast(c->grp, sizeof(struct mesg),&m);
44     c->totalsent++;
45     break;
46   case 1:
47   case 2:
48     mp = (mesg)CmiAlloc(sizeof(struct mesg));
49     CmiSetHandler(mp, CpvAccess(multicast_recv_idx));
50     mp->reply_ptr = c; mp->reply_pe = CmiMyPe();mp->magic = 0x12345678;
51     CmiSyncMulticastAndFree(c->grp, sizeof(struct mesg), mp);
52     c->totalsent++;
53     break;
54   case 3:
55     free(c);
56     Cpm_megacon_ack(CpmSend(0));
57   }
58 }
59
60 void multicast_reply(mesg m)
61 {
62   bchare c;
63   if (m->magic != 0x12345678) {
64     CmiPrintf("multicast failed.\n");
65     exit(1);
66   }
67   c = m->reply_ptr;
68   c->totalreplies++;
69   if ((c->totalreplies % CmiNumPes())==0) multicast_start_cycle(c);
70 }
71
72 CmiGroup multicast_all()
73 {
74   int i, *pes, npes; CmiGroup grp;
75   npes = CmiNumPes();
76   pes = (int*)malloc(npes*sizeof(int));
77   for (i=0; i<npes; i++) pes[i] = i;
78   grp = CmiEstablishGroup(CmiNumPes(), pes);
79   free(pes);
80   return grp;
81 }
82
83 void multicast_init(void)
84 {
85   bchare c;
86   c = (bchare)malloc(sizeof(struct bchare));
87   c->grp = multicast_all();
88   c->totalsent = 0;
89   c->totalreplies = 0;
90   multicast_start_cycle(c);
91 }
92
93 void multicast_moduleinit()
94 {
95   CpvInitialize(int, multicast_recv_idx);
96   CpvInitialize(int, multicast_reply_idx);
97   CpvAccess(multicast_recv_idx) = CmiRegisterHandler(multicast_recv);
98   CpvAccess(multicast_reply_idx) = CmiRegisterHandler(multicast_reply);
99 }
100
101
102
103
104
105