Class: Async::Barrier

Inherits:
Object
  • Object
show all
Defined in:
lib/async/barrier.rb

Overview

A semaphore is used to control access to a common resource in a concurrent system. A useful way to think of a semaphore as used in the real-world systems is as a record of how many units of a particular resource are available, coupled with operations to adjust that record safely (i.e. to avoid race conditions) as units are required or become free, and, if necessary, wait until a unit of the resource becomes available.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeBarrier

Returns a new instance of Barrier.



26
27
28
# File 'lib/async/barrier.rb', line 26

def initialize
	@tasks = []
end

Instance Attribute Details

#tasksObject (readonly)

All tasks which have been invoked into the barrier.



31
32
33
# File 'lib/async/barrier.rb', line 31

def tasks
  @tasks
end

Instance Method Details

#async(*args, parent: Task.current, **options, &block) ⇒ Object



37
38
39
40
41
42
43
# File 'lib/async/barrier.rb', line 37

def async(*args, parent: Task.current, **options, &block)
	task = parent.async(*args, **options, &block)
	
	@tasks << task
	
	return task
end

#empty?Boolean

Returns:

  • (Boolean)


45
46
47
# File 'lib/async/barrier.rb', line 45

def empty?
	@tasks.empty?
end

#sizeObject



33
34
35
# File 'lib/async/barrier.rb', line 33

def size
	@tasks.size
end

#waitObject

Wait for tasks in FIFO order.



50
51
52
53
54
# File 'lib/async/barrier.rb', line 50

def wait
	while task = @tasks.shift
		task.wait
	end
end