void term_handler (int signum) { XbmcCommons::ILogger* logger = CThread::GetLogger(); if (logger) logger->Log(LOGERROR,"thread 0x%lx (%lu) got signal %d. calling OnException and terminating thread abnormally.", (long unsigned int)pthread_self(), (long unsigned int)pthread_self(), signum); CThread* curThread = CThread::GetCurrentThread(); if (curThread) { curThread->StopThread(false); curThread->OnException(); if( curThread->IsAutoDelete() ) delete curThread; } pthread_exit(NULL); }
void CThread::term_handler (int signum) { CLog::Log(LOGERROR,"thread 0x%lx (%lu) got signal %d. calling OnException and terminating thread abnormally.", (long unsigned int)pthread_self(), (long unsigned int)pthread_self(), signum); CThread* curThread = currentThread.get(); if (curThread) { curThread->m_bStop = TRUE; curThread->m_StopEvent.Set(); curThread->OnException(); if( curThread->IsAutoDelete() ) delete curThread; } pthread_exit(NULL); }
DWORD WINAPI CThread::staticThread(LPVOID* data) #endif { CThread* pThread = (CThread*)(data); if (!pThread) { CLog::Log(LOGERROR,"%s, sanity failed. thread is NULL.",__FUNCTION__); return 1; } CLog::Log(LOGDEBUG,"thread start, auto delete: %d",pThread->IsAutoDelete()); #ifndef _LINUX /* install win32 exception translator */ win32_exception::install_handler(); #else #ifndef __APPLE__ pLocalThread = pThread; #endif struct sigaction action; action.sa_handler = term_handler; sigemptyset (&action.sa_mask); action.sa_flags = 0; //sigaction (SIGABRT, &action, NULL); //sigaction (SIGSEGV, &action, NULL); #endif #ifdef __APPLE__ // Set the TLS. pthread_setspecific(tlsLocalThread, (void*)pThread); #endif try { pThread->OnStartup(); } #ifndef _LINUX catch (const win32_exception &e) { e.writelog(__FUNCTION__); if( pThread->IsAutoDelete() ) { delete pThread; _endthreadex(123); return 0; } } #endif catch(...) { CLog::Log(LOGERROR, "%s - Unhandled exception caught in thread startup, aborting. auto delete: %d", __FUNCTION__, pThread->IsAutoDelete()); if( pThread->IsAutoDelete() ) { delete pThread; #ifndef _LINUX _endthreadex(123); #endif return 0; } } try { pThread->Process(); } #ifndef _LINUX catch (const access_violation &e) { e.writelog(__FUNCTION__); } catch (const win32_exception &e) { e.writelog(__FUNCTION__); } #endif catch(...) { CLog::Log(LOGERROR, "%s - Unhandled exception caught in thread process, attemping cleanup in OnExit", __FUNCTION__); } try { pThread->OnExit(); } #ifndef _LINUX catch (const access_violation &e) { e.writelog(__FUNCTION__); } catch (const win32_exception &e) { e.writelog(__FUNCTION__); } #endif catch(...) { CLog::Log(LOGERROR, "%s - Unhandled exception caught in thread exit", __FUNCTION__); } if ( pThread->IsAutoDelete() ) { CLog::Log(LOGDEBUG,"Thread %"PRIu64" terminating (autodelete)", (uint64_t)CThread::GetCurrentThreadId()); delete pThread; pThread = NULL; } else CLog::Log(LOGDEBUG,"Thread %"PRIu64" terminating", (uint64_t)CThread::GetCurrentThreadId()); // DXMERGE - this looks like it might have used to have been useful for something... // g_graphicsContext.DeleteThreadContext(); #ifndef _LINUX _endthreadex(123); #endif return 0; }