pthreads :: BlockingQueue :: defaultinit
# A Blocking queue implemented from a `ConcurrentList`
# `shift` is blocking if there isn't any element in `self`
# `push` or `unshift` releases every blocking threads
class BlockingQueue[E]
super ConcurrentList[E]
# Used to block or signal on waiting threads
private var cond = new PthreadCond
# Adding the signal to release eventual waiting thread(s)
redef fun push(e) do
mutex.lock
real_collection.push(e)
self.cond.signal
real_collection.push(e)
mutex.unlock
end
redef fun unshift(e) do
mutex.lock
real_collection.unshift(e)
self.cond.signal
mutex.unlock
end
# If empty, blocks until an item is inserted with `push` or `unshift`
redef fun shift do
mutex.lock
while real_collection.is_empty do self.cond.wait(mutex)
var r = real_collection.shift
mutex.unlock
return r
end
redef fun is_empty do
mutex.lock
var r = real_collection.is_empty
mutex.unlock
return r
end
end
lib/pthreads/concurrent_collections.nit:551,1--591,3