/* ------------------------------------------------------------------- * Start the specified object's thread execution. Increments thread * count, spawns new thread, and stores thread ID. * ------------------------------------------------------------------- */ void thread_start( struct thread_Settings* thread ) { // Make sure this object has not been started already if ( thread_equalid( thread->mTID, thread_zeroid() ) ) { // Check if we need to start another thread before this one if ( thread->runNow != NULL ) { thread_start( thread->runNow ); } // increment thread count Condition_Lock( thread_sNum_cond ); thread_sNum++; Condition_Unlock( thread_sNum_cond ); #if defined( HAVE_POSIX_THREAD ) // pthreads -- spawn new thread if ( pthread_create( &thread->mTID, NULL, thread_run_wrapper, thread ) != 0 ) { WARN( 1, "pthread_create" ); // decrement thread count Condition_Lock( thread_sNum_cond ); thread_sNum--; Condition_Unlock( thread_sNum_cond ); } #elif defined( HAVE_WIN32_THREAD ) // Win32 threads -- spawn new thread // Win32 has a thread handle in addition to the thread ID thread->mHandle = CreateThread( NULL, 0, thread_run_wrapper, thread, 0, &thread->mTID ); if ( thread->mHandle == NULL ) { WARN( 1, "CreateThread" ); // decrement thread count Condition_Lock( thread_sNum_cond ); thread_sNum--; Condition_Unlock( thread_sNum_cond ); } #else // single-threaded -- call Run_Wrapper in this thread thread_run_wrapper( thread ); #endif } } // end thread_start
/* ------------------------------------------------------------------- * Start the specified object's thread execution. Increments thread * count, spawns new thread, and stores thread ID. * ------------------------------------------------------------------- */ void thread_start( struct thread_Settings* thread ) { // Make sure this object has not been started already if ( thread_equalid( thread->mTID, thread_zeroid() ) ) { // Check if we need to start another thread before this one if ( thread->runNow != NULL ) { thread_start( thread->runNow ); } // increment thread count Condition_Lock( thread_sNum_cond ); IPERF_DEBUGF( THREAD_DEBUG | IPERF_DBG_TRACE, ( "Incrementing thread count from %d to %d.\r\n", thread_sNum, (thread_sNum + 1) ) ); thread_sNum++; Condition_Unlock( thread_sNum_cond ); IPERF_DEBUGF( THREAD_DEBUG | IPERF_DBG_TRACE | IPERF_DBG_STATE, ( "Spawning %s thread.\r\n", thread_names[thread->mThreadMode] ) ); #if defined( HAVE_POSIX_THREAD ) // pthreads -- spawn new thread if ( pthread_create( &thread->mTID, NULL, thread_run_wrapper, thread ) != 0 ) { WARN( 1, ( "pthread_create failed!\r\n" ) ); // decrement thread count Condition_Lock( thread_sNum_cond ); IPERF_DEBUGF( THREAD_DEBUG | IPERF_DBG_TRACE, ( "Decrementing thread count from %d to %d.\r\n", thread_sNum, (thread_sNum - 1) ) ); thread_sNum--; Condition_Unlock( thread_sNum_cond ); } #elif defined( HAVE_WIN32_THREAD ) // Win32 threads -- spawn new thread // Win32 has a thread handle in addition to the thread ID thread->mHandle = CreateThread( NULL, 0, thread_run_wrapper, thread, 0, &thread->mTID ); if ( thread->mHandle == NULL ) { WARN( 1, ( "CreateThread failed!\r\n" ) ); // decrement thread count Condition_Lock( thread_sNum_cond ); IPERF_DEBUGF( THREAD_DEBUG | IPERF_DBG_TRACE, ( "Decrementing thread count from %d to %d.\r\n", thread_sNum, (thread_sNum - 1) ) ); thread_sNum--; Condition_Unlock( thread_sNum_cond ); } #else // single-threaded -- call Run_Wrapper in this thread thread_run_wrapper( thread ); #endif /* HAVE_POSIX_THREAD */ } } // end thread_start