Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Borland uses the thread implementation of the contextes
[simgrid.git] / src / simix / smx_action.c
1 /*      $Id$     */
2
3 /* Copyright (c) 2007 Arnaud Legrand, Bruno Donnassolo.
4    All rights reserved.                                          */
5
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. */
8
9 #include "private.h"
10 #include "xbt/log.h"
11
12 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_action, simix,
13                                 "Logging specific to SIMIX (action)");
14
15 /************************************* Actions *********************************/
16
17 smx_action_t SIMIX_action_communicate(smx_host_t sender,smx_host_t receiver,char * name, double size, double rate)
18 {
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);
22         }
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);
25         }
26
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();
32         
33         /* initialize them */
34         act->name = xbt_strdup(name);
35
36
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);
41
42         return act;
43 }
44
45 smx_action_t SIMIX_action_execute(smx_host_t host, char * name, double amount)
46 {
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);
50         }
51
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();
57         
58         /* initialize them */
59         simdata->source = host;
60         act-> name = xbt_strdup(name);
61
62         /* set communication */
63         simdata->surf_action = surf_workstation_resource->extension_public->
64                 execute(host->simdata->host, amount);
65
66         surf_workstation_resource->common_public->action_set_data(simdata->surf_action,act);
67
68         return act;
69 }
70
71
72 smx_action_t SIMIX_action_sleep(smx_host_t host,  double duration)
73 {
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();
80         
81         /* initialize them */
82         simdata->source = host;
83         act->name = xbt_strdup(name);
84
85         simdata->surf_action = surf_workstation_resource->extension_public->
86                 sleep(host->simdata->host, duration);
87
88         surf_workstation_resource->common_public->action_set_data(simdata->surf_action,act);
89
90         return act;
91 }
92
93
94 void SIMIX_action_cancel(smx_action_t action)
95 {
96   xbt_assert0((action != NULL), "Invalid parameter");
97
98   if(action->simdata->surf_action) {
99     surf_workstation_resource->common_public->action_cancel(action->simdata->surf_action);
100   }
101   return;
102 }
103
104 void SIMIX_action_set_priority(smx_action_t action, double priority)
105 {
106         xbt_assert0( (action != NULL) && (action->simdata != NULL), "Invalid parameter" );
107
108         surf_workstation_resource->common_public->
109                 set_priority(action->simdata->surf_action, priority);
110         return;
111 }
112
113 void SIMIX_action_destroy(smx_action_t action)
114 {
115
116         xbt_assert0((action != NULL), "Invalid parameter");
117
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));
120
121         if(action->name) free(action->name);
122
123         xbt_fifo_free(action->simdata->cond_list);
124
125         if(action->simdata->surf_action) 
126                 action->simdata->surf_action->resource_type->common_public->action_free(action->simdata->surf_action);
127
128         return;
129 }
130
131 void SIMIX_register_action_to_condition(smx_action_t action, smx_cond_t cond)
132 {
133         xbt_assert0( (action != NULL) && (cond != NULL), "Invalid parameters");
134
135         xbt_fifo_push(cond->actions,action);
136 }
137