Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
better synchronization , cleanin' up ruby process ,it works
[simgrid.git] / src / bindings / ruby / simgrid.rb
index c82542a..30dc1df 100644 (file)
@@ -1,46 +1,15 @@
-# 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
+#  Semaphore
 #######################################
 
 class Semaphore
@@ -50,11 +19,13 @@ class Semaphore
   end
 
   def acquire
-    MSG::debug(Thread.current.to_s+" acquires "+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
@@ -62,15 +33,14 @@ class Semaphore
   end
 
   def release
-    MSG::debug(Thread.current.to_s+" releases "+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
@@ -88,15 +58,13 @@ class MSG::Process < Thread
   @@nextProcessId = 0
 
 # Attributes
-  attr_reader :bind, :id, :name, :pargs ,:properties# Read only
+  attr_reader :name, :pargs ,:properties       # Read only
   
     def initialize(*args)
       super(){
        
-     raise "Bad Number Of arguments to create 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
      
-#     @cv = ConditionVariable.new
-#     @mutex = Mutex.new
     @schedBegin = Semaphore.new(0)
     @schedEnd = Semaphore.new(0)    
     @id = @@nextProcessId
@@ -109,42 +77,37 @@ class MSG::Process < Thread
       }
     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
+    MSG::debug("Let's execute the main() of the Ruby process")
     main(@pargs)
-#     processExit(self) # Exit the Native Process
-    @schedEnd.release()
+    @schedEnd.release
+    MSG::debug("Released my schedEnd, bailing out")
+    processExit(self) # Exit the Native Process
+    
   end
     
-
-  # FIXME: useless, there is an attribute for bind (or the attribute is useless)
-  # Get Bind
   def getBind()
     return @bind
   end
-  
-  # Set Binds FIXME: same
+   
   def setBind(bind)
     @bind = bind
   end
     
   def unschedule()
-    @schedEnd.release()
-    @schedBegin.acquire()
+    @schedEnd.release
+    @schedBegin.acquire
   end
   
-  def schedule()
-    @schedBegin.release()
-    @schedEnd.acquire()
+  def schedule()   
+    @schedBegin.release
+    @schedEnd.acquire
   end
   
   def pause()
@@ -162,10 +125,9 @@ class MSG::Process < Thread
   def getHost()
     processGetHost(self)
   end
-  
+
 # The Rest of Methods !!! To be Continued ... FIXME: what's missing?
 end
-
 ############################################
 # Task Extend from the native Class RbTask
 ############################################
@@ -187,11 +149,6 @@ class MSG::Task < MSG::RbTask
     super(self,mailbox)
   end
   
-#   FIXME : this methode should be associated to the class !! it reurn a task
-  def receive(mailbox)
-    super(self,mailbox)
-  end
-  
   def source
     super(self)
   end
@@ -211,14 +168,11 @@ class MSG::Task < MSG::RbTask
   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
@@ -246,10 +200,8 @@ class MSG::Host < MSG::RbHost
   def number
     super()
   end
-  
 end
-
 #########################
 # Main chunck 
 #########################
-MSG.init(ARGV)
+MSG.init(ARGV)
\ No newline at end of file