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