// PThreadCondition_t.cxx #include "dataset_util/PThreadCondition.h" #include #include #include using std::string; using std::cout; using std::endl; using std::set; void msg(string txt) { cout << "*** "; cout << txt; cout << " ***" << endl; } // Shared condition. PThreadCondition& condition() { static PThreadCondition con; return con; } // Thread function. void* test_thread(void* parg) { int val = *(int*) parg; cout << "Thread: Create thread for value 1" << endl; condition().lock(); assert( condition().is_locked() ); assert( condition().lock_owner() == pthread_self() ); condition().set(val); condition().unlock(); assert( ! condition().is_locked() ); assert( condition().lock_owner() == 0 ); condition().signal(); cout << "Thread: exiting" << endl; return parg; } int PThreadCondition_t() { msg("Check return codes"); cout << PThreadCondition::ok() << endl; cout << PThreadCondition::invalid_argument() << endl; cout << PThreadCondition::mutex_not_locked() << endl; cout << PThreadCondition::invalid_mutex_lock_count() << endl; cout << PThreadCondition::timed_out() << endl; set codes; codes.insert(PThreadCondition::ok()); codes.insert(PThreadCondition::invalid_argument()); codes.insert(PThreadCondition::mutex_not_locked()); codes.insert(PThreadCondition::invalid_mutex_lock_count()); codes.insert(PThreadCondition::timed_out()); assert( codes.size() == 5 ); assert( PThreadCondition::ok() == 0 ); msg("Create test condition"); PThreadCondition con; cout << con << endl; assert( con.get() == 0 ); msg("Create thread 1"); condition().lock(); assert( condition().get() == 0 ); int val = 1; pthread_t tid; pthread_create(&tid, 0, test_thread, &val); pthread_detach(tid); msg("Wait for thread 1 to set condition"); cout << condition() << endl; int cstat = condition().wait(); assert( cstat == 0 ); cout << condition() << endl; int newval = condition().get(); cout << "Main: Found condition value " << newval << endl; assert( newval == val ); condition().unlock(); return 0; } #ifdef CTEST_MAIN int main() { return PThreadCondition_t(); } #endif