module threads_runme; import tango.core.Thread; import tango.io.Console; import Integer = tango.text.convert.Integer; import threads.Kerfuffle; // Spawn 8 threads. const uint NUM_THREADS = 8; // Run test for a few seconds on a 1GHz machine. const uint WORKER_LOOP_PASSES = 30000; void main() { auto kerf = new Kerfuffle(); TestThread[] threads; // Invoke the threads. for (uint i = 0; i < NUM_THREADS; i++) { auto thread = new TestThread(kerf); threads ~= thread; thread.name = Integer.toString(i); thread.start(); } // Wait for the threads to finish. foreach(thread; threads) { thread.join(); } // Check if any thread has failed. foreach(thread; threads) { if (thread.failed) throw new Exception("Test failed."); } } class TestThread : Thread { public: this(Kerfuffle kerf) { super(&run); m_kerf = kerf; } void run() { failed = false; try { for (uint i = 0; i < WORKER_LOOP_PASSES; i++) { char[] given = "This is the test char[] that should come back. A number: " ~ Integer.toString(i); char[] received = m_kerf.StdString(given); if (received != given) { throw new Exception("StdString char[] does not match. Received: '" ~ received ~ "'. Expected: '" ~ given ~ "'."); } } for (uint i = 0; i < WORKER_LOOP_PASSES; i++) { char[] given = "This is the test char[] that should come back. A number: " ~ Integer.toString(i); char[] received = m_kerf.CharString(given); if (received != given) { throw new Exception("StdString char[] does not match. Received: '" ~ received ~ "'. Expected: '" ~ given ~ "'."); } } } catch (Exception e) { Cerr("Test failed (thread " ~ name() ~ "): " ~ e.msg).newline; failed = true; } } bool failed; private: Kerfuffle m_kerf; }