Mercurial > projects > dreactor
diff asyncdreactor/util/ThreadSafeQueue.d @ 11:5836613d16ac
reorg! reorg!
author | rick@minifunk |
---|---|
date | Tue, 12 Aug 2008 16:59:56 -0400 |
parents | dreactor/util/ThreadSafeQueue.d@e3dbc9208822 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/asyncdreactor/util/ThreadSafeQueue.d Tue Aug 12 16:59:56 2008 -0400 @@ -0,0 +1,99 @@ +module dreactor.util.ThreadSafeQueue; + +import tango.util.collection.CircularSeq; +import tango.core.Atomic; + +import tango.util.log.Log; +import tango.util.log.Config; +/****************************************************************************** + + ThreadSafeQueue + Queue that is probably thread safe. It acts as a job queue, in that + you can push or pop off of the queue. Or you can processAll, which will + apply a delegate to each item, then clear the list. + +******************************************************************************/ +class ThreadSafeQueue(TYPE) +{ +public + this(int maxsz = 1000) + { + list_ = new CircularSeq!(TYPE); + maxsize_ = maxsz; + size_ = 0; + log = Log.lookup("dreactor.util.ThreadSafeQueue"); + } + + synchronized bool pop(ref TYPE t) + { + if (size_ > 0) + { + t = list_.head(); + list_.removeHead(); + size_--; + return true; + } + else + return false; + } + + synchronized bool push(TYPE t) + { + if (size_ < maxsize_) + { + list_.append(t); + size_++; + return true; + } + else + return false; + } + + synchronized int size() + { + return size_; + } + + synchronized int processAll(int delegate(ref TYPE value) dg) + { + if (0 >= size_) + return 0; + + int count = 0; + foreach(TYPE t; list_) + { + if (dg(t) < 0) + break; + ++count; + } + if (count == size_) + { + clear_(); + size_ = 0; + } + else + { + list_.removeRange(0, count); + size_ -= count; + } + return count; + } + + synchronized void clear() + { + clear_(); + } + +private + + void clear_() + { + list_.clear(); + size_ = 0 ; + } + + int maxsize_; + int size_; + Logger log; + CircularSeq!(TYPE) list_; +}