-# FIXME: add license like in C files
-
+# 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 'simgrid_ruby'
require 'thread'
-$DEBUG = false # This is a Global Variable Useful for MSG::debugging
-
-###########################################################################
+##########################################################
# Class Semaphore
-###########################################################################
+##########################################################
+class MySemaphore
+ Thread.abort_on_exception = true
+ attr_accessor :permits
+
+ def initialize (permits = 0)
+ @permits = permits
+ end
+
+ def acquire(mutex,cv)
+
+ raise "Interrupted Thread " if (!Thread.current.alive?)
+ mutex.synchronize {
+ while @permits <= 0
+
+ cv.wait(mutex)
+
+ end
+ @permits = @permits - 1
+ cv.signal
+ }
+
+ end
+
+ def release(mutex,cv)
+ mutex.synchronize{
+ @permits += 1
+ cv.signal
+ }
+ end
+end
+#######################################
+# Another Semaphore
+#######################################
class Semaphore
def initialize(initvalue = 0)
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
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
@@nextProcessId = 0
# Attributes
- attr_reader :bind, :id, :name, :pargs # Read only
- attr_accessor :properties # R/W
+ attr_reader :name, :pargs ,:properties, :cv, :mutex # 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() FIXME: get this from the C (yep that makes 4 args to this function)
- @id = @@nextProcessId++
+ @cv = ConditionVariable.new
+ @mutex = Mutex.new
+ @schedBegin = MySemaphore.new(0)
+ @schedEnd = MySemaphore.new(0)
+ @id = @@nextProcessId
+ @@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")
+ @schedBegin.acquire(@mutex,@cv)
+
+ MSG::debug("Let's execute the main() of the Ruby process")
main(@pargs)
+<<<<<<< .mine
+# processExit(self) # FIXME : Fix the simix_context_ruby_stop to stop context process before quitting
+ @schedEnd.release(@mutex,@cv)
+
+=======
+ @schedEnd.release()
+>>>>>>> .r7205
+ MSG::debug("Released my schedEnd, bailing out")
processExit(self) # Exit the Native Process
- @schedEnd.release
end
-
-
- # Get Bind
def getBind()
return @bind
end
-
- # Set Binds
+
def setBind(bind)
@bind = bind
end
def unschedule()
- @schedEnd.release
- @schedBegin.acquire
+ @schedEnd.release(@mutex,@cv)
+ @schedBegin.acquire(@mutex,@cv)
end
- def schedule()
- @schedBegin.release
- @schedEnd.acquire
+ def schedule()
+ @schedBegin.release(@mutex,@cv)
+ @schedEnd.acquire(@mutex,@cv)
end
def pause()
# The Rest of Methods !!! To be Continued ... FIXME: what's missing?
end
+############################################
+# Task Extend from the native Class RbTask
+############################################
+class MSG::Task < MSG::RbTask
+
+ def initialize(*args)
+ super()
+ end
+
+ def name
+ super(self)
+ end
+
+ def compSize
+ super(self)
+ end
+
+ def send(mailbox)
+ super(self,mailbox)
+ end
+
+
+ def source
+ super(self)
+ end
+
+ def sender
+ super(self)
+ end
+
+ def listen(t_alias)
+ super(t_alias)
+ end
+
+ def execute
+ super(self)
+ end
+
+ def listenFromHost(t_alias,host)
+ super(t_alias,host)
+ end
+end
+
+####################################################
+# Host Extend from the native Class RbHost
+####################################################
+class MSG::Host < MSG::RbHost
+
+ def getByName(name)
+ super(name)
+ end
+
+ def name
+ super(self)
+ end
+
+ def speed
+ super(self)
+ end
+
+ def getData
+ super(self)
+ end
+
+ def setData(data)
+ super(self,data)
+ end
+
+ def isAvail
+ super(self)
+ end
+
+ def number
+ super()
+ end
+end
+
#########################
# Main chunck
#########################