/*********************************************************************** * start_thread * * Startup routine for a newly created thread. */ static void start_thread( struct startup_info *info ) { TEB *teb = info->teb; struct ntdll_thread_data *thread_data = (struct ntdll_thread_data *)teb->SpareBytes1; PRTL_THREAD_START_ROUTINE func = info->entry_point; void *arg = info->entry_arg; struct debug_info debug_info; debug_info.str_pos = debug_info.strings; debug_info.out_pos = debug_info.output; thread_data->debug_info = &debug_info; thread_data->pthread_id = pthread_self(); #ifdef CONFIG_UNIFIED_KERNEL server_new_thread((thread_id_t)teb->ClientId.UniqueThread); #endif signal_init_thread( teb ); server_init_thread( func ); pthread_sigmask( SIG_UNBLOCK, &server_block_set, NULL ); MODULE_DllThreadAttach( NULL ); if (TRACE_ON(relay)) DPRINTF( "%04x:Starting thread proc %p (arg=%p)\n", GetCurrentThreadId(), func, arg ); call_thread_entry_point( (LPTHREAD_START_ROUTINE)func, arg ); }
/*********************************************************************** * start_thread * * Startup routine for a newly created thread. */ static void start_thread( struct startup_info *info ) { TEB *teb = info->teb; struct ntdll_thread_data *thread_data = (struct ntdll_thread_data *)teb->SpareBytes1; PRTL_THREAD_START_ROUTINE func = info->entry_point; void *arg = info->entry_arg; struct debug_info debug_info; debug_info.str_pos = debug_info.strings; debug_info.out_pos = debug_info.output; thread_data->debug_info = &debug_info; thread_data->pthread_id = pthread_self(); signal_init_thread( teb ); server_init_thread( func ); pthread_sigmask( SIG_UNBLOCK, &server_block_set, NULL ); RtlAcquirePebLock(); InsertHeadList( &tls_links, &teb->TlsLinks ); RtlReleasePebLock(); MODULE_DllThreadAttach( NULL ); if (TRACE_ON(relay)) DPRINTF( "%04x:Starting thread proc %p (arg=%p)\n", GetCurrentThreadId(), func, arg ); call_thread_entry_point( (LPTHREAD_START_ROUTINE)func, arg ); }