void QthreadExec::exec_all( Qthread & , QthreadExecFunctionPointer func , const void * arg ) { verify_is_process("QthreadExec::exec_all(...)",true); s_active_function = func ; s_active_function_arg = arg ; // Need to query which shepherd this main 'process' is running... const int main_shep = qthread_shep(); for ( int jshep = 0 , iwork = 0 ; jshep < s_number_shepherds ; ++jshep ) { for ( int i = jshep != main_shep ? 0 : 1 ; i < s_number_workers_per_shepherd ; ++i , ++iwork ) { // Unit tests hang with this call: // // qthread_fork_to_local_priority( driver_exec_all , NULL , NULL , jshep ); // qthread_fork_to( driver_exec_all , NULL , NULL , jshep ); }} driver_exec_all( NULL ); s_active_function = 0 ; s_active_function_arg = 0 ; }
void QthreadExec::exec_all( Qthread & , QthreadExecFunctionPointer func , const void * arg ) { verify_is_process("QthreadExec::exec_all(...)",true); /* fprintf( stdout , "QthreadExec::exec_all\n"); fflush(stdout); */ s_active_function = func ; s_active_function_arg = arg ; // Need to query which shepherd this main 'process' is running... const int main_shep = qthread_shep(); #if 1 for ( int jshep = 0 , iwork = 0 ; jshep < s_number_shepherds ; ++jshep ) { for ( int i = jshep != main_shep ? 0 : 1 ; i < s_number_workers_per_shepherd ; ++i , ++iwork ) { qthread_fork_to( driver_exec_all , NULL , NULL , jshep ); }} #else // If this function is used before the 'qthread.task_policy' unit test // the 'qthread.task_policy' unit test fails with a seg-fault within libqthread.so. for ( int jshep = 0 ; jshep < s_number_shepherds ; ++jshep ) { const int num_clone = jshep != main_shep ? s_number_workers_per_shepherd : s_number_workers_per_shepherd - 1 ; if ( num_clone ) { const int ret = qthread_fork_clones_to_local_priority ( driver_exec_all /* function */ , NULL /* function data block */ , NULL /* pointer to return value feb */ , jshep /* shepherd number */ , num_clone - 1 /* number of instances - 1 */ ); assert(ret == QTHREAD_SUCCESS); } } #endif driver_exec_all( NULL ); s_active_function = 0 ; s_active_function_arg = 0 ; }