Sha256: de015c4a74f90eae1e2241c5f5f66e7c851c5606c7f9cc0cf89060f8b42d2de0

Contents?: true

Size: 1.2 KB

Versions: 3

Compression:

Stored size: 1.2 KB

Contents

#--
#            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
#                    Version 2, December 2004
#
#            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
#   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
#
#  0. You just DO WHAT THE FUCK YOU WANT TO.
#++

require 'thread'

class Thread::Channel
	def initialize (messages = [], &block)
		@messages = []
		@mutex    = Mutex.new
		@cond     = ConditionVariable.new
		@check    = block

		messages.each {|o|
			send o
		}
	end

	def send (what)
		if @check && !@check.call(what)
			raise ArgumentError, 'guard mismatch'
		end

		@mutex.synchronize {
			@messages << what
			@cond.broadcast
		}

		self
	end

	def receive (&block)
		message = nil

		if block
			found = false

			until found
				@mutex.synchronize {
					if index = @messages.find_index(&block)
						message = @messages.delete_at(index)
						found   = true
					else
						@cond.wait @mutex
					end
				}
			end
		else
			@mutex.synchronize {
				if @messages.empty?
					@cond.wait @mutex
				end

				message = @messages.shift
			}
		end

		message
	end

	def receive! (&block)
		if block
			@messages.delete_at(@messages.find_index(&block))
		else
			@messages.shift
		end
	end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
thread-0.0.2 lib/thread/channel.rb
thread-0.0.1.1 lib/thread/channel.rb
thread-0.0.1 lib/thread/channel.rb