3 /* context_Ruby - implementation of context switching with ruby coroutines */
5 /* Copyright (c) 2010, the SimGrid team. All right reserved */
7 /* This program is free software; you can redistribute it and/or modify it
8 * under the terms of the license (GNU LGPL) which comes with this package. */
11 #include "xbt/function_types.h"
12 #include "xbt/sysdep.h"
14 #include "xbt/asserts.h"
16 #include "bindings/ruby_bindings.h"
19 smx_ctx_ruby_create_context(xbt_main_func_t code,int argc,char** argv,
20 void_f_pvoid_t cleanup_func,void *cleanup_arg);
22 static int smx_ctx_ruby_factory_finalize(smx_context_factory_t *factory);
24 static void smx_ctx_ruby_free(smx_context_t context);
26 static void smx_ctx_ruby_start(smx_context_t context);
28 static void smx_ctx_ruby_stop(smx_context_t context);
30 static void smx_ctx_ruby_suspend(smx_context_t context);
33 smx_ctx_ruby_resume(smx_context_t old_context,smx_context_t new_context);
35 static void smx_ctx_ruby_wrapper(void);
39 void SIMIX_ctx_ruby_factory_init(smx_context_factory_t *factory)
42 *factory = xbt_new0(s_smx_context_factory_t,1);
44 (*factory)->create_context = smx_ctx_ruby_create_context;
45 (*factory)->finalize = smx_ctx_ruby_factory_finalize;
46 (*factory)->free = smx_ctx_ruby_free;
47 (*factory)->start = smx_ctx_ruby_start;
48 (*factory)->stop = smx_ctx_ruby_stop;
49 (*factory)->suspend = smx_ctx_ruby_suspend;
50 (*factory)->resume = smx_ctx_ruby_resume;
51 (*factory)->name = "smx_ruby_context_factory";
55 printf("SIMIX_ctx_ruby_factory_init...Done\n");
59 static int smx_ctx_ruby_factory_finalize(smx_context_factory_t *factory)
69 smx_ctx_ruby_create_context(xbt_main_func_t code,int argc,char** argv,
70 void_f_pvoid_t cleanup_func,void* cleanup_arg)
73 smx_ctx_ruby_t context = xbt_new0(s_smx_ctx_ruby_t,1);
75 /*if the user provided a function for the process , then use it
76 Otherwise it's the context for maestro */
79 context->cleanup_func = cleanup_func;
80 context->cleanup_arg = cleanup_arg;
81 context->process = (VALUE)code;
84 printf("smx_ctx_ruby_create_context...Done\n");
88 return (smx_context_t) context;
92 static void smx_ctx_ruby_free(smx_context_t context)
97 smx_ctx_ruby_t ctx_ruby = (smx_ctx_ruby_t) context;
99 if (ctx_ruby->process){
100 // if the Ruby Process is Alive , Join it
101 // if ( process_isAlive(ctx_ruby->process))
103 process = ctx_ruby->process;
104 ctx_ruby->process = Qnil;
105 process_join(process);
115 printf("smx_ctx_ruby_free_context...Done\n");
120 static void smx_ctx_ruby_start(smx_context_t context)
123 /* Already Done .. Since a Ruby Process is launched within initialization
124 We Start it Within the Initializer ... We Use the Semaphore To Keep
125 The Thread Alive Waitin' For Mutex Signal to Execute The Main*/
129 static void smx_ctx_ruby_stop(smx_context_t context)
133 VALUE process = Qnil;
134 smx_ctx_ruby_t ctx_ruby,current;
136 if ( context->cleanup_func)
137 (*(context->cleanup_func)) (context->cleanup_arg);
139 ctx_ruby = (smx_ctx_ruby_t) context;
141 // Well , Let's Do The Same as JNI Stoppin' Process
142 if ( simix_global->current_process->iwannadie )
144 if( ctx_ruby->process )
146 //if the Ruby Process still Alive ,let's Schedule it
147 if ( rb_process_isAlive( ctx_ruby->process ) )
149 current = (smx_ctx_ruby_t)simix_global->current_process->context;
150 rb_process_schedule(current->process);
151 process = ctx_ruby->process;
152 // interupt/kill The Ruby Process
153 rb_process_kill_up(process);
158 process = ctx_ruby->process;
159 ctx_ruby->process = Qnil;
163 printf("smx_ctx_ruby_stop...Done\n");
167 static void smx_ctx_ruby_suspend(smx_context_t context)
172 smx_ctx_ruby_t ctx_ruby = (smx_ctx_ruby_t) context;
173 if (ctx_ruby->process)
174 rb_process_unschedule( ctx_ruby->process ) ;
176 printf("smx_ctx_ruby_unschedule...Done\n");
181 rb_raise(rb_eRuntimeError,"smx_ctx_ruby_suspend failed");
185 static void smx_ctx_ruby_resume(smx_context_t old_context,smx_context_t new_context)
188 smx_ctx_ruby_t ctx_ruby = (smx_ctx_ruby_t) new_context;
189 rb_process_schedule(ctx_ruby->process);
192 printf("smx_ctx_ruby_schedule...Done\n");