static void pthread_start(void) { FAR _TCB *ptcb = (FAR _TCB*)g_readytorun.head; FAR join_t *pjoin = (FAR join_t*)ptcb->joininfo; pthread_addr_t exit_status; /* Sucessfully spawned, add the pjoin to our data set. * Don't re-enable pre-emption until this is done. */ (void)pthread_takesemaphore(&g_join_semaphore); pthread_addjoininfo(pjoin); (void)pthread_givesemaphore(&g_join_semaphore); /* Report to the spawner that we successfully started. */ pjoin->started = true; (void)pthread_givesemaphore(&pjoin->data_sem); /* Pass control to the thread entry point. The argument is * argv[1]. argv[0] (the thread name) and argv[2-4] are not made * available to the pthread. */ exit_status = (*ptcb->entry.pthread)((pthread_addr_t)ptcb->argv[1]); /* The thread has returned */ pthread_exit(exit_status); }
static void pthread_start(void) { FAR struct pthread_tcb_s *ptcb = (FAR struct pthread_tcb_s *)g_readytorun.head; FAR struct task_group_s *group = ptcb->cmn.group; FAR struct join_s *pjoin = (FAR struct join_s *)ptcb->joininfo; pthread_addr_t exit_status; DEBUGASSERT(group && pjoin); /* Sucessfully spawned, add the pjoin to our data set. */ (void)pthread_takesemaphore(&group->tg_joinsem); pthread_addjoininfo(group, pjoin); (void)pthread_givesemaphore(&group->tg_joinsem); /* Report to the spawner that we successfully started. */ pjoin->started = true; (void)pthread_givesemaphore(&pjoin->data_sem); /* Pass control to the thread entry point. In the kernel build this has to * be handled differently if we are starting a user-space pthread; we have * to switch to user-mode before calling into the pthread. */ #if defined(CONFIG_BUILD_PROTECTED) || defined(CONFIG_BUILD_KERNEL) up_pthread_start(ptcb->cmn.entry.pthread, ptcb->arg); exit_status = NULL; #else exit_status = (*ptcb->cmn.entry.pthread)(ptcb->arg); #endif /* The thread has returned (should never happen in the kernel mode case) */ pthread_exit(exit_status); }