DWORD WINAPI #else void* #endif thread_run_wrapper( void* paramPtr ) { struct thread_Settings* thread = (struct thread_Settings*) paramPtr; // which type of object are we switch ( thread->mThreadMode ) { case kMode_Server: { /* Spawn a Server thread with these settings */ server_spawn( thread ); } break; case kMode_Client: { /* Spawn a Client thread with these settings */ client_spawn( thread ); } break; case kMode_Reporter: { /* Spawn a Reporter thread with these settings */ reporter_spawn( thread ); } break; case kMode_Listener: { // Increment the non-terminating thread count thread_register_nonterm(); /* Spawn a Listener thread with these settings */ listener_spawn( thread ); // Decrement the non-terminating thread count thread_unregister_nonterm(); } break; default: { FAIL(1, "Unknown Thread Type!\n", thread); } break; } #ifdef HAVE_POSIX_THREAD // detach Thread. If someone already joined it will not do anything // If noone has then it will free resources upon return from this // function (Run_Wrapper) pthread_detach(thread->mTID); #endif // decrement thread count and send condition signal Condition_Lock( thread_sNum_cond ); thread_sNum--; Condition_Signal( &thread_sNum_cond ); Condition_Unlock( thread_sNum_cond ); // Check if we need to start up a thread after executing this one if ( thread->runNext != NULL ) { thread_start( thread->runNext ); } // Destroy this thread object Settings_Destroy( thread ); return 0; } // end run_wrapper
DWORD WINAPI #else void* #endif /* HAVE_WIN32_THREAD */ thread_run_wrapper( void* paramPtr ) { struct thread_Settings* thread = (struct thread_Settings*) paramPtr; IPERF_DEBUGF( THREAD_DEBUG | IPERF_DBG_TRACE | IPERF_DBG_STATE, ( "%s thread is now running. ID is %lu.\r\n", thread_names[thread->mThreadMode], (long unsigned) thread_getid() ) ); // which type of object are we switch ( thread->mThreadMode ) { case kMode_Server: { /* Spawn a Server thread with these settings */ server_spawn( thread ); } break; case kMode_Client: { /* Spawn a Client thread with these settings */ client_spawn( thread ); } break; case kMode_Reporter: { /* Spawn a Reporter thread with these settings */ reporter_spawn( thread ); } break; case kMode_Listener: { // Increment the non-terminating thread count thread_register_nonterm(); /* Spawn a Listener thread with these settings */ listener_spawn( thread ); // Decrement the non-terminating thread count thread_unregister_nonterm(); } break; default: { FAIL(1, ( "Unknown Thread Type!\r\n" ), thread); } break; } #ifdef HAVE_POSIX_THREAD // detach Thread. If someone already joined it will not do anything // If noone has then it will free resources upon return from this // function (Run_Wrapper) IPERF_DEBUGF( THREAD_DEBUG | IPERF_DBG_TRACE, ( "Detaching %s thread.\r\n", thread_names[thread->mThreadMode] ) ); pthread_detach(thread->mTID); #endif /* HAVE_POSIX_THREAD */ // decrement thread count and send condition signal 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--; IPERF_DEBUGF( CONDITION_DEBUG | IPERF_DBG_TRACE, ( "Signaling thread_sNum_cond condition.\r\n" ) ); Condition_Signal( &thread_sNum_cond ); Condition_Unlock( thread_sNum_cond ); // Check if we need to start up a thread after executing this one if ( thread->runNext != NULL ) { thread_start( thread->runNext ); } // Destroy this thread object Settings_Destroy( thread ); return 0; } // end thread_run_wrapper