Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
require 'simgrid_ruby'
[simgrid.git] / src / bindings / ruby / simgrid.rb
index 5c96cdb..09bb9ce 100644 (file)
@@ -1,11 +1,16 @@
+#  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 
-###########################################################################
+#######################################
+#  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 
 #########################