Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Massive cleanups in ruby. Not yet working (segfault on task reception)
[simgrid.git] / src / bindings / ruby / simgrid_ruby.c
1 /* SimGrid Ruby bindings                                                    */
2
3 /* Copyright (c) 2010, the SimGrid team. All right reserved.                */
4
5 /* This program is free software; you can redistribute it and/or modify it
6  * under the terms of the license (GNU LGPL) which comes with this package. */
7
8 #include "xbt.h"
9 #include "bindings/ruby_bindings.h"
10
11 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(ruby);
12
13 // MSG Module
14 VALUE rb_msg;
15 // MSG Classes
16 VALUE rb_task;
17 VALUE rb_host;
18
19
20 //Init Msg  From Ruby
21 static void msg_init(VALUE Class,VALUE args)
22 {
23   char **argv=NULL;
24   const char *tmp;
25   int argc,type,i;
26   VALUE *ptr ;
27   // Testing The Args Type
28   type =  TYPE(args);
29   if (type != T_ARRAY )
30   {
31     rb_raise(rb_eRuntimeError,"Argh!!! Bad Arguments to msg_init");
32     return;
33   }
34   ptr= RARRAY(args)->ptr;
35   argc= RARRAY(args)->len;
36   //  Create C Array to Hold Data_Get_Struct
37   argc++;
38   argv = xbt_new0(char *, argc);
39   argv[0] = strdup("ruby");
40   for (i=0;i<argc-1;i++)
41   {
42     VALUE value = ptr[i];
43     type = TYPE(value);
44     //  if (type == T_STRING)
45     tmp = RSTRING(value)->ptr;
46     argv[i+1] = strdup(tmp);
47   }
48   // Calling C Msg_Init Method
49   MSG_global_init(&argc,argv);
50   MSG_set_channel_number(10); // Okey !! Okey !! This Must Be Fixed Dynamiclly , But Later ;)
51   SIMIX_context_select_factory("ruby");
52
53   // Free Stuffs
54   for (i=0;i<argc;i++)
55     free(argv[i]) ;
56
57   free (argv);
58   DEBUG0("Msg Init...Done");
59   return;
60 }
61 //Init Msg_Run From Ruby
62 static void msg_run(VALUE class) {
63   DEBUG0("Start Running...");
64   m_host_t *hosts;
65   int cpt,host_count;
66   VALUE rbHost;
67   // Let's Run
68   //printf("msg_run3\n");
69   if (MSG_OK != MSG_main()){
70     rb_raise(rb_eRuntimeError,"MSG_main() failed");
71   }
72
73   DEBUG0
74   ("MSG_main finished. Bail out before cleanup since there is a bug in this part.");
75   /* Cleanup Ruby hosts */
76   DEBUG0("Clean Ruby World");
77   hosts = MSG_get_host_table();
78   host_count = MSG_get_host_number();
79   for (cpt=0;cpt<host_count;cpt++) {
80     rbHost = (VALUE)((hosts[cpt])->data);// ??!!
81   }
82
83   if (MSG_OK != MSG_clean()){
84     rb_raise(rb_eRuntimeError,"MSG_clean() failed");
85   }
86   return;
87 }
88
89 static void msg_createEnvironment(VALUE class,VALUE plateformFile) {
90
91   int type = TYPE(plateformFile);
92   if ( type != T_STRING )
93     rb_raise(rb_eRuntimeError,"Bad Argument's Type");
94   const char * platform =  RSTRING(plateformFile)->ptr;
95   MSG_create_environment(platform);
96   DEBUG1("Create Environment (%s)...Done",platform);
97 }
98
99 //deploy Application
100 static void msg_deployApplication(VALUE class,VALUE deploymentFile ) {
101
102   int type = TYPE(deploymentFile);
103   if ( type != T_STRING )
104     rb_raise(rb_eRuntimeError,"Bad Argument's Type for deployApplication ");
105   const char *dep_file = RSTRING(deploymentFile)->ptr;
106   surf_parse_reset_parser();
107   surfxml_add_callback(STag_surfxml_process_cb_list,
108       rb_application_handler_on_begin_process);
109
110   surfxml_add_callback(ETag_surfxml_argument_cb_list,
111       rb_application_handler_on_process_arg);
112
113   surfxml_add_callback(STag_surfxml_prop_cb_list,
114       rb_application_handler_on_property);
115
116   surfxml_add_callback(ETag_surfxml_process_cb_list,
117       rb_application_handler_on_end_process);
118
119   surf_parse_open(dep_file);
120   rb_application_handler_on_start_document();
121   if(surf_parse())
122     rb_raise(rb_eRuntimeError,"surf_parse() failed");
123   surf_parse_close();
124   rb_application_handler_on_end_document();
125
126   DEBUG1("Deploy Application(%s)...Done",dep_file);
127 }
128
129 // INFO
130 static void msg_info(VALUE class,VALUE msg) {
131   const char *s = RSTRING(msg)->ptr;
132   INFO1("%s",s);
133 }
134
135 // Get Clock
136 static void msg_get_clock(VALUE class) {
137
138   printf("Simulation time %f\n",MSG_get_clock());
139
140 }
141
142 // Ruby intropspection : Instanciate a ruby Class From its Name
143 // Used by ProcessFactory::createProcess
144
145 static VALUE msg_new_ruby_instance(VALUE class,VALUE className) {
146   ruby_init();
147   ruby_init_loadpath();
148   char * p_className = RSTRING(className)->ptr;
149
150   return rb_funcall3(rb_const_get(rb_cObject, rb_intern(p_className)),rb_intern("new"),0, 0);
151 }
152
153 //This Time With Args
154 static VALUE msg_new_ruby_instance_with_args(VALUE class,VALUE className,VALUE args) {
155   ruby_init();
156   ruby_init_loadpath();
157   char * p_className = RSTRING(className)->ptr;
158   return rb_funcall(rb_const_get(rb_cObject, rb_intern(p_className)),rb_intern("new"), 1, args);
159 }
160
161
162
163 typedef VALUE(*rb_meth)(ANYARGS);
164 void Init_simgrid_ruby() {
165   // Modules
166   rb_msg = rb_define_module("MSG");
167   //Associated Environment Methods!
168   rb_define_method(rb_msg,"init",(rb_meth)msg_init,1);
169   rb_define_method(rb_msg,"run",(rb_meth)msg_run,0);
170   rb_define_method(rb_msg,"createEnvironment",(rb_meth)msg_createEnvironment,1);
171   rb_define_method(rb_msg,"deployApplication",(rb_meth)msg_deployApplication,1);
172   rb_define_method(rb_msg,"info",(rb_meth)msg_info,1);
173   rb_define_method(rb_msg,"getClock",(rb_meth)msg_get_clock,0);
174   rb_define_method(rb_msg,"rubyNewInstance",(rb_meth)msg_new_ruby_instance,1);
175   rb_define_method(rb_msg,"rubyNewInstanceArgs",(rb_meth)msg_new_ruby_instance_with_args,2);
176
177   // Associated Process Methods
178   rb_define_method(rb_msg,"processCreate",(rb_meth)rb_process_create,2);
179   rb_define_method(rb_msg,"processSuspend",(rb_meth)rb_process_suspend,1);
180   rb_define_method(rb_msg,"processResume",(rb_meth)rb_process_resume,1);
181   rb_define_method(rb_msg,"processIsSuspend",(rb_meth)rb_process_isSuspended,1);
182   rb_define_method(rb_msg,"processKill",(rb_meth)rb_process_kill_up,1);
183   rb_define_method(rb_msg,"processGetHost",(rb_meth)rb_process_getHost,1);
184   rb_define_method(rb_msg,"processExit",(rb_meth)rb_process_exit,1);
185
186   //Classes
187   rb_task = rb_define_class_under(rb_msg,"Task",rb_cObject);
188   rb_host = rb_define_class_under(rb_msg,"Host",rb_cObject);
189
190   //Task Methods
191   rb_define_module_function(rb_task,"new",(rb_meth)rb_task_new,3);
192   rb_define_module_function(rb_task,"compSize",(rb_meth)rb_task_comp,1);
193   rb_define_module_function(rb_task,"name",(rb_meth)rb_task_name,1);
194   rb_define_module_function(rb_task,"execute",(rb_meth)rb_task_execute,1);
195   rb_define_module_function(rb_task,"send",(rb_meth)rb_task_send,2);
196   rb_define_module_function(rb_task,"receive",(rb_meth)rb_task_receive,1);
197   rb_define_module_function(rb_task,"sender",(rb_meth)rb_task_sender,1);
198   rb_define_module_function(rb_task,"source",(rb_meth)rb_task_source,1);
199   rb_define_module_function(rb_task,"listen",(rb_meth)rb_task_listen,2);
200   rb_define_module_function(rb_task,"listenFromHost",(rb_meth)rb_task_listen_host,3);
201
202   //Host Methods
203   rb_define_module_function(rb_host,"getByName",(rb_meth)rb_host_get_by_name,1);
204   rb_define_module_function(rb_host,"name",(rb_meth)rb_host_name,1);
205   rb_define_module_function(rb_host,"speed",(rb_meth)rb_host_speed,1);
206   rb_define_module_function(rb_host,"number",(rb_meth)rb_host_number,0);
207   rb_define_module_function(rb_host,"setData",(rb_meth)rb_host_set_data,2);
208   rb_define_module_function(rb_host,"getData",(rb_meth)rb_host_get_data,1);
209   //rb_define_module_function(rb_host,"hasData",host_has_data,1);
210   rb_define_module_function(rb_host,"isAvail",(rb_meth)rb_host_is_avail,1);
211
212 }