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 *);
27 typedef struct CpmDestinationSend_s DestinationSend
;
29 void *CpmSend1(CpmDestinationSend ctrl
, int len
, void *msg
)
31 CpmLSend(ctrl
->pe
, len
, msg
);
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 *);
56 unsigned int *prioptr
;
60 typedef struct CpmDestinationEnq_s DestinationEnq
;
62 CpvStaticDeclare(DestinationEnq
, ctrlEnq
);
64 CpvDeclare(int, CpmEnqueue2_Index
);
66 void CpmEnqueue2(void *msg
)
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
);
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
);
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
)
147 env
= (int *)CpmEnv(msg
);
148 CmiSetHandler(msg
, env
[0]);
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
);
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
)
182 env
= (int *)CpmEnv(msg
);
183 CmiSetHandler(msg
, env
[0]);
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
);
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
)
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
);
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 *);
263 *CpmDestinationThreadSize
;
265 typedef struct CpmDestinationThreadSize_s DestinationThreadSize
;
267 void CpmThreadSize2(void *msg
)
269 int *env
= (int *)CpmEnv(msg
);
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
);
280 CmiSetHandler(msg
, CpvAccess(CpmThreadSize2_Index
));
281 CpmLSend(ctrl
->pe
, len
, msg
);
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 /******************************************************************************
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
);