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