1 /* Copyright (c) 2010. The SimGrid Team.
2 * All rights reserved. */
4 /* This program is free software; you can redistribute it and/or modify it
5 * under the terms of the license (GNU LGPL) which comes with this package. */
7 #include "msg/private.h" /* s_simdata_process_t */
8 #include "bindings/ruby_bindings.h"
10 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(ruby, bindings, "Ruby Bindings");
13 * Functions for Ruby Process Management (Up Calls)
16 // get Ruby Process Name
17 VALUE rb_process_getName(VALUE ruby_process)
19 return rb_funcall(ruby_process, rb_intern("getName"), 0);
23 VALUE rb_process_getID(VALUE ruby_process)
25 return rb_funcall(ruby_process, rb_intern("getID"), 0);
29 VALUE rb_process_getBind(VALUE ruby_process)
31 return rb_funcall(ruby_process, rb_intern("getBind"), 0);
35 void rb_process_setBind(VALUE ruby_process, long bind)
37 VALUE r_bind = LONG2FIX(bind);
38 rb_funcall(ruby_process, rb_intern("setBind"), 1, r_bind);
42 VALUE rb_process_isAlive(VALUE ruby_process)
44 return rb_funcall(ruby_process, rb_intern("alive?"), 0);
48 void rb_process_kill_up(VALUE ruby_process)
50 rb_funcall(ruby_process, rb_intern("kill"), 0);
54 void rb_process_join(VALUE ruby_process)
56 rb_funcall(ruby_process, rb_intern("join"), 0);
59 // FIXME: all this calls must be manually inlined I guess
61 void rb_process_unschedule(VALUE ruby_process)
63 rb_funcall(ruby_process, rb_intern("unschedule"), 0);
67 void rb_process_schedule(VALUE ruby_process)
69 rb_funcall(ruby_process, rb_intern("schedule"), 0);
72 /***************************************************
73 Function for Native Process ( Bound ) Management
75 Methods Belong to MSG Module
76 ****************************************************/
79 m_process_t rb_process_to_native(VALUE ruby_process)
81 VALUE id = rb_process_getBind(ruby_process);
83 rb_raise(rb_eRuntimeError, "Process Not Bound >>> id_Bind Null");
86 long l_id = FIX2LONG(id);
87 return (m_process_t) l_id;
91 void rb_process_bind(VALUE ruby_process, m_process_t process)
93 long bind = (long) (process);
94 rb_process_setBind(ruby_process, bind);
99 void rb_process_suspend(VALUE class, VALUE ruby_process)
102 m_process_t process = rb_process_to_native(ruby_process);
105 rb_raise(rb_eRuntimeError,
106 "Process Not Bound...while suspending process");
109 // Trying to suspend The Process
111 if (MSG_OK != MSG_process_suspend(process))
112 rb_raise(rb_eRuntimeError, "MSG_process_suspend() failed");
115 void rb_process_resume(VALUE class, VALUE ruby_process)
117 m_process_t process = rb_process_to_native(ruby_process);
119 rb_raise(rb_eRuntimeError,
120 "Process not Bound...while resuming process");
123 // Trying to resume the process
124 if (MSG_OK != MSG_process_resume(process))
125 rb_raise(rb_eRuntimeError, "MSG_process_resume() failed");
128 VALUE rb_process_isSuspended(VALUE class, VALUE ruby_process)
130 m_process_t process = rb_process_to_native(ruby_process);
132 rb_raise(rb_eRuntimeError,
133 "Process not Bound...while testing if suspended");
136 if (MSG_process_is_suspended(process))
141 void rb_process_kill_down(VALUE class, VALUE ruby_process)
143 m_process_t process = rb_process_to_native(ruby_process);
146 rb_raise(rb_eRuntimeError,
147 "Process Not Bound...while killing process");
150 // Delete The Global Reference / Ruby Process
151 rb_process_kill_up(ruby_process);
152 // Delete the Native Process
153 MSG_process_kill(process);
156 VALUE rb_process_getHost(VALUE class, VALUE ruby_process)
158 m_process_t process = rb_process_to_native(ruby_process);
163 rb_raise(rb_eRuntimeError, "Process Not Bound...while getting Host");
167 host = MSG_process_get_host(process);
169 return Data_Wrap_Struct(class, 0, rb_host_free, host);
170 /*if(host->data) printf("Ok\n");
173 rb_raise (rb_eRuntimeError,"MSG_process_get_host() failed");
176 printf("Houuuuuuuuuuuuuuna3!!\n");
177 return Data_Wrap_Struct(class, 0, rb_host_free, host); */
180 void rb_process_exit(VALUE class, VALUE ruby_process)
182 m_process_t process = rb_process_to_native(ruby_process);
184 rb_raise(rb_eRuntimeError,
185 "Process Not Bound...while exiting process");
188 SIMIX_context_stop(SIMIX_process_self()->context);