Logo AND Algorithmique Numérique Distribuée

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