DWORD WINAPI RunThread(void *ptr) { DWORD ret = 0; #else void * RunThread(void *ptr) { long int ret = 0; #endif GF_Thread *t = (GF_Thread *)ptr; /* Signal the caller */ if (! t->_signal) goto exit; #ifdef GPAC_ANDROID if (pthread_once(¤tThreadInfoKey_once, ¤tThreadInfoKey_alloc) || pthread_setspecific(currentThreadInfoKey, t)) GF_LOG(GF_LOG_ERROR, GF_LOG_MUTEX, ("[Mutex] Couldn't run thread %s, ID 0x%08x\n", t->log_name, t->id)); #endif /* GPAC_ANDROID */ t->status = GF_THREAD_STATUS_RUN; gf_sema_notify(t->_signal, 1); #ifndef GPAC_DISABLE_LOG t->id = gf_th_id(); GF_LOG(GF_LOG_INFO, GF_LOG_MUTEX, ("[Thread %s] At %d Entering thread proc - thread ID 0x%08x\n", t->log_name, gf_sys_clock(), t->id)); #endif /* Each thread has its own seed */ gf_rand_init(0); /* Run our thread */ ret = t->Run(t->args); exit: #ifndef GPAC_DISABLE_LOG GF_LOG(GF_LOG_INFO, GF_LOG_MUTEX, ("[Thread %s] At %d Exiting thread proc\n", t->log_name, gf_sys_clock())); #endif t->status = GF_THREAD_STATUS_DEAD; t->Run = NULL; #ifdef WIN32 if (!CloseHandle(t->threadH)) { DWORD err = GetLastError(); GF_LOG(GF_LOG_ERROR, GF_LOG_MUTEX, ("[Thread %s] Couldn't close handle when exiting thread proc, error code: %d\n", t->log_name, err)); } t->threadH = NULL; return ret; #else #ifdef GPAC_ANDROID #ifndef GPAC_DISABLE_LOG GF_LOG(GF_LOG_INFO, GF_LOG_MUTEX, ("[Thread %s] RunBeforeExit=%p\n", t->log_name, t->RunBeforeExit)); #endif if (t->RunBeforeExit) t->RunBeforeExit(t->args); #endif /* GPAC_ANDROID */ pthread_exit((void *)0); return (void *)ret; #endif }
static void *RunThread(void *ptr) { TInt err; u32 ret = 0; CTrapCleanup * cleanup = NULL; GF_Thread *t = (GF_Thread *)ptr; CActiveScheduler * scheduler = new CActiveScheduler(); if (scheduler == NULL) { t->status = GF_THREAD_STATUS_DEAD; gf_sema_notify(t->_signal, 1); goto exit; } #ifndef GPAC_DISABLE_LOG GF_LOG(GF_LOG_DEBUG, GF_LOG_CORE, ("[Thread %s] Installing ActiveScheduler\n", t->log_name)); #endif CActiveScheduler::Install(scheduler); #ifndef GPAC_DISABLE_LOG GF_LOG(GF_LOG_DEBUG, GF_LOG_CORE, ("[Thread %s] Creating cleanup trap\n", t->log_name)); #endif cleanup = CTrapCleanup::New(); if( cleanup == NULL ) { t->status = GF_THREAD_STATUS_DEAD; gf_sema_notify(t->_signal, 1); delete CActiveScheduler::Current(); goto exit; } #if 0 CActiveScheduler::Start(); #endif /* OK , signal the caller */ t->status = GF_THREAD_STATUS_RUN; gf_sema_notify(t->_signal, 1); /* Run our thread */ #ifndef GPAC_DISABLE_LOG GF_LOG(GF_LOG_DEBUG, GF_LOG_CORE, ("[Thread %s] Entering thread proc\n", t->log_name)); #endif TRAP(err, ret=t->Run(t->args) ); //ret = t->Run(t->args); delete CActiveScheduler::Current(); delete cleanup; exit: #ifndef GPAC_DISABLE_LOG GF_LOG(GF_LOG_DEBUG, GF_LOG_CORE, ("[Thread %s] Exit\n", t->log_name )); #endif t->status = GF_THREAD_STATUS_DEAD; t->Run = NULL; t->threadH->Close(); t->threadH = NULL; return (void *)ret; }