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