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