1 /* Task-related bindings to ruby */
3 /* Copyright (c) 2010. The SimGrid Team.
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. */
10 #include "bindings/ruby_bindings.h"
12 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(ruby);
15 void rb_task_free(m_task_t tk)
17 //MSG_task_destroy(tk); ( This cause a bug !! is it really necessary ?!! not really sure !! )
21 VALUE rb_task_new(VALUE class, VALUE name, VALUE comp_size,
24 m_task_t task = MSG_task_create(RSTRING_PTR(name), NUM2INT(comp_size),
25 NUM2INT(comm_size), NULL);
26 rb_data_t data = malloc(sizeof(s_ruby_data_t));
27 data->ruby_task = NULL;
28 data->user_data = NULL;
29 MSG_task_set_data(task, (void *) data);
30 // Wrap m_task_t to a Ruby Value
31 return Data_Wrap_Struct(class, 0, rb_task_free, task);
34 //Get Computation Size
35 VALUE rb_task_comp(VALUE class, VALUE task)
39 // Wrap Ruby Value to m_task_t struct
40 Data_Get_Struct(task, s_m_task_t, tk);
41 size = MSG_task_get_compute_duration(tk);
42 return rb_float_new(size);
46 VALUE rb_task_name(VALUE class, VALUE task)
49 // Wrap Ruby Value to m_task_t struct
51 Data_Get_Struct(task, s_m_task_t, tk);
52 return rb_str_new2(MSG_task_get_name(tk));
56 VALUE rb_task_execute(VALUE class, VALUE task)
59 // Wrap Ruby Value to m_task_t struct
61 Data_Get_Struct(task, s_m_task_t, tk);
62 return INT2NUM(MSG_task_execute(tk));
66 void rb_task_send(VALUE class, VALUE task, VALUE mailbox)
71 // Wrap Ruby Value to m_task_t struct
73 Data_Get_Struct(task, s_m_task_t, tk);
74 data = MSG_task_get_data(tk);
75 data->ruby_task = (void *) task;
76 MSG_task_set_data(tk, (void *) data);
77 DEBUG1("Sending task %p", tk);
78 rv = MSG_task_send(tk, RSTRING_PTR(mailbox));
80 if (rv == MSG_TRANSFER_FAILURE)
81 rb_raise(rb_eRuntimeError, "Transfer failure while Sending");
82 else if (rv == MSG_HOST_FAILURE)
83 rb_raise(rb_eRuntimeError, "Host failure while Sending");
84 else if (rv == MSG_TIMEOUT)
85 rb_raise(rb_eRuntimeError, "Timeout failure while Sending");
87 rb_raise(rb_eRuntimeError, "MSG_task_send failed");
91 // Receiving Task (returns a Task)
92 VALUE rb_task_receive(VALUE class, VALUE mailbox)
94 // We must put the location where we copy the task
95 // pointer to on the heap, because the stack may move
96 // during the context switches (damn ruby internals)
97 m_task_t *ptask = malloc(sizeof(m_task_t));
100 rb_data_t data = NULL;
101 DEBUG2("Receiving a task on mailbox '%s', store it into %p",
102 RSTRING_PTR(mailbox), &task);
103 MSG_task_receive(ptask, RSTRING_PTR(mailbox));
106 data = MSG_task_get_data(task);
108 printf("Empty task while receving");
109 return (VALUE) data->ruby_task;
112 // It Return a Native Process ( m_process_t )
113 VALUE rb_task_sender(VALUE class, VALUE task)
116 Data_Get_Struct(task, s_m_task_t, tk);
118 return 0; //MSG_task_get_sender(tk);
122 VALUE rb_task_source(VALUE class, VALUE task)
125 Data_Get_Struct(task, s_m_task_t, tk);
127 m_host_t host = MSG_task_get_source(tk);
129 rb_raise(rb_eRuntimeError, "MSG_task_get_source() failed");
137 VALUE rb_task_listen(VALUE class, VALUE task, VALUE alias)
143 Data_Get_Struct(task, s_m_task_t, tk);
144 p_alias = RSTRING_PTR(alias);
146 rv = MSG_task_listen(p_alias);
155 VALUE rb_task_listen_host(VALUE class, VALUE task, VALUE alias, VALUE host)
163 Data_Get_Struct(task, s_m_task_t, tk);
164 Data_Get_Struct(host, s_m_host_t, ht);
165 p_alias = RSTRING_PTR(alias);
166 rv = MSG_task_listen_from_host(p_alias, ht);
174 void rb_task_set_priority(VALUE class, VALUE task, VALUE priority)
178 double prt = NUM2DBL(priority);
179 Data_Get_Struct(task, s_m_task_t, tk);
180 MSG_task_set_priority(tk, prt);
185 void rb_task_cancel(VALUE class, VALUE task)
188 Data_Get_Struct(task, s_m_task_t, tk);
193 void rb_task_set_data(VALUE class, VALUE task, VALUE data)
197 Data_Get_Struct(task, s_m_task_t, tk);
198 rb_data = MSG_task_get_data(tk);
199 rb_data->user_data = (void *) data;
200 MSG_task_set_data(tk, (void *) rb_data);
204 VALUE rb_task_get_data(VALUE class, VALUE task)
207 Data_Get_Struct(task, s_m_task_t, tk);
208 rb_data_t rb_data = MSG_task_get_data(tk);
209 if (!rb_data->user_data)
210 ERROR1("the task %s contain no user data", MSG_task_get_name(tk));
212 return (VALUE) rb_data->user_data;
215 VALUE rb_task_has_data(VALUE class, VALUE task)
218 Data_Get_Struct(task, s_m_task_t, tk);
219 rb_data_t rb_data = MSG_task_get_data(tk);
220 if (!rb_data->user_data)