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