int main(int argc, char** argv) { Options opts; opts.addOpt("t", "timeout", Options::NeedArg, "5"); opts.addOpt("b", "broadcast"); try { opts.parse(argc, (const char**)argv); } catch(const IceUtilInternal::BadOptException& e) { cerr << argv[0] << ": " << e.reason << endl; return EXIT_FAILURE; } Game game; game.hits = 0; game.state = StateStart; game.broadcast = opts.isSet("b"); game.noise = false; PlayerPtr playerA = new Player(&game, StatePlayerA); playerA->start(); PlayerPtr playerB = new Player(&game, StatePlayerB); playerB->start(); cout << "running spurious wake test (" << ((game.broadcast) ? "broadcast" : "signal") << ")... " << flush; ThreadControl::sleep(Time::seconds(atoi(opts.optArg("t").c_str()))); if(game.broadcast) { { Mutex::Lock sync(game.mutex); game.noise = true; } for(int i =0 ; i < 100000; ++i) { game.cond.broadcast(); } { Mutex::Lock sync(game.mutex); game.noise = false; } } { Mutex::Lock sync(game.mutex); game.state = StateGameOver; game.cond.broadcast(); } playerA->getThreadControl().join(); playerB->getThreadControl().join(); cout << game.hits << " ok" << endl; return 0; }
int main(int argc, char** argv) { Options opts; opts.addOpt("n", "events", Options::NeedArg, "5000"); opts.addOpt("v", "verbose"); try { opts.parse(argc, (const char**)argv); } catch(const IceUtilInternal::BadOptException& e) { cerr << argv[0] << ": " << e.reason << endl; return EXIT_FAILURE; } srand(0); // // if n = 0 then we'll enqueue forever. Otherwise the test will // terminate after n events have been enqueued by each enqueue // thread. // int n = atoi(opts.optArg("n").c_str()); cout << "running signal/broadcast timeout test" << flush; QueuePtr signalQ = new Queue(false); QueuePtr broadcastQ = new Queue(true); CountDownPtr cd = new CountDown(210); list<TestThreadPtr> testThreads; list<EnqueueThreadPtr> enqThreads; int i; for(i = 0; i < 100; i++) { TestThreadPtr p = new TestThread(cd, signalQ, i % 2 != 0); p->start(); testThreads.push_back(p); } for(i = 0; i < 5; i++) { EnqueueThreadPtr p = new EnqueueThread(cd, signalQ, n); p->start(); enqThreads.push_back(p); } for(i = 0; i < 100; i++) { TestThreadPtr p = new TestThread(cd, broadcastQ, i % 2 != 0); p->start(); testThreads.push_back(p); } for(i = 0; i < 5; i++) { EnqueueThreadPtr p = new EnqueueThread(cd, broadcastQ, n); p->start(); enqThreads.push_back(p); } cd->waitZero(); while(!enqThreads.empty()) { EnqueueThreadPtr p = enqThreads.front(); enqThreads.pop_front(); p->getThreadControl().join(); } signalQ->terminate(); broadcastQ->terminate(); while(!testThreads.empty()) { TestThreadPtr p = testThreads.front(); testThreads.pop_front(); p->getThreadControl().join(); } cout << " ok" << endl; return 0; }