cc2f8518720226d366e5f37d524911b80666110d
[charm.git] / tests / converse / megacon / ringsimple.c
1 #include <stdio.h>
2 #include <converse.h>
3 #define entries    100
4 void Cpm_megacon_ack();
5
6 typedef struct
7 {
8   char core[CmiMsgHeaderSizeBytes]; 
9   int hops, ringno;
10   int data[10];
11 } ringmsg;
12
13 CpvDeclare(int, ringsimple_hop_index);
14
15 void ringsimple_fail()
16 {
17   CmiPrintf("data corrupted in ringsimple_hop.\n");
18   exit(1);
19 }
20
21 void ringsimple_hop(ringmsg *msg)
22 {
23   int thispe = CmiMyPe();
24   int nextpe = (thispe+1) % CmiNumPes();
25   // CmiPrintf("[%d] ringsimple #%d hop send to %d hop: %d\n", thispe, msg->ringno, nextpe, msg->hops);
26   int i;
27   for (i=0; i<10; i++)
28     if (msg->data[i] != i) ringsimple_fail();
29   if (msg->hops) {
30     msg->hops--;
31     CmiSyncSendAndFree(nextpe, sizeof(ringmsg), msg);
32   } else {
33     Cpm_megacon_ack(CpmSend(0));
34     CmiFree(msg);
35   }
36 }
37
38 void ringsimple_init(void)
39 {
40   int i; ringmsg msg={{0},1000,0,{0}};
41   for (i=0; i<10; i++) msg.data[i] = i;
42   CmiSetHandler(&msg, CpvAccess(ringsimple_hop_index));
43   for (i=0; i<entries; i++) {
44     msg.ringno = i;
45     CmiSyncSend(0, sizeof(ringmsg), &msg);
46   }
47 }
48
49 void ringsimple_moduleinit()
50 {
51   CpvInitialize(int, ringsimple_hop_index);
52   CpvAccess(ringsimple_hop_index) = CmiRegisterHandler((CmiHandler)ringsimple_hop);
53 }
54
55
56