9c3ff836501faa7cca7c20ae5d504897cb3d56b9
[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     CsdEnqueueGeneral(msg, queueing, priobits, prioptr);
93   } else {
94     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
95     if (pfn && CmiNodeOf(pe) != CmiMyNode()) {
96       pfn(&msg);
97       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
98     }
99     CldSwitchHandler(msg, CpvAccess(CldHandlerIndex));
100     CmiSetInfo(msg,infofn);
101     if (pe==CLD_BROADCAST) { CmiSyncBroadcastAndFree(len, msg); }
102     else if (pe==CLD_BROADCAST_ALL) { CmiSyncBroadcastAllAndFree(len, msg); }
103     else {
104         CmiPrintf(" on processor %d Send msg to pe:%d, length=%d Timer:%f \n", CmiMyPe(), pe, len, CmiWallTimer());
105         CmiSyncSendAndFree(pe, len, msg);
106     }
107   }
108 }
109
110 void CldNodeEnqueue(int node, void *msg, int infofn)
111 {
112   int len, queueing, priobits; unsigned int *prioptr;
113   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
114   CldPackFn pfn;
115   if (node == CLD_ANYWHERE) {
116     node = (((CrnRand()+CmiMyNode())&0x7FFFFFFF)%CmiNumNodes());
117     if (node != CmiMyNode())
118       CpvAccess(CldRelocatedMessages)++;
119   }
120   if (node == CmiMyNode() && !CmiImmIsRunning()) {
121     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
122     CsdNodeEnqueueGeneral(msg, queueing, priobits, prioptr);
123   } else {
124     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
125     if (pfn) {
126       pfn(&msg);
127       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
128     }
129     CldSwitchHandler(msg, CpvAccess(CldHandlerIndex));
130     CmiSetInfo(msg,infofn);
131     if (node==CLD_BROADCAST) { CmiSyncNodeBroadcastAndFree(len, msg); }
132     else if (node==CLD_BROADCAST_ALL){CmiSyncNodeBroadcastAllAndFree(len,msg);}
133     else CmiSyncNodeSendAndFree(node, len, msg);
134   }
135 }
136
137 void CldModuleInit(char **argv)
138 {
139   CpvInitialize(int, CldHandlerIndex);
140   CpvAccess(CldHandlerIndex) = CmiRegisterHandler((CmiHandler)CldHandler);
141   CpvInitialize(int, CldRelocatedMessages);
142   CpvInitialize(int, CldLoadBalanceMessages);
143   CpvInitialize(int, CldMessageChunks);
144   CpvAccess(CldRelocatedMessages) = CpvAccess(CldLoadBalanceMessages) = 
145     CpvAccess(CldMessageChunks) = 0;
146   CldModuleGeneralInit(argv);
147 }