| /** | |
| * The osthread module provides types used in threads modules. | |
| * | |
| * Copyright: Copyright Sean Kelly 2005 - 2012. | |
| * License: Distributed under the | |
| * $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0). | |
| * (See accompanying file LICENSE) | |
| * Authors: Sean Kelly, Walter Bright, Alex Rønne Petersen, Martin Nowak | |
| * Source: $(DRUNTIMESRC core/thread/threadgroup.d) | |
| */ | |
| module core.thread.threadgroup; | |
| import core.thread.osthread; | |
| /** | |
| * This class is intended to simplify certain common programming techniques. | |
| */ | |
| class ThreadGroup | |
| { | |
| /** | |
| * Creates and starts a new Thread object that executes fn and adds it to | |
| * the list of tracked threads. | |
| * | |
| * Params: | |
| * fn = The thread function. | |
| * | |
| * Returns: | |
| * A reference to the newly created thread. | |
| */ | |
| final Thread create(void function() fn) | |
| { | |
| Thread t = new Thread(fn).start(); | |
| synchronized(this) | |
| { | |
| m_all[t] = t; | |
| } | |
| return t; | |
| } | |
| /** | |
| * Creates and starts a new Thread object that executes dg and adds it to | |
| * the list of tracked threads. | |
| * | |
| * Params: | |
| * dg = The thread function. | |
| * | |
| * Returns: | |
| * A reference to the newly created thread. | |
| */ | |
| final Thread create(void delegate() dg) | |
| { | |
| Thread t = new Thread(dg).start(); | |
| synchronized(this) | |
| { | |
| m_all[t] = t; | |
| } | |
| return t; | |
| } | |
| /** | |
| * Add t to the list of tracked threads if it is not already being tracked. | |
| * | |
| * Params: | |
| * t = The thread to add. | |
| * | |
| * In: | |
| * t must not be null. | |
| */ | |
| final void add(Thread t) | |
| in | |
| { | |
| assert(t); | |
| } | |
| do | |
| { | |
| synchronized(this) | |
| { | |
| m_all[t] = t; | |
| } | |
| } | |
| /** | |
| * Removes t from the list of tracked threads. No operation will be | |
| * performed if t is not currently being tracked by this object. | |
| * | |
| * Params: | |
| * t = The thread to remove. | |
| * | |
| * In: | |
| * t must not be null. | |
| */ | |
| final void remove(Thread t) | |
| in | |
| { | |
| assert(t); | |
| } | |
| do | |
| { | |
| synchronized(this) | |
| { | |
| m_all.remove(t); | |
| } | |
| } | |
| /** | |
| * Operates on all threads currently tracked by this object. | |
| */ | |
| final int opApply(scope int delegate(ref Thread) dg) | |
| { | |
| synchronized(this) | |
| { | |
| int ret = 0; | |
| // NOTE: This loop relies on the knowledge that m_all uses the | |
| // Thread object for both the key and the mapped value. | |
| foreach (Thread t; m_all.keys) | |
| { | |
| ret = dg(t); | |
| if (ret) | |
| break; | |
| } | |
| return ret; | |
| } | |
| } | |
| /** | |
| * Iteratively joins all tracked threads. This function will block add, | |
| * remove, and opApply until it completes. | |
| * | |
| * Params: | |
| * rethrow = Rethrow any unhandled exception which may have caused the | |
| * current thread to terminate. | |
| * | |
| * Throws: | |
| * Any exception not handled by the joined threads. | |
| */ | |
| final void joinAll(bool rethrow = true) | |
| { | |
| synchronized(this) | |
| { | |
| // NOTE: This loop relies on the knowledge that m_all uses the | |
| // Thread object for both the key and the mapped value. | |
| foreach (Thread t; m_all.keys) | |
| { | |
| t.join(rethrow); | |
| } | |
| } | |
| } | |
| private: | |
| Thread[Thread] m_all; | |
| } |