3 /* Copyright (c) 2007 Arnaud Legrand, Bruno Donnassolo.
4 All rights reserved. */
6 /* This program is free software; you can redistribute it and/or modify it
7 * under the terms of the license (GNU LGPL) which comes with this package. */
12 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_action, simix,
13 "Logging specific to SIMIX (action)");
15 /************************************* Actions *********************************/
17 smx_action_t SIMIX_action_communicate(smx_host_t sender,smx_host_t receiver,char * name, double size, double rate)
19 /* check if the host is active */
20 if ( surf_workstation_resource->extension_public->get_state(sender->simdata->host)!=SURF_CPU_ON) {
21 THROW1(1,1,"Host %s failed, you cannot call this function",sender->name);
23 if ( surf_workstation_resource->extension_public->get_state(receiver->simdata->host)!=SURF_CPU_ON) {
24 THROW1(1,1,"Host %s failed, you cannot call this function",receiver->name);
27 /* alloc structures */
28 smx_action_t act = xbt_new0(s_smx_action_t,1);
29 act->simdata = xbt_new0(s_simdata_action_t,1);
30 simdata_action_t simdata = act->simdata;
31 simdata->cond_list = xbt_fifo_new();
34 act->name = xbt_strdup(name);
37 simdata->surf_action = surf_workstation_resource->extension_public->
38 communicate(sender->simdata->host,
39 receiver->simdata->host, size, rate);
40 surf_workstation_resource->common_public->action_set_data(simdata->surf_action,act);
45 smx_action_t SIMIX_action_execute(smx_host_t host, char * name, double amount)
47 /* check if the host is active */
48 if ( surf_workstation_resource->extension_public->get_state(host->simdata->host)!=SURF_CPU_ON) {
49 THROW1(1,1,"Host %s failed, you cannot call this function",host->name);
52 /* alloc structures */
53 smx_action_t act = xbt_new0(s_smx_action_t,1);
54 act->simdata = xbt_new0(s_simdata_action_t,1);
55 simdata_action_t simdata = act->simdata;
56 simdata->cond_list = xbt_fifo_new();
59 simdata->source = host;
60 act-> name = xbt_strdup(name);
62 /* set communication */
63 simdata->surf_action = surf_workstation_resource->extension_public->
64 execute(host->simdata->host, amount);
66 surf_workstation_resource->common_public->action_set_data(simdata->surf_action,act);
72 smx_action_t SIMIX_action_sleep(smx_host_t host, double duration)
74 char name[] = "sleep";
75 /* alloc structures */
76 smx_action_t act = xbt_new0(s_smx_action_t,1);
77 act->simdata = xbt_new0(s_simdata_action_t,1);
78 simdata_action_t simdata = act->simdata;
79 simdata->cond_list = xbt_fifo_new();
82 simdata->source = host;
83 act->name = xbt_strdup(name);
85 simdata->surf_action = surf_workstation_resource->extension_public->
86 sleep(host->simdata->host, duration);
88 surf_workstation_resource->common_public->action_set_data(simdata->surf_action,act);
94 void SIMIX_action_cancel(smx_action_t action)
96 xbt_assert0((action != NULL), "Invalid parameter");
98 if(action->simdata->surf_action) {
99 surf_workstation_resource->common_public->action_cancel(action->simdata->surf_action);
104 void SIMIX_action_set_priority(smx_action_t action, double priority)
106 xbt_assert0( (action != NULL) && (action->simdata != NULL), "Invalid parameter" );
108 surf_workstation_resource->common_public->
109 set_priority(action->simdata->surf_action, priority);
113 void SIMIX_action_destroy(smx_action_t action)
116 xbt_assert0((action != NULL), "Invalid parameter");
118 xbt_assert1((xbt_fifo_size(action->simdata->cond_list)==0),
119 "Conditional list not empty %d. There is a problem. Cannot destroy it now!", xbt_fifo_size(action->simdata->cond_list));
121 if(action->name) free(action->name);
123 xbt_fifo_free(action->simdata->cond_list);
125 if(action->simdata->surf_action)
126 action->simdata->surf_action->resource_type->common_public->action_free(action->simdata->surf_action);
131 void SIMIX_register_action_to_condition(smx_action_t action, smx_cond_t cond)
133 xbt_assert0( (action != NULL) && (cond != NULL), "Invalid parameters");
135 xbt_fifo_push(cond->actions,action);