X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/afea2e3d16f6311659578efe73fee155a0afb53a..de7d161240f434a809ae7739fbb15a1db6ab86f2:/src/bindings/ruby/simgrid.rb diff --git a/src/bindings/ruby/simgrid.rb b/src/bindings/ruby/simgrid.rb index 5c96cdbf70..32fbbe2814 100644 --- a/src/bindings/ruby/simgrid.rb +++ b/src/bindings/ruby/simgrid.rb @@ -1,11 +1,16 @@ -require 'simgrid_ruby' +# Task-related bindings to ruby */ +# +# 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. */ +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +require 'libsimgrid.so' require 'thread' -$DEBUG = false # This is a Global Variable Useful for MSG::debugging - -########################################################################### -# Class Semaphore -########################################################################### +####################################### +# Semaphore +####################################### class Semaphore def initialize(initvalue = 0) @@ -14,11 +19,13 @@ class Semaphore end def acquire - MSG::debug("Acquire "+self.to_s) Thread.critical = true if (@counter -= 1) < 0 + MSG::debug(Thread.current.to_s+" acquires "+self.to_s+". That's blocking.") @waiting_list.push(Thread.current) Thread.stop + else + MSG::debug(Thread.current.to_s+" acquires "+self.to_s+". It was free.") end self ensure @@ -26,15 +33,14 @@ class Semaphore end def release - MSG::debug("Release "+self.to_s) Thread.critical = true begin if (@counter += 1) <= 0 t = @waiting_list.shift t.wakeup if t - MSG::debug("Wakeup "+t.to_s) + MSG::debug(Thread.current.to_s+" releases "+self.to_s+". Wakeup "+t.to_s) else - MSG::debug("Nobody to wakeup") + MSG::debug(Thread.current.to_s+" releases "+self.to_s+". Nobody to wakeup") end rescue ThreadError retry @@ -52,55 +58,43 @@ class MSG::Process < Thread @@nextProcessId = 0 # Attributes - attr_reader :bind, :id ,:name # Read only - attr_accessor :properties, :pargs # R/W + attr_reader :name, :pargs ,:properties # Read only - def initialize(*args) super(){ - raise "Bad Number Of arguments to create a a Ruby Process (name,args,prop) " if args.size < 3 + raise "Bad number of arguments to create a Ruby process. Expected (name,args,prop) " if args.size < 3 @schedBegin = Semaphore.new(0) @schedEnd = Semaphore.new(0) - #@properties = Hash.new() @id = @@nextProcessId - @@nextProcessId += 1 + @@nextProcessId +=1 @name = args[0] @pargs = args[1] @properties = args[2] - - start() - + start() } - end - - # main def main(args) # To be overriden by childs raise("You must define a main() function in your process, containing the code of this process") end - # Start : To keep the process alive and waiting via semaphore def start() @schedBegin.acquire - # execute the main code of the process - MSG::debug("Begin execution") + MSG::debug("Let's execute the main() of the Ruby process") main(@pargs) - processExit(self) # Exit the Native Process @schedEnd.release + MSG::debug("Released my schedEnd, bailing out") + processExit(self) # Exit the Native Process + end - - - #Get Bind ( Used > Native to Ruby) def getBind() return @bind end - - #Get Binds (Used > Ruby to Native) + def setBind(bind) @bind = bind end @@ -110,37 +104,143 @@ class MSG::Process < Thread @schedBegin.acquire end - def schedule() + def schedule() @schedBegin.release @schedEnd.acquire end - #C Simualator Process Equivalent Management - # After Binding Ruby Process to C Process - -# pause def pause() processSuspend(self) end -# restart def restart() processResume(self) end -# isSuspended def isSuspended() processIsSuspended(self) end -# getHost def getHost() processGetHost(self) end - -# The Rest of Methods !!! To be Continued ... + end +############################################ +# Task Extend from the native Class RbTask +############################################ +class MSG::Task < MSG::RbTask + + def initialize(*args) + #Nothing todo + end + + def join(value) + super(self,value) + end + + def data() + super(self) + end + + def name + super(self) + end + + def compSize + super(self) + end + + def send(mailbox) + super(self,mailbox) + end + + def receive(mailbox) + super(self) + end + + def source + super(self) + end + + def sender + super(self) + end + + def listen(t_alias) + super(self) + end + + def execute + super(self) + end + + def listenFromHost(t_alias,host) + super(self) + end + + def setPriority(priority) + super(self,priority) + end + + def cancel + super(self) + end + + def hasData + super(self) + end + +end +#################################################### +# Host Extend from the native Class RbHost +#################################################### +class MSG::Host < MSG::RbHost + + attr_reader :data + def initialize(*ars) + @data = 1 + p "Host Initializer" + end + + def data() + return @data + end + + def setData(value) + @data = value + end + + def getByName(name) + super(name) + end + + def name + super(self) + end + + def speed + super(self) + end + + def getData + super(self) + end + + def isAvail + super(self) + end + + def number + super() + end + + def getHostProcess(process) + super(process) + end + +end ######################### # Main chunck #########################