X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ed95f6aa5479b9dab84fd9e2e303fdc63a9089af..63ea61dcf159b166cad6f257cb92912971491470:/src/bindings/ruby/rb_application_handler.c diff --git a/src/bindings/ruby/rb_application_handler.c b/src/bindings/ruby/rb_application_handler.c index 1514d9de4d..5b056e5487 100644 --- a/src/bindings/ruby/rb_application_handler.c +++ b/src/bindings/ruby/rb_application_handler.c @@ -1,40 +1,112 @@ -/* - * Copyright 2010. The SimGrid Team. All right reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the license (GNU LGPL) which comes with this package. - */ +/* Copyright (c) 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + #include "bindings/ruby_bindings.h" #include "surf/surfxml_parse.h" -static VALUE application_handler_class; // The Current Instance of ApplicationHandler Class +XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(ruby); -void rb_application_handler_on_start_document(void) { - application_handler_class = rb_funcall3(rb_const_get(rb_cObject, rb_intern("ApplicationHandler")), rb_intern("new"), 0, 0); +// Used to instanciate the Process +static VALUE args; +static VALUE prop; +static VALUE function_name; +static VALUE host_name; + +static VALUE rb_process_instance(VALUE fct_name, VALUE arguments, + VALUE properties) +{ + ruby_init(); + ruby_init_loadpath(); + char *p_className = RSTRING_PTR(fct_name); // name of process is the one of the class + return rb_funcall(rb_const_get(rb_cObject, rb_intern(p_className)), + rb_intern("new"), 3, fct_name, arguments, properties); } -void rb_application_handler_on_end_document(void) { - application_handler_class = Qnil; +// FIXME: don't mess with MSG internals here, use MSG_process_create_with_arguments() +static void rb_process_create_with_args(VALUE fct_name, VALUE arguments, + VALUE properties, VALUE ht_name) +{ + + VALUE ruby_process = + rb_process_instance(fct_name, arguments, properties); + m_process_t process = NULL; // Native Process to Create + const char *name; // Name of C Native Processs + + + if (!fct_name) + rb_raise(rb_eRuntimeError, + "Internal error: Process name cannot be NULL"); + name = RSTRING_PTR(fct_name); + DEBUG1("Create native process %s", name); + + char **argv = xbt_new(char *, 2); + argv[0] = bprintf("%s@%s", name, RSTRING_PTR(ht_name)); + argv[1] = NULL; + + // Allocate the data for the simulation + process = MSG_process_create_with_arguments(name, + (xbt_main_func_t) ruby_process, + process, + MSG_get_host_by_name(RSTRING_PTR(ht_name)), + 1, argv); + + // Bind The Ruby Process instance to The Native Process + rb_process_bind(ruby_process, process); } -void rb_application_handler_on_begin_process(void) { - VALUE hostName = rb_str_new2(A_surfxml_process_host); - VALUE function = rb_str_new2(A_surfxml_process_function); - rb_funcall(application_handler_class,rb_intern("onBeginProcess"),2,hostName,function); + +void rb_application_handler_on_start_document(void) +{ + + + args = rb_ary_new(); // Max length = 16 !! + prop = rb_ary_new(); + } -void rb_application_handler_on_process_arg(void) { +void rb_application_handler_on_end_document(void) +{ + + args = Qnil; + prop = Qnil; + function_name = Qnil; + host_name = Qnil; +} + +void rb_application_handler_on_begin_process(void) +{ + + host_name = rb_str_new2(A_surfxml_process_host); + function_name = rb_str_new2(A_surfxml_process_function); + + args = rb_ary_new(); // Max length = 16 ?! + prop = rb_ary_new(); + +} + +void rb_application_handler_on_process_arg(void) +{ + VALUE arg = rb_str_new2(A_surfxml_argument_value); - rb_funcall(application_handler_class,rb_intern("onProcessArg"),1,arg); + rb_ary_push(args, arg); } -void rb_application_handler_on_property(void) { +void rb_application_handler_on_property(void) +{ + VALUE id = rb_str_new2(A_surfxml_prop_id); - VALUE val = rb_str_new2(A_surfxml_prop_value); - rb_funcall(application_handler_class,rb_intern("onProperty"),2,id,val); + VALUE val = rb_str_new2(A_surfxml_prop_value); + int i_id = NUM2INT(id); + rb_ary_store(prop, i_id, val); + } +void rb_application_handler_on_end_process(void) +{ + + rb_process_create_with_args(function_name, args, prop, host_name); -void rb_application_handler_on_end_process(void) { - rb_funcall(application_handler_class,rb_intern("onEndProcess"),0); }