Sha256: 4b563c5924db109858751793b9b23fbb93ccbbd90a1e8d3a4820f0be6bac7fa0
Contents?: true
Size: 1.78 KB
Versions: 7
Compression:
Stored size: 1.78 KB
Contents
#-- # Semaphore # # Copyright (c) 2005 Fukumoto # # Ruby License # # This module is free software. You may use, modify, and/or redistribute this # software under the same terms as Ruby. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. # # ========================================================================== # Revision History # ========================================================================== # # 2005-04-28 Trans - Ported to Calibre. # # ========================================================================== #++ #:title: Semaphore # # Technically a semaphore is simply an integer variable which # has an execution queue associated with it. # # == Usage # # s = Semaphore.new( 4 ) # # TODO # # == Author(s) # # * Fukumoto # class Semaphore def initialize(initvalue = 0) @counter = initvalue @waiting_list = [] end def wait Thread.critical = true if (@counter -= 1) < 0 @waiting_list.push(Thread.current) Thread.stop end self ensure Thread.critical = false end def signal Thread.critical = true begin if (@counter += 1) <= 0 t = @waiting_list.shift t.wakeup if t end rescue ThreadError retry end self ensure Thread.critical = false end alias_method( :down, :wait ) alias_method( :up, :signal ) alias_method( :p, :wait ) alias_method( :v, :signal ) def exclusive wait yield ensure signal end alias_method( :synchronize, :exclusive ) end # _____ _ # |_ _|__ ___| |_ # | |/ _ \/ __| __| # | | __/\__ \ |_ # |_|\___||___/\__| # # TODO =begin #test require 'test/unit' =end
Version data entries
7 entries across 7 versions & 1 rubygems