Route ampif77 and ampif90 through ampiCC, factoring out duplicated code
[charm.git] / src / conv-core / cpm.c
blob3adae27931118c036236cbaf502333b698f9509b
1 #include <stdlib.h>
2 #include <string.h>
3 #include "queueing.h"
4 #include <converse.h>
6 static void CpmLSend(int pe, int len, void *msg)
8 if (pe==CpmALL) CmiSyncBroadcastAllAndFree(len, msg);
9 else if (pe==CpmOTHERS) CmiSyncBroadcastAndFree(len, msg);
10 else CmiSyncSendAndFree(pe,len,msg);
13 /******************************************************************************
15 * Control for simple-send
17 *****************************************************************************/
19 typedef struct CpmDestinationSend_s
21 void *(*sendfn)(struct CpmDestinationSend_s *, int, void *);
22 int envsize;
23 int pe;
25 *CpmDestinationSend;
27 typedef struct CpmDestinationSend_s DestinationSend;
29 void *CpmSend1(CpmDestinationSend ctrl, int len, void *msg)
31 CpmLSend(ctrl->pe, len, msg);
32 return (void *) 0;
35 CpvStaticDeclare(DestinationSend, ctrlSend);
37 CpmDestination CpmSend(int pe)
39 CpvAccess(ctrlSend).envsize = 0;
40 CpvAccess(ctrlSend).sendfn = CpmSend1;
41 CpvAccess(ctrlSend).pe = pe;
42 return (CpmDestination)&CpvAccess(ctrlSend);
45 /******************************************************************************
47 * Control for CpmEnqueue
49 *****************************************************************************/
51 typedef struct CpmDestinationEnq_s
53 void *(*sendfn)(struct CpmDestinationEnq_s *, int, void *);
54 int envsize;
55 int pe, qs, priobits;
56 unsigned int *prioptr;
58 *CpmDestinationEnq;
60 typedef struct CpmDestinationEnq_s DestinationEnq;
62 CpvStaticDeclare(DestinationEnq, ctrlEnq);
64 CpvDeclare(int, CpmEnqueue2_Index);
66 void CpmEnqueue2(void *msg)
68 int *env;
69 env = (int *)CpmEnv(msg);
70 CmiSetHandler(msg, env[0]);
71 CsdEnqueueGeneral(msg, env[1], env[2], (unsigned int *)(env+3));
74 void *CpmEnqueue1(CpmDestinationEnq ctrl, int len, void *msg)
76 int *env = (int *)CpmEnv(msg);
77 int intbits = sizeof(int)*8;
78 int priobits = ctrl->priobits;
79 int prioints = (priobits+intbits-1) / intbits;
80 env[0] = CmiGetHandler(msg);
81 env[1] = ctrl->qs;
82 env[2] = ctrl->priobits;
83 memcpy(env+3, ctrl->prioptr, prioints*sizeof(int));
84 CmiSetHandler(msg, CpvAccess(CpmEnqueue2_Index));
85 CpmLSend(ctrl->pe, len, msg);
86 return (void *) 0;
89 CpmDestination CpmEnqueue(int pe, int qs, int priobits,unsigned int *prioptr)
91 int intbits = sizeof(int)*8;
92 int prioints = (priobits+intbits-1) / intbits;
93 CpvAccess(ctrlEnq).envsize = (3+prioints)*sizeof(int);
94 CpvAccess(ctrlEnq).sendfn = CpmEnqueue1;
95 CpvAccess(ctrlEnq).pe = pe; CpvAccess(ctrlEnq).qs = qs;
96 CpvAccess(ctrlEnq).priobits = priobits; CpvAccess(ctrlEnq).prioptr = prioptr;
97 return (CpmDestination)&CpvAccess(ctrlEnq);
100 CpvStaticDeclare(unsigned int, fiprio);
102 CpmDestination CpmEnqueueIFIFO(int pe, int prio)
104 CpvAccess(fiprio) = prio;
105 return CpmEnqueue(pe, CQS_QUEUEING_IFIFO, sizeof(int)*8, &CpvAccess(fiprio));
108 CpvStaticDeclare(unsigned int, liprio);
110 CpmDestination CpmEnqueueILIFO(int pe, int prio)
112 CpvAccess(liprio) = prio;
113 return CpmEnqueue(pe, CQS_QUEUEING_ILIFO, sizeof(int)*8, &CpvAccess(liprio));
116 CpmDestination CpmEnqueueBFIFO(int pe, int priobits,unsigned int *prioptr)
118 return CpmEnqueue(pe, CQS_QUEUEING_BFIFO, priobits, prioptr);
121 CpmDestination CpmEnqueueBLIFO(int pe, int priobits,unsigned int *prioptr)
123 return CpmEnqueue(pe, CQS_QUEUEING_BLIFO, priobits, prioptr);
126 CpmDestination CpmEnqueueLFIFO(int pe, int priobits,unsigned int *prioptr)
128 return CpmEnqueue(pe, CQS_QUEUEING_LFIFO, priobits, prioptr);
131 CpmDestination CpmEnqueueLLIFO(int pe, int priobits,unsigned int *prioptr)
133 return CpmEnqueue(pe, CQS_QUEUEING_LLIFO, priobits, prioptr);
136 /******************************************************************************
138 * Control for Enqueue-FIFO
140 *****************************************************************************/
142 CpvDeclare(int, CpmEnqueueFIFO2_Index);
144 void CpmEnqueueFIFO2(void *msg)
146 int *env;
147 env = (int *)CpmEnv(msg);
148 CmiSetHandler(msg, env[0]);
149 CsdEnqueueFifo(msg);
152 void *CpmEnqueueFIFO1(CpmDestinationSend ctrl, int len, void *msg)
154 int *env = (int *)CpmEnv(msg);
155 env[0] = CmiGetHandler(msg);
156 CmiSetHandler(msg, CpvAccess(CpmEnqueueFIFO2_Index));
157 CpmLSend(ctrl->pe, len, msg);
158 return (void *) 0;
161 CpvStaticDeclare(DestinationSend, ctrlFIFO);
163 CpmDestination CpmEnqueueFIFO(int pe)
165 CpvAccess(ctrlFIFO).envsize = sizeof(int);
166 CpvAccess(ctrlFIFO).sendfn = CpmEnqueueFIFO1;
167 CpvAccess(ctrlFIFO).pe = pe;
168 return (CpmDestination)&CpvAccess(ctrlFIFO);
171 /******************************************************************************
173 * Control for Enqueue-LIFO
175 *****************************************************************************/
177 CpvDeclare(int, CpmEnqueueLIFO2_Index);
179 void CpmEnqueueLIFO2(void *msg)
181 int *env;
182 env = (int *)CpmEnv(msg);
183 CmiSetHandler(msg, env[0]);
184 CsdEnqueueLifo(msg);
187 void *CpmEnqueueLIFO1(CpmDestinationSend ctrl, int len, void *msg)
189 int *env = (int *)CpmEnv(msg);
190 env[0] = CmiGetHandler(msg);
191 CmiSetHandler(msg, CpvAccess(CpmEnqueueLIFO2_Index));
192 CpmLSend(ctrl->pe, len, msg);
193 return (void *) 0;
196 CpvStaticDeclare(DestinationSend, ctrlLIFO);
198 CpmDestination CpmEnqueueLIFO(int pe)
200 CpvAccess(ctrlLIFO).envsize = sizeof(int);
201 CpvAccess(ctrlLIFO).sendfn = CpmEnqueueLIFO1;
202 CpvAccess(ctrlLIFO).pe = pe;
203 return (CpmDestination)&CpvAccess(ctrlLIFO);
206 /******************************************************************************
208 * Control for thread-creation
210 *****************************************************************************/
212 CpvDeclare(int, CpmThread2_Index);
214 void CpmThread3(void *msg)
216 int *env = (int *)CpmEnv(msg);
217 CmiHandlerInfo *h=&CmiHandlerToInfo(env[0]);
218 (h->hdlr)(msg,h->userPtr);
219 CthFree(CthSelf()); CthSuspend();
222 void CpmThread2(void *msg)
224 CthThread t;
225 t = CthCreate(CpmThread3, msg, 0);
226 CthSetStrategyDefault(t); CthAwaken(t);
229 void *CpmThread1(CpmDestinationSend ctrl, int len, void *msg)
231 int *env = (int *)CpmEnv(msg);
232 env[0] = CmiGetHandler(msg);
233 CmiSetHandler(msg, CpvAccess(CpmThread2_Index));
234 CpmLSend(ctrl->pe, len, msg);
235 return (void *) 0;
238 CpvStaticDeclare(DestinationSend, ctrlThread);
240 CpmDestination CpmMakeThread(int pe)
242 CpvAccess(ctrlThread).envsize = sizeof(int);
243 CpvAccess(ctrlThread).sendfn = CpmThread1;
244 CpvAccess(ctrlThread).pe = pe;
245 return (CpmDestination)&CpvAccess(ctrlThread);
248 /******************************************************************************
250 * Control for thread-creation with size parameter
252 *****************************************************************************/
254 CpvDeclare(int, CpmThreadSize2_Index);
256 typedef struct CpmDestinationThreadSize_s
258 void *(*sendfn)(struct CpmDestinationThreadSize_s *, int, void *);
259 int envsize;
260 int pe;
261 int size;
263 *CpmDestinationThreadSize;
265 typedef struct CpmDestinationThreadSize_s DestinationThreadSize;
267 void CpmThreadSize2(void *msg)
269 int *env = (int *)CpmEnv(msg);
270 CthThread t;
271 t = CthCreate(CpmThread3, msg, env[1]);
272 CthSetStrategyDefault(t); CthAwaken(t);
275 void *CpmThreadSize1(CpmDestinationThreadSize ctrl, int len, void *msg)
277 int *env = (int *)CpmEnv(msg);
278 env[0] = CmiGetHandler(msg);
279 env[1] = ctrl->size;
280 CmiSetHandler(msg, CpvAccess(CpmThreadSize2_Index));
281 CpmLSend(ctrl->pe, len, msg);
282 return (void *) 0;
285 CpvStaticDeclare(DestinationThreadSize, ctrlThreadSize);
287 CpmDestination CpmMakeThreadSize(int pe, int size)
289 CpvAccess(ctrlThreadSize).envsize = 2*sizeof(int);
290 CpvAccess(ctrlThreadSize).sendfn = CpmThreadSize1;
291 CpvAccess(ctrlThreadSize).pe = pe;
292 CpvAccess(ctrlThreadSize).size = size;
293 return (CpmDestination)&CpvAccess(ctrlThreadSize);
296 /******************************************************************************
298 * Cpm initialization
300 *****************************************************************************/
302 void CpmModuleInit(void)
304 CpvInitialize(int, CpmThread2_Index);
305 CpvAccess(CpmThread2_Index) = CmiRegisterHandler(CpmThread2);
306 CpvInitialize(int, CpmThreadSize2_Index);
307 CpvAccess(CpmThreadSize2_Index) = CmiRegisterHandler(CpmThreadSize2);
308 CpvInitialize(int, CpmEnqueueFIFO2_Index);
309 CpvAccess(CpmEnqueueFIFO2_Index) = CmiRegisterHandler(CpmEnqueueFIFO2);
310 CpvInitialize(int, CpmEnqueueLIFO2_Index);
311 CpvAccess(CpmEnqueueLIFO2_Index) = CmiRegisterHandler(CpmEnqueueLIFO2);
312 CpvInitialize(int, CpmEnqueue2_Index);
313 CpvAccess(CpmEnqueue2_Index) = CmiRegisterHandler(CpmEnqueue2);
314 CpvInitialize(DestinationSend, ctrlSend);
315 CpvInitialize(DestinationEnq, ctrlEnq);
316 CpvInitialize(DestinationSend, ctrlFIFO);
317 CpvInitialize(DestinationSend, ctrlLIFO);
318 CpvInitialize(DestinationSend, ctrlThread);
319 CpvInitialize(DestinationThreadSize, ctrlThreadSize);
320 CpvInitialize(unsigned int, fiprio);
321 CpvInitialize(unsigned int, liprio);