void GKI_destroy_task(UINT8 task_id) { #if ( FALSE == GKI_PTHREAD_JOINABLE ) int i = 0; #else int result; #endif if (gki_cb.com.OSRdyTbl[task_id] != TASK_DEAD) { gki_cb.com.OSRdyTbl[task_id] = TASK_DEAD; /* paranoi settings, make sure that we do not execute any mailbox events */ gki_cb.com.OSWaitEvt[task_id] &= ~(TASK_MBOX_0_EVT_MASK|TASK_MBOX_1_EVT_MASK| TASK_MBOX_2_EVT_MASK|TASK_MBOX_3_EVT_MASK); #if (GKI_NUM_TIMERS > 0) gki_cb.com.OSTaskTmr0R[task_id] = 0; gki_cb.com.OSTaskTmr0 [task_id] = 0; #endif #if (GKI_NUM_TIMERS > 1) gki_cb.com.OSTaskTmr1R[task_id] = 0; gki_cb.com.OSTaskTmr1 [task_id] = 0; #endif #if (GKI_NUM_TIMERS > 2) gki_cb.com.OSTaskTmr2R[task_id] = 0; gki_cb.com.OSTaskTmr2 [task_id] = 0; #endif #if (GKI_NUM_TIMERS > 3) gki_cb.com.OSTaskTmr3R[task_id] = 0; gki_cb.com.OSTaskTmr3 [task_id] = 0; #endif GKI_send_event(task_id, EVENT_MASK(GKI_SHUTDOWN_EVT)); #if ( FALSE == GKI_PTHREAD_JOINABLE ) i = 0; while ((gki_cb.com.OSWaitEvt[task_id] != 0) && (++i < 10)) usleep(100 * 1000); #else result = pthread_join( gki_cb.os.thread_id[task_id], NULL ); if ( result < 0 ) { GKI_ERROR_LOG( "pthread_join() FAILED: result: %d", result ); } #endif GKI_exit_task(task_id); GKI_INFO( "GKI_shutdown(): task [%s] terminated\n", gki_cb.com.OSTName[task_id]); } }
void GKI_stop (void) { UINT8 task_id; /* gki_queue_timer_cback(FALSE); */ /* TODO - add code here if needed*/ for(task_id = 0; task_id<GKI_MAX_TASKS; task_id++) { if(gki_cb.com.OSRdyTbl[task_id] != TASK_DEAD) { GKI_exit_task(task_id); } } }
/******************************************************************************* ** ** Function GKI_task_self_cleanup ** ** Description This function is used in the case when the calling thread ** is exiting itself. The GKI_destroy_task function can not be ** used in this case due to the pthread_join call. The function ** cleans up GKI control block associated to the terminating ** thread. ** ** Parameters: task_id - (input) Task id is used for sanity check to ** make sure the calling thread is in the right ** context. ** ** Returns None ** *******************************************************************************/ void GKI_task_self_cleanup(UINT8 task_id) { UINT8 my_task_id = GKI_get_taskid(); if (task_id != my_task_id) { GKI_ERROR_LOG("%s: Wrong context - current task %d is not the given task id %d",\ __FUNCTION__, my_task_id, task_id); return; } if (gki_cb.com.OSRdyTbl[task_id] != TASK_DEAD) { /* paranoi settings, make sure that we do not execute any mailbox events */ gki_cb.com.OSWaitEvt[task_id] &= ~(TASK_MBOX_0_EVT_MASK|TASK_MBOX_1_EVT_MASK| TASK_MBOX_2_EVT_MASK|TASK_MBOX_3_EVT_MASK); #if (GKI_NUM_TIMERS > 0) gki_cb.com.OSTaskTmr0R[task_id] = 0; gki_cb.com.OSTaskTmr0 [task_id] = 0; #endif #if (GKI_NUM_TIMERS > 1) gki_cb.com.OSTaskTmr1R[task_id] = 0; gki_cb.com.OSTaskTmr1 [task_id] = 0; #endif #if (GKI_NUM_TIMERS > 2) gki_cb.com.OSTaskTmr2R[task_id] = 0; gki_cb.com.OSTaskTmr2 [task_id] = 0; #endif #if (GKI_NUM_TIMERS > 3) gki_cb.com.OSTaskTmr3R[task_id] = 0; gki_cb.com.OSTaskTmr3 [task_id] = 0; #endif GKI_exit_task(task_id); /* Calling pthread_detach here to mark the thread as detached. Once the thread terminates, the system can reclaim its resources without waiting for another thread to join with. */ pthread_detach(gki_cb.os.thread_id[task_id]); } }
/******************************************************************************* ** ** Function: NfcAdaptation::Thread() ** ** Description: Creates work threads ** ** Returns: none ** *******************************************************************************/ UINT32 NfcAdaptation::Thread (UINT32 arg) { const char* func = "NfcAdaptation::Thread"; ALOGD ("%s: enter", func); { ThreadCondVar CondVar; AutoThreadMutex guard(CondVar); GKI_create_task ((TASKPTR)nfc_task, NFC_TASK, (INT8*)"NFC_TASK", 0, 0, (pthread_cond_t*)CondVar, (pthread_mutex_t*)CondVar); CondVar.wait(); } NfcAdaptation::GetInstance().signal(); GKI_exit_task (GKI_get_taskid ()); ALOGD ("%s: exit", func); return NULL; }
void GKI_shutdown(void) { UINT8 task_id; #if ( FALSE == GKI_PTHREAD_JOINABLE ) int i = 0; #else int result; #endif #ifdef GKI_USE_DEFERED_ALLOC_BUF_POOLS gki_dealloc_free_queue(); #endif /* release threads and set as TASK_DEAD. going from low to high priority fixes * GKI_exception problem due to btu->hci sleep request events */ for (task_id = GKI_MAX_TASKS; task_id > 0; task_id--) { if (gki_cb.com.OSRdyTbl[task_id - 1] != TASK_DEAD) { gki_cb.com.OSRdyTbl[task_id - 1] = TASK_DEAD; /* paranoi settings, make sure that we do not execute any mailbox events */ gki_cb.com.OSWaitEvt[task_id-1] &= ~(TASK_MBOX_0_EVT_MASK|TASK_MBOX_1_EVT_MASK| TASK_MBOX_2_EVT_MASK|TASK_MBOX_3_EVT_MASK); GKI_send_event(task_id - 1, EVENT_MASK(GKI_SHUTDOWN_EVT)); #if ( FALSE == GKI_PTHREAD_JOINABLE ) i = 0; while ((gki_cb.com.OSWaitEvt[task_id - 1] != 0) && (++i < 10)) usleep(100 * 1000); #else result = pthread_join( gki_cb.os.thread_id[task_id-1], NULL ); if ( result < 0 ) { ALOGE( "pthread_join() FAILED: result: %d", result ); } #endif // GKI_ERROR_LOG( "GKI_shutdown(): task %s dead\n", gki_cb.com.OSTName[task_id]); GKI_exit_task(task_id - 1); } } /* Destroy mutex and condition variable objects */ pthread_mutex_destroy(&gki_cb.os.GKI_mutex); /* pthread_mutex_destroy(&GKI_sched_mutex); */ #if (GKI_DEBUG == TRUE) pthread_mutex_destroy(&gki_cb.os.GKI_trace_mutex); #endif /* pthread_mutex_destroy(&thread_delay_mutex); pthread_cond_destroy (&thread_delay_cond); */ #if ( FALSE == GKI_PTHREAD_JOINABLE ) i = 0; #endif #ifdef NO_GKI_RUN_RETURN shutdown_timer = 1; #endif if (g_GkiTimerWakeLockOn) { GKI_TRACE("GKI_shutdown : release_wake_lock(brcm_btld)"); release_wake_lock(WAKE_LOCK_ID); g_GkiTimerWakeLockOn = 0; } }
void GKI_shutdown(void) { UINT8 task_id; volatile int *p_run_cond = &gki_cb.os.no_timer_suspend; int oldCOnd = 0; #if ( FALSE == GKI_PTHREAD_JOINABLE ) int i = 0; #else int result; #endif /* release threads and set as TASK_DEAD. going from low to high priority fixes * GKI_exception problem due to btu->hci sleep request events */ for (task_id = GKI_MAX_TASKS; task_id > 0; task_id--) { if (gki_cb.com.OSRdyTbl[task_id - 1] != TASK_DEAD) { gki_cb.com.OSRdyTbl[task_id - 1] = TASK_DEAD; /* paranoi settings, make sure that we do not execute any mailbox events */ gki_cb.com.OSWaitEvt[task_id-1] &= ~(TASK_MBOX_0_EVT_MASK|TASK_MBOX_1_EVT_MASK| TASK_MBOX_2_EVT_MASK|TASK_MBOX_3_EVT_MASK); GKI_send_event(task_id - 1, EVENT_MASK(GKI_SHUTDOWN_EVT)); #if ( FALSE == GKI_PTHREAD_JOINABLE ) i = 0; while ((gki_cb.com.OSWaitEvt[task_id - 1] != 0) && (++i < 10)) usleep(100 * 1000); #else /* wait for proper Arnold Schwarzenegger task state */ result = pthread_join( gki_cb.os.thread_id[task_id-1], NULL ); if ( result < 0 ) { GKI_TRACE_1( "pthread_join() FAILED: result: %d", result ); } #endif GKI_TRACE_1( "GKI_shutdown(): task %s dead", gki_cb.com.OSTName[task_id]); GKI_exit_task(task_id - 1); } } /* Destroy mutex and condition variable objects */ pthread_mutex_destroy(&gki_cb.os.GKI_mutex); /* pthread_mutex_destroy(&GKI_sched_mutex); */ #if (GKI_DEBUG == TRUE) pthread_mutex_destroy(&gki_cb.os.GKI_trace_mutex); #endif /* pthread_mutex_destroy(&thread_delay_mutex); pthread_cond_destroy (&thread_delay_cond); */ #if ( FALSE == GKI_PTHREAD_JOINABLE ) i = 0; #endif #ifdef NO_GKI_RUN_RETURN shutdown_timer = 1; #endif if (gki_cb.os.gki_timer_wake_lock_on) { GKI_TRACE_0("GKI_shutdown : release_wake_lock(brcm_btld)"); release_wake_lock(WAKE_LOCK_ID); gki_cb.os.gki_timer_wake_lock_on = 0; } oldCOnd = *p_run_cond; *p_run_cond = GKI_TIMER_TICK_EXIT_COND; if (oldCOnd == GKI_TIMER_TICK_STOP_COND) pthread_cond_signal( &gki_cb.os.gki_timer_cond ); }
/******************************************************************************* ** ** Function nfc_hal_main_task ** ** Description NFC HAL NCI transport event processing task ** ** Returns 0 ** *******************************************************************************/ UINT32 nfc_hal_main_task (UINT32 param) { UINT16 event; UINT8 byte; UINT8 num_interfaces; UINT8 *p; NFC_HDR *p_msg; BOOLEAN free_msg; HAL_TRACE_DEBUG0 ("NFC_HAL_TASK started"); /* Main loop */ while (TRUE) { event = GKI_wait (0xFFFF, 0); /* Handle NFC_HAL_TASK_EVT_INITIALIZE (for initializing NCI transport) */ if (event & NFC_HAL_TASK_EVT_INITIALIZE) { HAL_TRACE_DEBUG0 ("NFC_HAL_TASK got NFC_HAL_TASK_EVT_INITIALIZE signal. Opening NFC transport..."); nfc_hal_main_open_transport (); } /* Check for terminate event */ if (event & NFC_HAL_TASK_EVT_TERMINATE) { HAL_TRACE_DEBUG0 ("NFC_HAL_TASK got NFC_HAL_TASK_EVT_TERMINATE"); nfc_hal_main_handle_terminate (); /* Close uart */ USERIAL_Close (USERIAL_NFC_PORT); if (nfc_hal_cb.p_stack_cback) { nfc_hal_cb.p_stack_cback (HAL_NFC_CLOSE_CPLT_EVT, HAL_NFC_STATUS_OK); nfc_hal_cb.p_stack_cback = NULL; } continue; } /* Check for power cycle event */ if (event & NFC_HAL_TASK_EVT_POWER_CYCLE) { HAL_TRACE_DEBUG0 ("NFC_HAL_TASK got NFC_HAL_TASK_EVT_POWER_CYCLE"); nfc_hal_main_handle_terminate (); /* Close uart */ USERIAL_Close (USERIAL_NFC_PORT); /* power cycle timeout */ nfc_hal_main_start_quick_timer (&nfc_hal_cb.timer, NFC_HAL_TTYPE_POWER_CYCLE, (NFC_HAL_POWER_CYCLE_DELAY*QUICK_TIMER_TICKS_PER_SEC)/1000); continue; } /* NCI message ready to be sent to NFCC */ if (event & NFC_HAL_TASK_EVT_MBOX) { while ((p_msg = (NFC_HDR *) GKI_read_mbox (NFC_HAL_TASK_MBOX)) != NULL) { free_msg = TRUE; switch (p_msg->event & NFC_EVT_MASK) { case NFC_HAL_EVT_TO_NFC_NCI: nfc_hal_main_send_message (p_msg); /* do not free buffer. NCI VS code may keep it for processing later */ free_msg = FALSE; break; case NFC_HAL_EVT_POST_CORE_RESET: NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_POST_INIT_DONE); /* set NCI Control packet size from CORE_INIT_RSP */ p = (UINT8 *) (p_msg + 1) + p_msg->offset + NCI_MSG_HDR_SIZE; p += 5; STREAM_TO_UINT8 (num_interfaces, p); p += (num_interfaces + 3); nfc_hal_cb.ncit_cb.nci_ctrl_size = *p; /* start post initialization */ nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_LPTD; nfc_hal_cb.dev_cb.next_startup_vsc = 1; nfc_hal_dm_config_nfcc (); break; case NFC_HAL_EVT_TO_START_QUICK_TIMER: GKI_start_timer (NFC_HAL_QUICK_TIMER_ID, ((GKI_SECS_TO_TICKS (1) / QUICK_TIMER_TICKS_PER_SEC)), TRUE); break; case NFC_HAL_EVT_HCI: nfc_hal_hci_evt_hdlr ((tNFC_HAL_HCI_EVENT_DATA *) p_msg); break; case NFC_HAL_EVT_PRE_DISCOVER: NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_W4_PREDISCOVER_DONE); nfa_hal_send_pre_discover_cfg (); break; case NFC_HAL_EVT_CONTROL_GRANTED: nfc_hal_dm_send_pend_cmd (); break; default: break; } if (free_msg) GKI_freebuf (p_msg); } } /* Data waiting to be read from serial port */ if (event & NFC_HAL_TASK_EVT_DATA_RDY) { while (TRUE) { /* Read one byte to see if there is anything waiting to be read */ if (USERIAL_Read (USERIAL_NFC_PORT, &byte, 1) == 0) { break; } if (nfc_hal_nci_receive_msg (byte)) { /* complete of receiving NCI message */ nfc_hal_nci_assemble_nci_msg (); if (nfc_hal_cb.ncit_cb.p_rcv_msg) { if (nfc_hal_nci_preproc_rx_nci_msg (nfc_hal_cb.ncit_cb.p_rcv_msg)) { /* Send NCI message to the stack */ nfc_hal_send_nci_msg_to_nfc_task (nfc_hal_cb.ncit_cb.p_rcv_msg); } else { if (nfc_hal_cb.ncit_cb.p_rcv_msg) GKI_freebuf(nfc_hal_cb.ncit_cb.p_rcv_msg); } nfc_hal_cb.ncit_cb.p_rcv_msg = NULL; } } } /* while (TRUE) */ } /* Process quick timer tick */ if (event & NFC_HAL_QUICK_TIMER_EVT_MASK) { nfc_hal_main_process_quick_timer_evt (); } } HAL_TRACE_DEBUG0 ("nfc_hal_main_task terminated"); GKI_exit_task (GKI_get_taskid ()); return 0; }
/******************************************************************************* ** ** Function nfc_task ** ** Description NFC event processing task ** ** Returns nothing ** *******************************************************************************/ UINT32 nfc_task (UINT32 param) { UINT16 event; BT_HDR *p_msg; BOOLEAN free_buf; /* Initialize the nfc control block */ memset (&nfc_cb, 0, sizeof (tNFC_CB)); nfc_cb.trace_level = NFC_INITIAL_TRACE_LEVEL; NFC_TRACE_DEBUG0 ("NFC_TASK started."); /* main loop */ while (TRUE) { event = GKI_wait (0xFFFF, 0); /* Handle NFC_TASK_EVT_TRANSPORT_READY from NFC HAL */ if (event & NFC_TASK_EVT_TRANSPORT_READY) { NFC_TRACE_DEBUG0 ("NFC_TASK got NFC_TASK_EVT_TRANSPORT_READY."); /* Reset the NFC controller. */ nfc_set_state (NFC_STATE_CORE_INIT); nci_snd_core_reset (NCI_RESET_TYPE_RESET_CFG); } if (event & NFC_MBOX_EVT_MASK) { /* Process all incoming NCI messages */ while ((p_msg = (BT_HDR *) GKI_read_mbox (NFC_MBOX_ID)) != NULL) { free_buf = TRUE; /* Determine the input message type. */ switch (p_msg->event & BT_EVT_MASK) { case BT_EVT_TO_NFC_NCI: free_buf = nfc_ncif_process_event (p_msg); break; case BT_EVT_TO_START_TIMER : /* Start nfc_task 1-sec resolution timer */ GKI_start_timer (NFC_TIMER_ID, GKI_SECS_TO_TICKS (1), TRUE); break; case BT_EVT_TO_START_QUICK_TIMER : /* Quick-timer is required for LLCP */ GKI_start_timer (NFC_QUICK_TIMER_ID, ((GKI_SECS_TO_TICKS (1) / QUICK_TIMER_TICKS_PER_SEC)), TRUE); break; case BT_EVT_TO_NFC_MSGS: nfc_main_handle_hal_evt ((tNFC_HAL_EVT_MSG*)p_msg); break; default: NFC_TRACE_DEBUG1 ("nfc_task: unhandle mbox message, event=%04x", p_msg->event); break; } if (free_buf) { GKI_freebuf (p_msg); } } } /* Process gki timer tick */ if (event & NFC_TIMER_EVT_MASK) { nfc_process_timer_evt (); } /* Process quick timer tick */ if (event & NFC_QUICK_TIMER_EVT_MASK) { nfc_process_quick_timer_evt (); } #if (defined (NFA_INCLUDED) && NFA_INCLUDED == TRUE) if (event & NFA_MBOX_EVT_MASK) { while ((p_msg = (BT_HDR *) GKI_read_mbox (NFA_MBOX_ID)) != NULL) { nfa_sys_event (p_msg); } } if (event & NFA_TIMER_EVT_MASK) { nfa_sys_timer_update (); } #endif } NFC_TRACE_DEBUG0 ("nfc_task terminated"); GKI_exit_task (GKI_get_taskid ()); return 0; }