added #ifdefs to these files with Windows include directives and function prototypes
[charm.git] / src / conv-ldb / cldb.test.c
1 #include <stdio.h>
2
3 #ifdef WIN32
4 #include "queueing.h"
5 extern void CldGetToken(char **);
6 extern void CldSwitchHandler(char *, int);
7 extern int CldCountTokens();
8 extern void CldRestoreHandler(char *);
9 extern void CldPutToken(char *);
10 extern void CqsEnqueueGeneral(Queue, void *, unsigned int, unsigned int, unsigned int*);
11 extern void CldModuleGeneralInit();
12 #endif
13
14 #include "converse.h"
15 #define PERIOD 100
16 #define MAXMSGBFRSIZE 100000
17
18 void LoadNotifyFn(int l)
19 {
20 }
21
22 char *CldGetStrategy(void)
23 {
24   return "test";
25 }
26
27 CpvDeclare(int, CldHandlerIndex);
28 CpvDeclare(int, CldBalanceHandlerIndex);
29 CpvDeclare(int, CldRelocatedMessages);
30 CpvDeclare(int, CldLoadBalanceMessages);
31 CpvDeclare(int, CldMessageChunks);
32
33 void CldMultipleSend(int pe, int numToSend)
34 {
35   void **msgs;
36   int len, queueing, priobits, *msgSizes, i, numSent, done=0, parcelSize;
37   unsigned int *prioptr;
38   CldInfoFn ifn;
39   CldPackFn pfn;
40
41   if (numToSend == 0)
42     return;
43
44   msgs = (void **)calloc(numToSend, sizeof(void *));
45   msgSizes = (int *)calloc(numToSend, sizeof(int));
46
47   while (!done) {
48     numSent = 0;
49     parcelSize = 0;
50     for (i=0; i<numToSend; i++) {
51       CldGetToken(&msgs[i]);
52       if (msgs[i] != 0) {
53         done = 1;
54         numSent++;
55         ifn = (CldInfoFn)CmiHandlerToFunction(CmiGetInfo(msgs[i]));
56         ifn(msgs[i], &pfn, &len, &queueing, &priobits, &prioptr);
57         msgSizes[i] = len;
58         parcelSize += len;
59         CldSwitchHandler(msgs[i], CpvAccess(CldBalanceHandlerIndex));
60       }
61       else {
62         done = 1;
63         break;
64       }
65       if (parcelSize > MAXMSGBFRSIZE) {
66         if (i<numToSend-1)
67           done = 0;
68         numToSend -= numSent;
69         break;
70       }
71     }
72     if (numSent > 1) {
73       CmiMultipleSend(pe, numSent, msgSizes, (char**) msgs);
74       for (i=0; i<numSent; i++)
75         CmiFree(msgs[i]);
76       CpvAccess(CldRelocatedMessages) += numSent;
77       CpvAccess(CldMessageChunks)++;
78     }
79     else if (numSent == 1) {
80       CmiSyncSend(pe, msgSizes[0], msgs[0]);
81       CmiFree(msgs[0]);
82       CpvAccess(CldRelocatedMessages)++;
83       CpvAccess(CldMessageChunks)++;
84     }
85   }
86   free(msgs);
87   free(msgSizes);
88 }
89
90 void CldDistributeTokens()
91 {
92   int destPe = (CmiMyPe()+1)%CmiNumPes();
93   int numToSend;
94
95   numToSend = CldEstimate() / 2;
96   if (numToSend > CldCountTokens())
97     numToSend = CldCountTokens() / 2;
98
99   if (numToSend > 0)
100     CldMultipleSend(destPe, numToSend);
101
102   CcdCallFnAfter((CcdVoidFn)CldDistributeTokens, NULL, PERIOD);
103 }
104
105 void CldBalanceHandler(void *msg)
106 {
107   CmiGrabBuffer((void **)&msg);
108   CldRestoreHandler(msg);
109   CldPutToken(msg);
110 }
111
112 void CldHandler(void *msg)
113 {
114   CldInfoFn ifn; CldPackFn pfn;
115   int len, queueing, priobits; unsigned int *prioptr;
116   
117   CmiGrabBuffer((void **)&msg);
118   CldRestoreHandler(msg);
119   ifn = (CldInfoFn)CmiHandlerToFunction(CmiGetInfo(msg));
120   ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
121   CsdEnqueueGeneral(msg, queueing, priobits, prioptr);
122 }
123
124 void CldEnqueue(int pe, void *msg, int infofn)
125 {
126   int len, queueing, priobits; unsigned int *prioptr;
127   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
128   CldPackFn pfn;
129
130   if ((pe == CLD_ANYWHERE) && (CmiNumPes() > 1)) {
131     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
132     CmiSetInfo(msg,infofn);
133     CldPutToken(msg); 
134   } 
135   else if ((pe == CmiMyPe()) || (CmiNumPes() == 1)) {
136     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
137     CmiSetInfo(msg,infofn);
138     CsdEnqueueGeneral(msg, queueing, priobits, prioptr);
139   }
140   else {
141     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
142     if (pfn) {
143       pfn(&msg);
144       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
145     }
146     CldSwitchHandler(msg, CpvAccess(CldHandlerIndex));
147     CmiSetInfo(msg,infofn);
148     if (pe==CLD_BROADCAST) 
149       CmiSyncBroadcastAndFree(len, msg);
150     else if (pe==CLD_BROADCAST_ALL)
151       CmiSyncBroadcastAllAndFree(len, msg);
152     else CmiSyncSendAndFree(pe, len, msg);
153   }
154 }
155
156 void CldHelpModuleInit()
157 {
158   CpvInitialize(int, CldBalanceHandlerIndex);
159
160   CpvAccess(CldBalanceHandlerIndex) = 
161     CmiRegisterHandler(CldBalanceHandler);
162
163   if (CmiNumPes() > 1)
164     CldDistributeTokens();
165 }
166
167 void CldModuleInit()
168 {
169   CpvInitialize(int, CldHandlerIndex);
170   CpvInitialize(int, CldRelocatedMessages);
171   CpvInitialize(int, CldLoadBalanceMessages);
172   CpvInitialize(int, CldMessageChunks);
173   CpvAccess(CldHandlerIndex) = CmiRegisterHandler(CldHandler);
174   CpvAccess(CldRelocatedMessages) = CpvAccess(CldLoadBalanceMessages) = 
175     CpvAccess(CldMessageChunks) = 0;
176   CldModuleGeneralInit();
177   CldHelpModuleInit();
178 }