Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Cleanup log mess in ruby bindings, various cosmetics, restaure a FIXME which slept...
[simgrid.git] / src / bindings / ruby / rb_application_handler.c
index 8404a25..97f6b8e 100644 (file)
-#include "rb_application_handler.h"
+/*
+ * 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.
+ */
+#include "bindings/ruby_bindings.h"
 #include "surf/surfxml_parse.h"
-#include <stdio.h>
+#include "msg/private.h" /* s_simdata_process_t FIXME: don't mess with MSG internals that way */
 
-static void  r_init()
-{
-  
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(ruby);
+
+// 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();
-  rb_require("ApplicationHandler.rb");
-  
-} 
-
-static void  application_handler_on_start_document(void)
-{
-  
-   r_init();
-   //current One
-   current = rb_funcall3(rb_const_get(rb_cObject, rb_intern("ApplicationHandler")),  rb_intern("new"), 0, 0);
-   rb_funcall(current,rb_intern("onStartDocument"),0);
-  
-  
+  char * p_className = RSTRING(fct_name)->ptr; // 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);
 }
 
-static void  application_handler_on_end_document(void)
-{
+// 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) {
   
-  //r_init();
-  rb_funcall(current,rb_intern("onEndDocument"),0); 
+  VALUE ruby_process = rb_process_instance(fct_name,arguments,properties);
+  m_process_t process; // 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");
 
-static void application_handler_on_begin_process(void) 
-{
-  
-  //r_init();
-  
-  VALUE hostName = rb_str_new2(A_surfxml_process_host);
-  VALUE function = rb_str_new2(A_surfxml_process_function);
-  
-   rb_funcall(current,rb_intern("onBeginProcess"),2,hostName,function); 
-  
-  
+  // Allocate the data for the simulation
+  process = xbt_new0(s_m_process_t,1);
+  process->simdata = xbt_new0(s_simdata_process_t,1);
+  // Do we Really Need to Create Ruby Process Instance , >> process is already a Ruby Process !! So..Keep on ;)
+  // Bind The Ruby Process instance to The Native Process
+  rb_process_bind(ruby_process,process);
+  name = RSTRING(fct_name)->ptr;
+  process->name = xbt_strdup(name);
+  // Host
+  m_host_t host = MSG_get_host_by_name(RSTRING(ht_name)->ptr);
+  process->simdata->m_host = host;
+  
+  //Data_Get_Struct(host,s_m_host_t,process->simdata->m_host);
+
+  if(!(process->simdata->m_host)) { // Not Binded
+    free(process->simdata);
+    free(process->data);
+    free(process);
+    rb_raise(rb_eRuntimeError,"Host not bound while creating native process");
+  }
+  process->simdata->PID = msg_global->PID++; //  msg_global ??
+
+  DEBUG7("fill in process %s/%s (pid=%d) %p (sd=%p , host=%p, host->sd=%p)",
+      process->name , process->simdata->m_host->name,process->simdata->PID,
+      process,process->simdata, process->simdata->m_host,
+      process->simdata->m_host->simdata);
+
+
+  /* FIXME: that's mainly for debugging. We could only allocate this if XBT_LOG_ISENABLED(ruby,debug) is true since I guess this leaks */
+  char **argv=xbt_new(char*,2);
+  argv[0] = bprintf("%s@%s",process->name,process->simdata->m_host->simdata->smx_host->name);
+  argv[1] = NULL;
+  process->simdata->s_process =
+      SIMIX_process_create(process->name,
+          (xbt_main_func_t)ruby_process,
+          (void *) process,
+          process->simdata->m_host->simdata->smx_host->name,
+          1,argv,NULL);
+
+  DEBUG1("context created (s_process=%p)",process->simdata->s_process);
+
+  if (SIMIX_process_self()) { // SomeOne Created Me !!
+    process->simdata->PPID = MSG_process_get_PID(SIMIX_process_self()->data);
+  } else {
+    process->simdata->PPID = -1;
+  }
+  process->simdata->last_errno = MSG_OK;
+  // let's Add the Process to the list of the Simulation's Processes
+  xbt_fifo_unshift(msg_global->process_list,process);
 }
 
-static void  application_handler_on_process_arg(void)
-{
 
-  //r_init();
+
+
+void rb_application_handler_on_start_document(void) {
   
-   VALUE arg = rb_str_new2(A_surfxml_argument_value);
+   args = rb_ary_new();  // Max lenght = 16 ?!
+   prop = rb_ary_new();
+}
+
+void rb_application_handler_on_end_document(void) {
+  // FIXME: probably leaking
+  //application_handler_class = Qnil;
+  args = Qnil;
+  prop = Qnil;
+  function_name = Qnil;
+  host_name = Qnil;
   
-   rb_funcall(current,rb_intern("onProcessArg"),1,arg);
+}
+
+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);
   
 }
 
-static void  application_handler_on_property(void)
-{
-  //r_init();
-  
-   VALUE id = rb_str_new2(A_surfxml_prop_id);
-   VALUE val =  rb_str_new2(A_surfxml_prop_value);
+void rb_application_handler_on_process_arg(void) {
   
-   rb_funcall(current,rb_intern("onProperty"),2,id,val);
-   
-   
+  VALUE arg = rb_str_new2(A_surfxml_argument_value);
+  rb_ary_push(args,arg);
 }
 
+void rb_application_handler_on_property(void) {
+  // FIXME: properties are never added to the ruby process
+  VALUE id = rb_str_new2(A_surfxml_prop_id);
+  VALUE val =  rb_str_new2(A_surfxml_prop_value);
+  int i_id = NUM2INT (id);
+  rb_ary_store(prop,i_id,val);
 
-static void application_handler_on_end_process(void)
-{
-  
- //r_init();
- rb_funcall(current,rb_intern("onEndProcess"),0);
-  
-  
 }
+
+
+void rb_application_handler_on_end_process(void) {
+
+  rb_process_create_with_args(function_name,args,prop,host_name);
+    
+}
+
+