class Async::Barrier

A barrier is used to synchronize multiple tasks, waiting for them all to complete before continuing.

def async(*arguments, parent: (@parent or Task.current), **options, &block)

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

def empty?

def empty?
	@tasks.empty?
end

def initialize(parent: nil)

def initialize(parent: nil)
	@tasks = []
	
	@parent = parent
end

def size

def size
	@tasks.size
end

def stop

def stop
	# We have to be careful to avoid enumerating tasks while adding/removing to it:
	tasks = @tasks.dup
	tasks.each(&:stop)
end

def wait

@asynchronous Will wait for tasks to finish executing.
Wait for all tasks.
def wait
	# TODO: This would be better with linked list.
	while @tasks.any?
		task = @tasks.first
		
		begin
			task.wait
		ensure
			# We don't know for sure that the exception was due to the task completion.
			unless task.running?
				# Remove the task from the waiting list if it's finished:
				@tasks.shift if @tasks.first == task
			end
		end
	end
end