Delete BoundedSemaphore.

This commit is contained in:
Patrick Mahoney 2012-02-01 19:24:07 -06:00
parent bb2bb3c5d9
commit db108a1913
2 changed files with 0 additions and 94 deletions

View File

@ -1,46 +0,0 @@
require 'process_shared/psem'
require 'process_shared/semaphore'
module ProcessShared
# BoundedSemaphore is identical to Semaphore except that its value
# is not permitted to rise above a maximum. When the value is at
# the maximum, calls to #post will have no effect.
class BoundedSemaphore < Semaphore
# With no associated block, open is a synonym for
# Semaphore.new. If the optional code block is given, it will be
# passed +sem+ as an argument, and the Semaphore object will
# automatically be closed when the block terminates. In this
# instance, BoundedSemaphore.open returns the value of the block.
#
# @param [Integer] value the initial semaphore value
# @param [String] name not currently supported
def self.open(maxvalue, value = 1, name = nil, &block)
new(maxvalue, value, name).with_self(&block)
end
# Create a new semaphore with initial value +value+. After
# {Kernel#fork}, the semaphore will be shared across two (or more)
# processes. The semaphore must be closed with {#close} in each
# process that no longer needs the semaphore.
#
# (An object finalizer is registered that will close the semaphore
# to avoid memory leaks, but this should be considered a last
# resort).
#
# @param [Integer] value the initial semaphore value
# @param [String] name not currently supported
def initialize(maxvalue, value = 1, name = nil)
init(PSem.sizeof_bsem_t, 'bsem', name) do |sem_name|
bsem_open(sem, sem_name, maxvalue, value, err)
end
end
protected
alias_method :psem_unlink, :bsem_unlink
alias_method :psem_close, :bsem_close
alias_method :psem_wait, :bsem_wait
alias_method :psem_post, :bsem_post
alias_method :psem_getvalue, :bsem_getvalue
end
end

View File

@ -1,48 +0,0 @@
require 'spec_helper'
require 'process_shared/bounded_semaphore'
module ProcessShared
describe BoundedSemaphore do
it 'never rises above its max value' do
max = 10
BoundedSemaphore.open(max) do |sem|
pids = []
10.times do |i|
pids << fork do
100.times do
if rand(3) == 0
sem.wait
else
sem.post
end
end
exit i
end
end
100.times do
sem.value.must be_lte(max)
end
pids.each { |pid| Process.wait(pid) }
end
end
describe '#post and #wait' do
it 'increments and decrements the value' do
Semaphore.open(0) do |sem|
10.times do |i|
sem.post
sem.value.must_equal(i + 1)
end
10.times do |i|
sem.wait
sem.value.must_equal(10 - i - 1)
end
end
end
end
end
end