c037b4899da3746b3fe6647ef530c50a178c8a02
[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 CldEnqueueMulti(int npes, int *pes, 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   /*
46   for(i=0;i<npes;i++) {
47     CmiSyncSend(pes[i], len, msg);
48   }
49   CmiFree(msg);
50   */
51
52   CmiSyncListSendAndFree(npes, pes, len, msg);
53 }
54
55 void CldEnqueue(int pe, void *msg, int infofn)
56 {
57   int len, queueing, priobits; unsigned int *prioptr;
58   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
59   CldPackFn pfn;
60   if (pe == CLD_ANYWHERE) {
61     pe = (((CrnRand()+CmiMyPe())&0x7FFFFFFF)%CmiNumPes());
62     if (pe != CmiMyPe())
63       CpvAccess(CldRelocatedMessages)++;
64   }
65   if (pe == CmiMyPe() && !CmiImmIsRunning()) {
66     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
67     /* CsdEnqueueGeneral is not thread or SIGIO safe */
68     CsdEnqueueGeneral(msg, queueing, priobits, prioptr);
69   } else {
70     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
71     if (pfn && CmiNodeOf(pe) != CmiMyNode()) {
72       pfn(&msg);
73       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
74     }
75     CldSwitchHandler(msg, CpvAccess(CldHandlerIndex));
76     CmiSetInfo(msg,infofn);
77     if (pe==CLD_BROADCAST) { CmiSyncBroadcastAndFree(len, msg); }
78     else if (pe==CLD_BROADCAST_ALL) { CmiSyncBroadcastAllAndFree(len, msg); }
79     else CmiSyncSendAndFree(pe, len, msg);
80   }
81 }
82
83 void CldNodeEnqueue(int node, void *msg, int infofn)
84 {
85   int len, queueing, priobits; unsigned int *prioptr;
86   CldInfoFn ifn = (CldInfoFn)CmiHandlerToFunction(infofn);
87   CldPackFn pfn;
88   if (node == CLD_ANYWHERE) {
89     node = (((CrnRand()+CmiMyNode())&0x7FFFFFFF)%CmiNumNodes());
90     if (node != CmiMyNode())
91       CpvAccess(CldRelocatedMessages)++;
92   }
93   if (node == CmiMyNode() && !CmiImmIsRunning()) {
94     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
95     CsdNodeEnqueueGeneral(msg, queueing, priobits, prioptr);
96   } else {
97     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
98     if (pfn) {
99       pfn(&msg);
100       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
101     }
102     CldSwitchHandler(msg, CpvAccess(CldHandlerIndex));
103     CmiSetInfo(msg,infofn);
104     if (node==CLD_BROADCAST) { CmiSyncNodeBroadcastAndFree(len, msg); }
105     else if (node==CLD_BROADCAST_ALL){CmiSyncNodeBroadcastAllAndFree(len,msg);}
106     else CmiSyncNodeSendAndFree(node, len, msg);
107   }
108 }
109
110 void CldModuleInit(char **argv)
111 {
112   CpvInitialize(int, CldHandlerIndex);
113   CpvAccess(CldHandlerIndex) = CmiRegisterHandler((CmiHandler)CldHandler);
114   CpvInitialize(int, CldRelocatedMessages);
115   CpvInitialize(int, CldLoadBalanceMessages);
116   CpvInitialize(int, CldMessageChunks);
117   CpvAccess(CldRelocatedMessages) = CpvAccess(CldLoadBalanceMessages) = 
118     CpvAccess(CldMessageChunks) = 0;
119   CldModuleGeneralInit(argv);
120 }