void DaoCallServer_Stop() { DCondVar condv; DaoCallThread *calth; if( daoCallServer == NULL ) return; DCondVar_Init( & condv ); daoCallServer->finishing = 1; calth = DaoCallThread_New( NULL, NULL ); DMutex_Lock( & daoCallServer->mutex ); daoCallServer->total += 1; DMutex_Unlock( & daoCallServer->mutex ); DaoCallThread_Run( calth ); /* process tasks in the main thread; */ DMutex_Lock( & daoCallServer->mutex ); while( daoCallServer->stopped != daoCallServer->total || daoCallServer->timing ){ DCondVar_TimedWait( & condv, & daoCallServer->mutex, 0.01 ); } DMutex_Unlock( & daoCallServer->mutex ); DCondVar_Destroy( & condv ); DaoCallThread_Delete( calth ); DaoCallServer_Delete( daoCallServer ); daoCallServer = NULL; }
static void DaoCallServer_AddThread( DThreadTask func, void *param ) { DaoCallThread *calth; DaoCallServer_TryInit( mainVmSpace ); calth = DaoCallThread_New( func, param ); DMutex_Lock( & daoCallServer->mutex ); daoCallServer->total += 1; DArray_Append( daoCallServer->threads, calth ); DMutex_Unlock( & daoCallServer->mutex ); DThread_Start( & calth->thread, (DThreadTask) DaoCallThread_Run, calth ); }
void DaoCallServer_AddThread( DThreadTask func, void *param ) { DaoCallThread *calth; DaoCallServer_TryInit( mainVmSpace ); calth = DaoCallThread_New( func, param ); DMutex_Lock( & daoCallServer->mutex ); daoCallServer->total += 1; DList_Append( daoCallServer->threads, calth ); DMutex_Unlock( & daoCallServer->mutex ); if( DThread_Start( & calth->thread, (DThreadTask) DaoCallThread_Run, calth ) == 0 ){ if( func != NULL || daoCallServer->total == 0 ){ dao_abort( "failed to create a task thread" ); } } }