4 * Copyright 2010 Martin Quinson, Mehdi Fekari
7 * This program is free software; you can redistribute
8 * it and/or modify it under the terms of the license
9 *(GNU LGPL) which comes with this package.
12 #include "rb_msg_process.h"
16 static void initRuby()
21 rb_require("RubyProcess.rb");
26 /***********************************************
28 Functions for Ruby Process Management ( Up Call)
32 ************************************************/
35 // get Ruby Process Name
36 static VALUE process_getName( VALUE ruby_process )
40 // instance = rb_funcall3(rb_const_get(rb_cObject, rb_intern("RbProcess")), rb_intern("new"), 0, 0);
41 return rb_funcall(ruby_process,rb_intern("getName"),0);
46 static VALUE process_getID(VALUE ruby_process)
50 return rb_funcall(ruby_process,rb_intern("getID"),0);
55 static VALUE process_getBind(VALUE ruby_process)
59 return rb_funcall(ruby_process,rb_intern("getBind"),0);
65 static void process_setBind(VALUE ruby_process,long bind)
69 VALUE r_bind = LONG2FIX(bind);
70 rb_funcall(ruby_process,rb_intern("setBind"),1,r_bind);
75 static VALUE process_isAlive(VALUE ruby_process)
79 return rb_funcall(ruby_process,rb_intern("alive?"),0);
84 static void process_kill(VALUE ruby_process)
88 rb_funcall(ruby_process,rb_intern("kill"),0);
93 static void process_join( VALUE ruby_process )
97 rb_funcall(ruby_process,rb_intern("join"),0);
101 // unschedule Process
102 static void process_unschedule( VALUE ruby_process )
106 rb_funcall(ruby_process,rb_intern("unschedule"),0);
111 static void process_schedule( VALUE ruby_process )
115 rb_funcall(ruby_process,rb_intern("schedule"),0);
119 /***************************************************
121 Function for Native Process ( Bound ) Management
123 Methods Belong to MSG Module
125 ****************************************************/
129 static m_process_t process_to_native(VALUE ruby_process)
132 VALUE id = process_getBind(ruby_process);
135 rb_raise(rb_eRuntimeError,"Process Not Bound >>> id_Bind Null");
138 long l_id= FIX2LONG(id);
139 return (m_process_t)l_id;
145 static void processBind(VALUE ruby_process,m_process_t process)
148 long bind = (long)(process);
149 process_setBind(ruby_process,bind);
156 static void processCreate(VALUE class,VALUE ruby_process,VALUE host)
159 VALUE rbName; // Name of Java Process instance
160 m_process_t process; // Native Process to Create
161 const char * name ; // Name of C Native Process
162 char alias[MAX_ALIAS_NAME + 1 ] = {0};
163 msg_mailbox_t mailbox;
164 rbName = process_getName(ruby_process);
168 rb_raise(rb_eRuntimeError,"Internal error : Process Name Cannot be NULL");
171 // Allocate the data for the simulation
172 process = xbt_new0(s_m_process_t,1);
173 process->simdata = xbt_new0(s_simdata_process_t,1);
174 // Do we Really Need to Create Ruby Process Instance , >> process is already a Ruby Process !! So..Keep on ;)
175 // Bind The Ruby Process instance to The Native Process
176 processBind(ruby_process,process);
177 name = RSTRING(rbName)->ptr;
178 process->name = xbt_strdup(name);
179 Data_Get_Struct(host,m_host_t,process->simdata->m_host);
181 if(!(process->simdata->m_host)) // Not Binded
183 free(process->simdata);
186 rb_raise(rb_eRuntimeError,"Host not bound...while creating native process");
189 process->simdata->PID = msg_global->PID++; // msg_global ??
191 ("fil in process %s/%s (pid=%d) %p (sd=%p, host=%p, host->sd=%p) ",
192 process->name ,process->simdata->m_host->name,process->simdata->PID,
193 process,process->simdata, process->simdata->m_host,
194 process->simdata->m_host->simdata);*/
197 printf("fill in process %s/%s (pid=%d) %p (sd%=%p , host=%p, host->sd=%p)\n",
198 process->name , process->simdata->m_host->name,process->simdata->PID,
199 process,process->simdata, process->simdata->m_host,
200 process->simdata->m_host->simdata);
202 process->simdata->s_process =
203 SIMIX_process_create(process->name,
204 (xbt_main_func_t)ruby_process,
206 process->simdata->m_host->simdata->smx_host->name,
209 //DEBUG ( "context created (s_process=%p)",process->simdata->s_process);
211 printf("context created (s_process=%p)\n",process->simdata->s_process);
213 if (SIMIX_process_self()) { // SomeOne Created Me !!
214 process->simdata->PPID = MSG_process_get_PID(SIMIX_process_self()->data);
218 process->simdata->PPID = -1;
220 process->simdata->last_errno = MSG_OK;
221 // let's Add the Process to the list of the Simulation's Processes
222 xbt_fifo_unshift(msg_global->process_list,process);
223 sprintf(alias,"%s:%s",(process->simdata->m_host->simdata->smx_host)->name,
226 mailbox = MSG_mailbox_new(alias);
231 // Process Management
233 static void processSuspend(VALUE class,VALUE ruby_process)
236 m_process_t process = process_to_native(ruby_process);
240 rb_raise(rb_eRuntimeError,"Process Not Bound...while suspending process");
244 // Trying to suspend The Process
246 if ( MSG_OK != MSG_process_suspend(process))
247 rb_raise(rb_eRuntimeError,"MSG_process_suspend() failed");
252 static void processResume(VALUE class,VALUE ruby_process)
254 m_process_t process = process_to_native(ruby_process);
257 rb_raise(rb_eRuntimeError,"Process not Bound...while resuming process");
260 // Trying to resume the process
261 if ( MSG_OK != MSG_process_resume(process))
262 rb_raise(rb_eRuntimeError,"MSG_process_resume() failed");
266 static VALUE processIsSuspend(VALUE class,VALUE ruby_process)
269 m_process_t process = process_to_native(ruby_process);
272 rb_raise (rb_eRuntimeError,"Process not Bound...while testing if suspended");
276 // 1 is The Process is Suspended , 0 Otherwise
277 if(MSG_process_is_suspended(process))
284 static void processKill(VALUE class,VALUE ruby_process)
286 m_process_t process = process_to_native(ruby_process);
290 rb_raise (rb_eRuntimeError,"Process Not Bound...while killing process");
293 // Delete The Global Reference / Ruby Process
294 process_kill(ruby_process);
295 // Delete the Native Process
296 MSG_process_kill(process);
300 static VALUE processGetHost(VALUE class,VALUE ruby_process)
303 m_process_t process = process_to_native(ruby_process);
308 rb_raise(rb_eRuntimeError,"Process Not Bound...while getting Host");
312 host = MSG_process_get_host(process);
316 rb_raise (rb_eRuntimeError,"MSG_process_get_host() failed");
320 return Data_Wrap_Struct(class, 0, host_free, host);
324 static void processExit(VALUE class,VALUE ruby_process)
327 m_process_t process = process_to_native(ruby_process);
330 rb_raise(rb_eRuntimeError,"Process Not Bound...while exiting process");
333 SIMIX_context_stop(SIMIX_process_self()->context);