Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Simplify the handling of SIMIX requests.
[simgrid.git] / src / simix / smx_smurf.c
1 #include "private.h"
2 #include "xbt/fifo.h"
3 #include "xbt/xbt_os_thread.h"
4
5 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_smurf, simix,
6                                 "Logging specific to SIMIX (SMURF)");
7
8 /* FIXME: we may want to save the initialization of issuer... */
9 XBT_INLINE smx_req_t SIMIX_req_mine()
10 {
11   smx_process_t issuer = SIMIX_process_self();
12   return &issuer->request;
13 }
14
15 void SIMIX_request_push()
16 {
17   smx_process_t issuer = SIMIX_process_self();
18
19   if (issuer != simix_global->maestro_process){
20     issuer->request.issuer = issuer;
21     XBT_DEBUG("Yield process '%s' on request of type %s (%d)", issuer->name,
22         SIMIX_request_name(issuer->request.call), issuer->request.call);
23     SIMIX_process_yield();
24   } else {
25     SIMIX_request_pre(&issuer->request, 0);
26   }
27 }
28
29 void SIMIX_request_answer(smx_req_t req)
30 {
31   if (req->issuer != simix_global->maestro_process){
32     XBT_DEBUG("Answer request %s (%d)", SIMIX_request_name(req->call), req->call);
33     req->issuer->request.call = REQ_NO_REQ;
34     xbt_dynar_push_as(simix_global->process_to_run, smx_process_t, req->issuer);
35   }
36 }
37
38 void SIMIX_request_pre(smx_req_t req, int value)
39 {
40
41   switch (req->call) {
42     case REQ_COMM_TEST:
43       SIMIX_pre_comm_test(req);
44       break;
45
46     case REQ_COMM_TESTANY:
47       SIMIX_pre_comm_testany(req, value);
48       break;
49
50     case REQ_COMM_WAIT:
51       SIMIX_pre_comm_wait(req,
52           req->comm_wait.comm,
53           req->comm_wait.timeout,
54           value);
55       break;
56
57     case REQ_COMM_WAITANY:
58       SIMIX_pre_comm_waitany(req, value);
59       break;
60
61     case REQ_COMM_SEND:
62     {
63       smx_action_t comm = SIMIX_comm_isend(
64           req->issuer,
65           req->comm_send.rdv,
66           req->comm_send.task_size,
67           req->comm_send.rate,
68           req->comm_send.src_buff,
69           req->comm_send.src_buff_size,
70           req->comm_send.match_fun,
71           req->comm_send.data,
72           0);
73       SIMIX_pre_comm_wait(req, comm, req->comm_send.timeout, 0);
74       break;
75     }
76
77     case REQ_COMM_ISEND:
78       req->comm_isend.result = SIMIX_comm_isend(
79           req->issuer,
80           req->comm_isend.rdv,
81           req->comm_isend.task_size,
82           req->comm_isend.rate,
83           req->comm_isend.src_buff,
84           req->comm_isend.src_buff_size,
85           req->comm_isend.match_fun,
86           req->comm_isend.data,
87           req->comm_isend.detached);
88       SIMIX_request_answer(req);
89       break;
90
91     case REQ_COMM_RECV:
92     {
93       smx_action_t comm = SIMIX_comm_irecv(
94           req->issuer,
95           req->comm_recv.rdv,
96           req->comm_recv.dst_buff,
97           req->comm_recv.dst_buff_size,
98           req->comm_recv.match_fun,
99           req->comm_recv.data);
100       SIMIX_pre_comm_wait(req, comm, req->comm_recv.timeout, 0);
101       break;
102     }
103
104     case REQ_COMM_IRECV:
105       req->comm_irecv.result = SIMIX_comm_irecv(
106           req->issuer,
107           req->comm_irecv.rdv,
108           req->comm_irecv.dst_buff,
109           req->comm_irecv.dst_buff_size,
110           req->comm_irecv.match_fun,
111           req->comm_irecv.data);
112       SIMIX_request_answer(req);
113       break;
114
115     case REQ_COMM_DESTROY:
116       SIMIX_comm_destroy(req->comm_destroy.comm);
117       SIMIX_request_answer(req);
118       break;
119
120     case REQ_COMM_CANCEL:
121       SIMIX_comm_cancel(req->comm_cancel.comm);
122       SIMIX_request_answer(req);
123       break;
124
125     case REQ_COMM_GET_REMAINS:
126       req->comm_get_remains.result =
127           SIMIX_comm_get_remains(req->comm_get_remains.comm);
128       SIMIX_request_answer(req);
129       break;
130
131     case REQ_COMM_GET_STATE:
132       req->comm_get_state.result =
133           SIMIX_comm_get_state(req->comm_get_state.comm);
134       SIMIX_request_answer(req);
135       break;
136
137     case REQ_COMM_GET_SRC_DATA:
138       req->comm_get_src_data.result = SIMIX_comm_get_src_data(req->comm_get_src_data.comm);
139       SIMIX_request_answer(req);
140       break;
141
142     case REQ_COMM_GET_DST_DATA:
143       req->comm_get_dst_data.result = SIMIX_comm_get_dst_data(req->comm_get_dst_data.comm);
144       SIMIX_request_answer(req);
145       break;
146
147     case REQ_COMM_GET_SRC_PROC:
148       req->comm_get_src_proc.result =
149           SIMIX_comm_get_src_proc(req->comm_get_src_proc.comm);
150       SIMIX_request_answer(req);
151       break;
152
153     case REQ_COMM_GET_DST_PROC:
154       req->comm_get_dst_proc.result =
155           SIMIX_comm_get_dst_proc(req->comm_get_dst_proc.comm);
156       SIMIX_request_answer(req);
157       break;
158
159 #ifdef HAVE_LATENCY_BOUND_TRACKING
160     case REQ_COMM_IS_LATENCY_BOUNDED:
161       req->comm_is_latency_bounded.result =
162           SIMIX_comm_is_latency_bounded(req->comm_is_latency_bounded.comm);
163       SIMIX_request_answer(req);
164       break;
165 #endif
166
167     case REQ_RDV_CREATE:
168       req->rdv_create.result = SIMIX_rdv_create(req->rdv_create.name);
169       SIMIX_request_answer(req);
170       break;
171
172     case REQ_RDV_DESTROY:
173       SIMIX_rdv_destroy(req->rdv_destroy.rdv);
174       SIMIX_request_answer(req);
175       break;
176
177     case REQ_RDV_GEY_BY_NAME:
178       req->rdv_get_by_name.result =
179         SIMIX_rdv_get_by_name(req->rdv_get_by_name.name);
180       SIMIX_request_answer(req);
181       break;
182
183     case REQ_RDV_COMM_COUNT_BY_HOST:
184       req->rdv_comm_count_by_host.result = SIMIX_rdv_comm_count_by_host(
185           req->rdv_comm_count_by_host.rdv,
186           req->rdv_comm_count_by_host.host);
187       SIMIX_request_answer(req);
188       break;
189
190     case REQ_RDV_GET_HEAD:
191       req->rdv_get_head.result = SIMIX_rdv_get_head(req->rdv_get_head.rdv);
192       SIMIX_request_answer(req);
193       break;
194
195     case REQ_HOST_GET_BY_NAME:
196       req->host_get_by_name.result =
197         SIMIX_host_get_by_name(req->host_get_by_name.name);
198       SIMIX_request_answer(req);
199       break;
200
201     case REQ_HOST_GET_NAME:
202       req->host_get_name.result =       SIMIX_host_get_name(req->host_get_name.host);
203       SIMIX_request_answer(req);
204       break;
205
206     case REQ_HOST_GET_PROPERTIES:
207       req->host_get_properties.result =
208         SIMIX_host_get_properties(req->host_get_properties.host);
209       SIMIX_request_answer(req);
210       break;
211
212     case REQ_HOST_GET_SPEED:
213       req->host_get_speed.result = 
214         SIMIX_host_get_speed(req->host_get_speed.host);
215       SIMIX_request_answer(req);
216       break;
217
218     case REQ_HOST_GET_AVAILABLE_SPEED:
219       req->host_get_available_speed.result =
220         SIMIX_host_get_available_speed(req->host_get_available_speed.host);
221       SIMIX_request_answer(req);
222       break;
223
224     case REQ_HOST_GET_STATE:
225       req->host_get_state.result = 
226         SIMIX_host_get_state(req->host_get_state.host);
227       SIMIX_request_answer(req);
228       break;
229
230     case REQ_HOST_GET_DATA:
231       req->host_get_data.result =       SIMIX_host_get_data(req->host_get_data.host);
232       SIMIX_request_answer(req);
233       break;
234
235     case REQ_HOST_SET_DATA:
236       SIMIX_host_set_data(req->host_set_data.host, req->host_set_data.data);
237       SIMIX_request_answer(req);
238       break;
239
240     case REQ_HOST_EXECUTE:
241       req->host_execute.result = SIMIX_host_execute(
242           req->host_execute.name,
243           req->host_execute.host,
244           req->host_execute.computation_amount,
245           req->host_execute.priority);
246       SIMIX_request_answer(req);
247       break;
248
249     case REQ_HOST_PARALLEL_EXECUTE:
250       req->host_parallel_execute.result = SIMIX_host_parallel_execute(
251           req->host_parallel_execute.name,
252           req->host_parallel_execute.host_nb,
253           req->host_parallel_execute.host_list,
254           req->host_parallel_execute.computation_amount,
255           req->host_parallel_execute.communication_amount,
256           req->host_parallel_execute.amount,
257           req->host_parallel_execute.rate);
258       SIMIX_request_answer(req);
259       break;
260
261     case REQ_HOST_EXECUTION_DESTROY:
262       SIMIX_host_execution_destroy(req->host_execution_destroy.execution);
263       SIMIX_request_answer(req);
264       break;
265
266     case REQ_HOST_EXECUTION_CANCEL:
267       SIMIX_host_execution_cancel(req->host_execution_cancel.execution);
268       SIMIX_request_answer(req);
269       break;
270
271     case REQ_HOST_EXECUTION_GET_REMAINS:
272       req->host_execution_get_remains.result =
273         SIMIX_host_execution_get_remains(req->host_execution_get_remains.execution);
274       SIMIX_request_answer(req);
275       break;
276
277     case REQ_HOST_EXECUTION_GET_STATE:
278       req->host_execution_get_state.result =
279         SIMIX_host_execution_get_state(req->host_execution_get_state.execution);
280       SIMIX_request_answer(req);
281       break;
282
283     case REQ_HOST_EXECUTION_SET_PRIORITY:
284       SIMIX_host_execution_set_priority(
285           req->host_execution_set_priority.execution,
286           req->host_execution_set_priority.priority);
287       SIMIX_request_answer(req);
288       break;
289
290     case REQ_HOST_EXECUTION_WAIT:
291       SIMIX_pre_host_execution_wait(req);
292       break;
293
294     case REQ_PROCESS_CREATE:
295       SIMIX_process_create(
296           req->process_create.process,
297           req->process_create.name,
298           req->process_create.code,
299           req->process_create.data,
300           req->process_create.hostname,
301           req->process_create.argc,
302           req->process_create.argv,
303           req->process_create.properties);
304       SIMIX_request_answer(req);
305       break;
306
307     case REQ_PROCESS_KILL:
308       SIMIX_process_kill(req->process_kill.process);
309       SIMIX_request_answer(req);
310       break;
311
312     case REQ_PROCESS_KILLALL:
313       SIMIX_process_killall(req->issuer);
314       SIMIX_request_answer(req);
315       break;
316
317     case REQ_PROCESS_CLEANUP:
318       SIMIX_process_cleanup(req->process_cleanup.process);
319       SIMIX_request_answer(req);
320       break;
321
322     case REQ_PROCESS_CHANGE_HOST:
323       SIMIX_pre_process_change_host(
324           req->process_change_host.process,
325           req->process_change_host.dest);
326       SIMIX_request_answer(req);
327       break;
328
329     case REQ_PROCESS_SUSPEND:
330       SIMIX_pre_process_suspend(req);
331       break;
332
333     case REQ_PROCESS_RESUME:
334       SIMIX_process_resume(req->process_resume.process, req->issuer);
335       SIMIX_request_answer(req);
336       break;
337
338     case REQ_PROCESS_COUNT:
339       req->process_count.result = SIMIX_process_count();
340       SIMIX_request_answer(req);
341       break;
342
343     case REQ_PROCESS_GET_DATA:
344       req->process_get_data.result =
345         SIMIX_process_get_data(req->process_get_data.process);
346       SIMIX_request_answer(req);
347       break;
348
349     case REQ_PROCESS_SET_DATA:
350       SIMIX_process_set_data(
351           req->process_set_data.process,
352           req->process_set_data.data);
353       SIMIX_request_answer(req);
354       break;
355
356     case REQ_PROCESS_GET_HOST:
357       req->process_get_host.result = SIMIX_process_get_host(req->process_get_host.process);
358       SIMIX_request_answer(req);
359       break;
360
361     case REQ_PROCESS_GET_NAME:
362       req->process_get_name.result = SIMIX_process_get_name(req->process_get_name.process);
363       SIMIX_request_answer(req);
364       break;
365
366     case REQ_PROCESS_IS_SUSPENDED:
367       req->process_is_suspended.result =
368         SIMIX_process_is_suspended(req->process_is_suspended.process);
369       SIMIX_request_answer(req);
370       break;
371
372     case REQ_PROCESS_GET_PROPERTIES:
373       req->process_get_properties.result =
374         SIMIX_process_get_properties(req->process_get_properties.process);
375       SIMIX_request_answer(req);
376       break;
377
378     case REQ_PROCESS_SLEEP:
379       SIMIX_pre_process_sleep(req);
380       break;
381
382 #ifdef HAVE_TRACING
383     case REQ_SET_CATEGORY:
384       SIMIX_set_category(
385           req->set_category.action,
386           req->set_category.category);
387       SIMIX_request_answer(req);
388       break;
389 #endif
390
391     case REQ_MUTEX_INIT:
392       req->mutex_init.result = SIMIX_mutex_init();
393       SIMIX_request_answer(req);
394       break;
395
396     case REQ_MUTEX_DESTROY:
397       SIMIX_mutex_destroy(req->mutex_destroy.mutex);
398       SIMIX_request_answer(req);
399       break;
400
401     case REQ_MUTEX_LOCK:
402       SIMIX_pre_mutex_lock(req);
403       break;
404
405     case REQ_MUTEX_TRYLOCK:
406       req->mutex_trylock.result =
407               SIMIX_mutex_trylock(req->mutex_trylock.mutex, req->issuer);
408       SIMIX_request_answer(req);
409       break;
410
411     case REQ_MUTEX_UNLOCK:
412       SIMIX_mutex_unlock(req->mutex_unlock.mutex, req->issuer);
413       SIMIX_request_answer(req);
414       break;
415
416     case REQ_COND_INIT:
417       req->cond_init.result = SIMIX_cond_init();
418       SIMIX_request_answer(req);
419       break;
420
421     case REQ_COND_DESTROY:
422       SIMIX_cond_destroy(req->cond_destroy.cond);
423       SIMIX_request_answer(req);
424       break;
425
426     case REQ_COND_SIGNAL:
427       SIMIX_cond_signal(req->cond_signal.cond);
428       SIMIX_request_answer(req);
429       break;
430
431     case REQ_COND_WAIT:
432       SIMIX_pre_cond_wait(req);
433       break;
434
435     case REQ_COND_WAIT_TIMEOUT:
436       SIMIX_pre_cond_wait_timeout(req);
437       break;
438
439     case REQ_COND_BROADCAST:
440       SIMIX_cond_broadcast(req->cond_broadcast.cond);
441       SIMIX_request_answer(req);
442       break;
443
444     case REQ_SEM_INIT:
445       req->sem_init.result = SIMIX_sem_init(req->sem_init.capacity);
446       SIMIX_request_answer(req);
447       break;
448
449     case REQ_SEM_DESTROY:
450       SIMIX_sem_destroy(req->sem_destroy.sem);
451       SIMIX_request_answer(req);
452       break;
453
454     case REQ_SEM_RELEASE:
455       SIMIX_sem_release(req->sem_release.sem);
456       SIMIX_request_answer(req);
457       break;
458
459     case REQ_SEM_WOULD_BLOCK:
460       req->sem_would_block.result =
461         SIMIX_sem_would_block(req->sem_would_block.sem);
462       SIMIX_request_answer(req);
463       break;
464
465     case REQ_SEM_ACQUIRE:
466       SIMIX_pre_sem_acquire(req);
467       break;
468
469     case REQ_SEM_ACQUIRE_TIMEOUT:
470       SIMIX_pre_sem_acquire_timeout(req);
471       break;
472
473     case REQ_SEM_GET_CAPACITY:
474       req->sem_get_capacity.result = 
475         SIMIX_sem_get_capacity(req->sem_get_capacity.sem);
476       SIMIX_request_answer(req);
477       break;
478
479     case REQ_NO_REQ:
480       THROWF(arg_error,0,"Asked to do the noop syscall on %s@%s",
481           SIMIX_process_get_name(req->issuer),
482           SIMIX_host_get_name(SIMIX_process_get_host(req->issuer))
483           );
484       break;
485   }
486 }
487
488 void SIMIX_request_post(smx_action_t action)
489 {
490   switch (action->type) {
491
492     case SIMIX_ACTION_EXECUTE:
493     case SIMIX_ACTION_PARALLEL_EXECUTE:
494       SIMIX_post_host_execute(action);
495       break;
496
497     case SIMIX_ACTION_COMMUNICATE:
498       SIMIX_post_comm(action);
499       break;
500
501     case SIMIX_ACTION_SLEEP:
502       SIMIX_post_process_sleep(action);
503       break;
504
505     case SIMIX_ACTION_SYNCHRO:
506       SIMIX_post_synchro(action);
507       break;
508
509     case SIMIX_ACTION_IO:
510       break;
511   }
512 }