#################################################
class Master < MsgProcess
- # msg_main : that function that will be executed when Running Simulation
- def msg_main(args) # args is an array containing arguments for function master
- info("Hello From Master")
- size = args.size
- info ("Number of Args for Master = " + size.to_s)
+ # main : that function that will be executed when Running Simulation
+ def main(args) # args is an array containing arguments for function master
+ size = args.size
for i in 0..size-1
- info("args["+String(i)+"]="+args[i])
+ info("args["+String(i)+"]="+args[i])
end
-
+
raise "Master needs 3 arguments" if size < 3
numberOfTask = Integer(args[0])
taskComputeSize = Float(args[1])
taskCommunicationSize = Float(args[2])
slaveCount = Integer(args[3])
- #Creating & Sending Task
+ # Creates and sends the tasks
for i in 0..numberOfTask-1
-
-
- task = Task.new("Task_"+ i.to_s, taskComputeSize , taskCommunicationSize );
- s_alias = "slave>>" + (i%slaveCount).to_s
- info("Master Sending "+ Task.name(task) + " to " + s_alias + " with Comput Size " + Task.compSize(task).to_s)
- Task.send(task,s_alias)
- info("Master Done Sending " +Task.name(task) + " to " + s_alias)
-# sameTask = Task.receive(s_alias)
-# puts "Master Receiving its Own Task"
+ task = Task.new("Task_"+ i.to_s, taskComputeSize , taskCommunicationSize);
+ mailbox = "slave " + (i%slaveCount).to_s
+ info("Master Sending "+ Task.name(task) + " to " + mailbox + " with Comput Size " +
+ Task.compSize(task).to_s)
+# task.compSize.to_s) # FIXME: This version creates a deadlock. Interesting
+ Task.send(task,mailbox)
+ info("Master Done Sending " +Task.name(task) + " to " + mailbox)
end
# Sending Finalize Tasks
info ("Master: All tasks have been dispatched. Let's tell everybody the computation is over.")
for i in 0..slaveCount-1
- s_alias = "slave " + i.to_s
- info ("Master Sending Finalize to " + s_alias)
- Task.send(Task.new("finalize",0,0),s_alias)
+ mailbox = "slave " + i.to_s
+ info ("Master Sending Finalize to " + mailbox)
+ Task.send(Task.new("finalize",0,0),mailbox)
end
info("Master : Everything's Done")
end
# Class Slave
#################################################
class Slave < MsgProcess
- # msg_main : that function that will be executed when Running Simulation
- def msg_main(args)
- info("Hello From Slave")
- s_mailbox = "slave>>" + args[0]
+ def main(args)
+ mailbox = "slave " + args[0]
while true
-
info("Ready to Receive Task")
- task = Task.receive(s_mailbox)
+ task = Task.receive(mailbox)
task_name = Task.name(task)
info ("Task Received : " + task.name)
- if (task_name == "finalize")
- info("Slave" + s_mailbox + "got finalize msg")
- break
- end
- info("Slave " + s_mailbox + " ...Processing" + Task.name(task))
+ if (task_name == "finalize")
+ info("Slave" + s_mailbox + "got finalize msg")
+ break
+ end
+ info("Slave " + s_mailbox + " ...Processing" + Task.name(task))
Task.execute(task)
end
info("Slave " + s_mailbox + "I'm Done , See You !!")
- end
-
- end
+ end
+end
#################################################
else
MSG.createEnvironment("platform.xml")
MSG.deployApplication("deploy.xml")
- Thread.list.each {|t| p t}
+ #Thread.list.each {|t| p t}
end
# Thread.list.each {|t| p t}
+++ /dev/null
-/*
- * 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 "rb_msg.h"
-#include "msg/msg.h"
-#include "msg/datatypes.h"
-#include "xbt/sysdep.h"
-#include "xbt/log.h"
-#include "xbt/asserts.h"
-#include "surf/surfxml_parse.h"
-#include "rb_msg_task.c"
-#include "rb_msg_host.c"
-#include "rb_msg_process.c"
-#include "rb_application_handler.c"
-
-#define MY_DEBUG
-//Init Msg_Init From Ruby
-static void msg_init(VALUE Class,VALUE args)
-{
- char **argv=NULL;
- const char *tmp;
- int argc,type,i;
- VALUE *ptr ;
- // Testing The Args Type
- type = TYPE(args);
- if (type != T_ARRAY )
- {
- rb_raise(rb_eRuntimeError,"Argh!!! Bad Arguments to msg_init");
- return;
- }
- ptr= RARRAY(args)->ptr;
- argc= RARRAY(args)->len;
-// Create C Array to Hold Data_Get_Struct
- argc++;
- argv = xbt_new0(char *, argc);
- argv[0] = strdup("ruby");
- for (i=0;i<argc-1;i++)
- {
- VALUE value = ptr[i];
- type = TYPE(value);
-// if (type == T_STRING)
- tmp = RSTRING(value)->ptr;
- argv[i+1] = strdup(tmp);
- }
- // Calling C Msg_Init Method
- MSG_global_init(&argc,argv);
- MSG_set_channel_number(10); // Okey !! Okey !! This Must Be Fixed Dynamiclly , But Later ;)
- SIMIX_context_select_factory("ruby");
-
- // Free Stuffs
- for (i=0;i<argc;i++)
- free(argv[i]) ;
-
- free (argv);
- #ifdef MY_DEBUG
- INFO0("Msg Init...Done");
- #endif
- return;
-}
-
-//Init Msg_Run From Ruby
-static void msg_run(VALUE class)
-{
-
- #ifdef MY_DEBUG
- INFO0("Start Running...");
- #endif
- xbt_fifo_item_t item = NULL;
- m_host_t host = NULL;
- VALUE rbHost;
- // Let's Run
- //printf("msg_run3\n");
- if (MSG_OK != MSG_main()){
- rb_raise(rb_eRuntimeError,"MSG_main() failed");
- }
-
- DEBUG
- ("MSG_main finished. Bail out before cleanup since there is a bug in this part.");
- /* Cleanup Ruby hosts */
- DEBUG("Clean Ruby World");
- xbt_fifo_foreach(msg_global->host, item, host, m_host_t) {
- //rbHost = (VALUE)host->data;// ??!!
- }
- #ifdef MY_DEBUG
- INFO0("Start Cleaning...");
- #endif
-
- if (MSG_OK != MSG_clean()){
- rb_raise(rb_eRuntimeError,"MSG_clean() failed");
- }
- return;
-}
-
-//Create Environment
-static void msg_createEnvironment(VALUE class,VALUE plateformFile)
-{
-
- int type = TYPE(plateformFile);
- if ( type != T_STRING )
- rb_raise(rb_eRuntimeError,"Bad Argument's Type");
- const char * platform = RSTRING(plateformFile)->ptr;
- MSG_create_environment(platform);
- printf("Create Environment...Done\n");
-
- return;
-}
-
-//deploy Application
-static void msg_deployApplication(VALUE class,VALUE deploymentFile )
-{
-
- int type = TYPE(deploymentFile);
- if ( type != T_STRING )
- rb_raise(rb_eRuntimeError,"Bad Argument's Type for deployApplication ");
- const char *dep_file = RSTRING(deploymentFile)->ptr;
- surf_parse_reset_parser();
- surfxml_add_callback(STag_surfxml_process_cb_list,
- application_handler_on_begin_process);
-
- surfxml_add_callback(ETag_surfxml_argument_cb_list,
- application_handler_on_process_arg);
-
- surfxml_add_callback(STag_surfxml_prop_cb_list,
- application_handler_on_property);
-
- surfxml_add_callback(ETag_surfxml_process_cb_list,
- application_handler_on_end_process);
-
- surf_parse_open(dep_file);
- application_handler_on_start_document();
- if(surf_parse())
- rb_raise(rb_eRuntimeError,"surf_parse() failed");
- surf_parse_close();
- application_handler_on_end_document();
- #ifdef MY_DEBUG
- INFO0("Deploy Application...Done");
- #endif
-}
-
-// INFO
-static void msg_info(VALUE class,VALUE msg)
-{
- const char *s = RSTRING(msg)->ptr;
- INFO1("%s",s);
-}
-
-// Get Clock
-static void msg_get_clock(VALUE class)
-{
-
- printf("Simulation time %f\n",MSG_get_clock());
-
-}
-
-//pajeOutput
-static void msg_paje_out(VALUE class,VALUE pajeFile)
-{
- const char *pfile = RSTRING(pajeFile)->ptr;
- MSG_paje_output(pfile);
-
-}
-
-// Ruby intropspection : Instanciate a ruby Class From its Name
-// Used by ProcessFactory::createProcess
-
-static VALUE msg_new_ruby_instance(VALUE class,VALUE className)
-{
- ruby_init();
- ruby_init_loadpath();
- char * p_className = RSTRING(className)->ptr;
-
- return rb_funcall3(rb_const_get(rb_cObject, rb_intern(p_className)),rb_intern("new"),0, 0);
-
-}
-
-//This Time With Args
-static VALUE msg_new_ruby_instance_with_args(VALUE class,VALUE className,VALUE args)
-{
- ruby_init();
- ruby_init_loadpath();
- char * p_className = RSTRING(className)->ptr;
- return rb_funcall(rb_const_get(rb_cObject, rb_intern(p_className)),rb_intern("new"), 1, args);
-}
-/*****************************************************************************************************************
-
-Wrapping MSG module and its Class ( Task,Host) & Methods ( Process's method...ect)
-To Ruby
-
-the part after "Init_" is the name of the C extension specified in extconf.rb , not the name of C source file
-
-*****************************************************************************************************************/
-void Init_msg()
-{
- // Modules
- rb_msg = rb_define_module("MSG");
- //Associated Environment Methods!
- rb_define_method(rb_msg,"init",msg_init,1);
- rb_define_method(rb_msg,"run",msg_run,0);
- rb_define_method(rb_msg,"createEnvironment",msg_createEnvironment,1);
- rb_define_method(rb_msg,"deployApplication",msg_deployApplication,1);
- rb_define_method(rb_msg,"info",msg_info,1);
- rb_define_method(rb_msg,"getClock",msg_get_clock,0);
- rb_define_method(rb_msg,"pajeOutput",msg_paje_out,1);
- rb_define_method(rb_msg,"rubyNewInstance",msg_new_ruby_instance,1);
- rb_define_method(rb_msg,"rubyNewInstanceArgs",msg_new_ruby_instance_with_args,2);
-
- // Associated Process Methods
- rb_define_method(rb_msg,"processCreate",processCreate,2);
- rb_define_method(rb_msg,"processSuspend",processSuspend,1);
- rb_define_method(rb_msg,"processResume",processResume,1);
- rb_define_method(rb_msg,"processIsSuspend",processIsSuspend,1);
- rb_define_method(rb_msg,"processKill",processKill,1);
- rb_define_method(rb_msg,"processGetHost",processGetHost,1);
- rb_define_method(rb_msg,"processExit",processExit,1);
-
- //Classes
- rb_task = rb_define_class_under(rb_msg,"Task",rb_cObject);
- rb_host = rb_define_class_under(rb_msg,"Host",rb_cObject);
-
- //Task Methods
- rb_define_module_function(rb_task,"new",task_new,3);
- rb_define_module_function(rb_task,"compSize",task_comp,1);
- rb_define_module_function(rb_task,"name",task_name,1);
- rb_define_module_function(rb_task,"execute",task_execute,1);
- rb_define_module_function(rb_task,"send",task_send,2);
- rb_define_module_function(rb_task,"receive",task_receive,1);
- rb_define_module_function(rb_task,"receive2",task_receive2,2);
- rb_define_module_function(rb_task,"sender",task_sender,1);
- rb_define_module_function(rb_task,"source",task_source,1);
- rb_define_module_function(rb_task,"listen",task_listen,2);
- rb_define_module_function(rb_task,"listenFromHost",task_listen_host,3);
- rb_define_module_function(rb_task,"put",task_put,2);
- rb_define_module_function(rb_task,"get",task_get,0);
-
- //Host Methods
- rb_define_module_function(rb_host,"getByName",host_get_by_name,1);
- rb_define_module_function(rb_host,"name",host_name,1);
- rb_define_module_function(rb_host,"speed",host_speed,1);
- rb_define_module_function(rb_host,"number",host_number,0);
- rb_define_module_function(rb_host,"setData",host_set_data,2);
- rb_define_module_function(rb_host,"getData",host_get_data,1);
- //rb_define_module_function(rb_host,"hasData",host_has_data,1);
- rb_define_module_function(rb_host,"isAvail",host_is_avail,1);
-
-}
// processCreate
+// FIXME: don't mess with MSG internals here, use MSG_process_create_with_arguments()
void rb_process_create(VALUE class,VALUE ruby_process,VALUE host) {
- VALUE rbName; // Name of Java Process instance
+ VALUE rbName; // Name of ruby Process instance
m_process_t process; // Native Process to Create
const char * name ; // Name of C Native Process
- char alias[MAX_ALIAS_NAME + 1 ] = {0};
- msg_mailbox_t mailbox;
rbName = rb_process_getName(ruby_process);
- if(!rbName) {
- rb_raise(rb_eRuntimeError,"Internal error : Process Name Cannot be NULL");
- return;
- }
+ if(!rbName)
+ rb_raise(rb_eRuntimeError,"Internal error: Process name cannot be NULL");
+
// Allocate the data for the simulation
process = xbt_new0(s_m_process_t,1);
process->simdata = xbt_new0(s_simdata_process_t,1);
process->name = xbt_strdup(name);
Data_Get_Struct(host,s_m_host_t,process->simdata->m_host);
- if(!(process->simdata->m_host)) // Not Binded
- {
+ 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");
- return;
+ rb_raise(rb_eRuntimeError,"Host not bound while creating native process");
}
process->simdata->PID = msg_global->PID++; // msg_global ??
process->simdata->m_host->simdata->smx_host->name,
1,argv,NULL);
- DEBUG1("context created (s_process=%p)",process->simdata->s_process);
+ 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
- {
+ } 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);
- sprintf(alias,"%s:%s",(process->simdata->m_host->simdata->smx_host)->name,
- process->name);
-
- mailbox = MSG_mailbox_new(alias);
-
}