build: fix travis MPI/SMP build
[charm.git] / src / conv-ldb / cldb.test.C
1 #include "converse.h"
2 #include "cldb.h"
3 #include "queueing.h"
4 #include <stdlib.h>
5
6 void LoadNotifyFn(int l)
7 {
8 }
9
10 const char *CldGetStrategy(void)
11 {
12   return "rand";
13 }
14
15 void CldBalanceHandler(void *msg)
16 {
17   CldRestoreHandler((char *)msg);
18   CldPutToken((char *)msg);
19 }
20
21 void CldHandler(char *msg)
22 {
23   int len, queueing, priobits;
24   unsigned int *prioptr; 
25   CldInfoFn ifn; CldPackFn pfn;
26
27   CldRestoreHandler(msg);
28   ifn = (CldInfoFn)CmiHandlerToFunction(CmiGetInfo(msg));
29   ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
30   CsdEnqueueGeneral(msg, queueing, priobits, prioptr);
31 }
32
33 void CldEnqueueMulti(int npes, const int *pes, void *msg, int infofn)
34 {
35   int len, queueing, priobits,i; unsigned int *prioptr;
36   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
37   CldPackFn pfn;
38   ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
39   if (pfn) {
40     pfn(&msg);
41     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
42   }
43   CldSwitchHandler((char *)msg, CpvAccess(CldHandlerIndex));
44   CmiSetInfo(msg,infofn);
45   for(i=0;i<npes;i++) {
46     CmiSyncSend(pes[i], len, msg);
47   }
48   CmiFree(msg);
49 }
50
51 void CldEnqueue(int pe, void *msg, int infofn)
52 {
53   int len, queueing, priobits; unsigned int *prioptr;
54   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
55   CldPackFn pfn;
56
57   if (pe == CLD_ANYWHERE) {
58     pe = (((CrnRand()+CmiMyPe())&0x7FFFFFFF)%CmiNumPes());
59     while (!CldPresentPE(pe))
60       pe = (((CrnRand()+CmiMyPe())&0x7FFFFFFF)%CmiNumPes());
61     if (pe != CmiMyPe())
62       CpvAccess(CldRelocatedMessages)++;
63     if (pe == CmiMyPe()) {
64       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
65       CmiSetInfo(msg,infofn);
66       CldPutToken((char *)msg);
67     } 
68     else {
69       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
70       if (pfn) {
71         pfn(&msg);
72         ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
73       }
74       CldSwitchHandler((char *)msg, CpvAccess(CldBalanceHandlerIndex));
75       CmiSetInfo(msg,infofn);
76       CmiSyncSendAndFree(pe, len, msg);
77     }
78   }
79   else if ((pe == CmiMyPe()) || (CmiNumPes() == 1)) {
80     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
81     CmiSetInfo(msg,infofn);
82     CsdEnqueueGeneral(msg, CQS_QUEUEING_LIFO, priobits, prioptr);
83   }
84   else {
85     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
86     if (pfn) {
87       pfn(&msg);
88       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
89     }
90     CldSwitchHandler((char *)msg, CpvAccess(CldHandlerIndex));
91     CmiSetInfo(msg,infofn);
92     if (pe==CLD_BROADCAST) { CmiSyncBroadcastAndFree(len, msg); }
93     else if (pe==CLD_BROADCAST_ALL) { CmiSyncBroadcastAllAndFree(len, msg); }
94     else CmiSyncSendAndFree(pe, len, msg);
95   }
96 }
97
98 void CldNodeEnqueue(int node, void *msg, int infofn)
99 {
100   int len, queueing, priobits; unsigned int *prioptr;
101   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
102   CldPackFn pfn;
103   if (node == CLD_ANYWHERE) {
104     /* node = (((rand()+CmiMyNode())&0x7FFFFFFF)%CmiNumNodes()); */
105     node = (((CrnRand()+CmiMyNode())&0x7FFFFFFF)%CmiNumNodes());
106     if (node != CmiMyNode())
107       CpvAccess(CldRelocatedMessages)++;
108   }
109   if (node == CmiMyNode()) {
110     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
111     CsdNodeEnqueueGeneral(msg, queueing, priobits, prioptr);
112   } 
113   else {
114     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
115     if (pfn) {
116       pfn(&msg);
117       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
118     }
119     CldSwitchHandler((char *)msg, CpvAccess(CldHandlerIndex));
120     CmiSetInfo(msg,infofn);
121     if (node==CLD_BROADCAST) { CmiSyncNodeBroadcastAndFree(len, msg); }
122     else if (node==CLD_BROADCAST_ALL){CmiSyncNodeBroadcastAllAndFree(len,msg);}
123     else CmiSyncNodeSendAndFree(node, len, msg);
124   }
125 }
126
127 void CldModuleInit(char **argv)
128 {
129   CpvInitialize(int, CldHandlerIndex);
130   CpvInitialize(int, CldBalanceHandlerIndex);
131   CpvAccess(CldHandlerIndex) = CmiRegisterHandler((CmiHandler)CldHandler);
132   CpvAccess(CldBalanceHandlerIndex) = CmiRegisterHandler(CldBalanceHandler);
133   CpvInitialize(int, CldRelocatedMessages);
134   CpvInitialize(int, CldLoadBalanceMessages);
135   CpvInitialize(int, CldMessageChunks);
136   CpvAccess(CldRelocatedMessages) = CpvAccess(CldLoadBalanceMessages) = 
137     CpvAccess(CldMessageChunks) = 0;
138   CldModuleGeneralInit(argv);
139 }