add phase change notification
[charm.git] / src / conv-ldb / cldb.rand.c
1 #include "converse.h"
2 #include "queueing.h"
3 #include "cldb.h"
4 #include <stdlib.h>
5
6 void LoadNotifyFn(int l)
7 {
8 }
9
10 char *CldGetStrategy(void)
11 {
12   return "rand";
13 }
14
15 void CldHandler(char *msg)
16 {
17   int len, queueing, priobits;
18   unsigned int *prioptr; CldInfoFn ifn; CldPackFn pfn;
19   CldRestoreHandler(msg);
20   ifn = (CldInfoFn)CmiHandlerToFunction(CmiGetInfo(msg));
21   ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
22   CsdEnqueueGeneral(msg, queueing, priobits, prioptr);
23 }
24
25 void CldNodeHandler(char *msg)
26 {
27   int len, queueing, priobits;
28   unsigned int *prioptr; CldInfoFn ifn; CldPackFn pfn;
29   CldRestoreHandler(msg);
30   ifn = (CldInfoFn)CmiHandlerToFunction(CmiGetInfo(msg));
31   ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
32   CsdNodeEnqueueGeneral(msg, queueing, priobits, prioptr);
33 }
34
35 void CldEnqueueGroup(CmiGroup grp, void *msg, int infofn)
36 {
37   int len, queueing, priobits,i; unsigned int *prioptr;
38   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
39   CldPackFn pfn;
40   ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
41   if (pfn) {
42     pfn(&msg);
43     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
44   }
45   CldSwitchHandler(msg, CpvAccess(CldHandlerIndex));
46   CmiSetInfo(msg,infofn);
47
48   CmiSyncMulticastAndFree(grp, len, msg);
49 }
50
51 void CldEnqueueMulti(int npes, int *pes, void *msg, int infofn)
52 {
53   int len, queueing, priobits,i; unsigned int *prioptr;
54   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
55   CldPackFn pfn;
56   ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
57   if (pfn) {
58     pfn(&msg);
59     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
60   }
61   CldSwitchHandler(msg, CpvAccess(CldHandlerIndex));
62   CmiSetInfo(msg,infofn);
63
64   /*
65   for(i=0;i<npes;i++) {
66     CmiSyncSend(pes[i], len, msg);
67   }
68   CmiFree(msg);
69   */
70
71   CmiSyncListSendAndFree(npes, pes, len, msg);
72 }
73
74 void CldEnqueue(int pe, void *msg, int infofn)
75 {
76   int len, queueing, priobits; unsigned int *prioptr;
77   CldInfoFn ifn;
78   CldPackFn pfn;
79   if (pe == CLD_ANYWHERE) {
80     pe = (((CrnRand()+CmiMyPe())&0x7FFFFFFF)%CmiNumPes());
81       /* optimizationfor SMP */
82 #if CMK_NODE_QUEUE_AVAILABLE
83     if (CmiNodeOf(pe) == CmiMyNode()) {
84       CldNodeEnqueue(CmiMyNode(), msg, infofn);
85       return;
86     }
87 #endif
88     if (pe != CmiMyPe())
89       CpvAccess(CldRelocatedMessages)++;
90   }
91   ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
92   if (pe == CmiMyPe() && !CmiImmIsRunning()) {
93     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
94     /* CsdEnqueueGeneral is not thread or SIGIO safe */
95     //CmiPrintf("   myself processor %d ==> %d, length=%d Timer:%f , priori=%d \n", CmiMyPe(), pe, len, CmiWallTimer(), *prioptr);
96     CsdEnqueueGeneral(msg, queueing, priobits, prioptr);
97   } else {
98     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
99     if (pfn && CmiNodeOf(pe) != CmiMyNode()) {
100       pfn(&msg);
101       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
102     }
103     CldSwitchHandler(msg, CpvAccess(CldHandlerIndex));
104     CmiSetInfo(msg,infofn);
105     if (pe==CLD_BROADCAST) { CmiSyncBroadcastAndFree(len, msg); }
106     else if (pe==CLD_BROADCAST_ALL) { CmiSyncBroadcastAllAndFree(len, msg); }
107     else {
108         //CmiPrintf("   processor %d ==> %d, length=%d Timer:%f , priori=%d \n", CmiMyPe(), pe, len, CmiWallTimer(), *prioptr);
109         CmiSyncSendAndFree(pe, len, msg);
110     }
111   }
112 }
113
114 void CldNodeEnqueue(int node, void *msg, int infofn)
115 {
116   int len, queueing, priobits; unsigned int *prioptr;
117   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
118   CldPackFn pfn;
119   if (node == CLD_ANYWHERE) {
120     node = (((CrnRand()+CmiMyNode())&0x7FFFFFFF)%CmiNumNodes());
121     if (node != CmiMyNode())
122       CpvAccess(CldRelocatedMessages)++;
123   }
124   if (node == CmiMyNode() && !CmiImmIsRunning()) {
125     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
126     CsdNodeEnqueueGeneral(msg, queueing, priobits, prioptr);
127   } else {
128     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
129     if (pfn) {
130       pfn(&msg);
131       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
132     }
133     CldSwitchHandler(msg, CpvAccess(CldNodeHandlerIndex));
134     CmiSetInfo(msg,infofn);
135     if (node==CLD_BROADCAST) { CmiSyncNodeBroadcastAndFree(len, msg); }
136     else if (node==CLD_BROADCAST_ALL){CmiSyncNodeBroadcastAllAndFree(len,msg);}
137     else CmiSyncNodeSendAndFree(node, len, msg);
138   }
139 }
140
141 void CldModuleInit(char **argv)
142 {
143   CpvInitialize(int, CldHandlerIndex);
144   CpvAccess(CldHandlerIndex) = CmiRegisterHandler((CmiHandler)CldHandler);
145   CpvInitialize(int, CldNodeHandlerIndex);
146   CpvAccess(CldNodeHandlerIndex) = CmiRegisterHandler((CmiHandler)CldNodeHandler);
147   CpvInitialize(int, CldRelocatedMessages);
148   CpvInitialize(int, CldLoadBalanceMessages);
149   CpvInitialize(int, CldMessageChunks);
150   CpvAccess(CldRelocatedMessages) = CpvAccess(CldLoadBalanceMessages) = 
151     CpvAccess(CldMessageChunks) = 0;
152   CldModuleGeneralInit(argv);
153 }
154
155 void CldCallback()
156 {}