From 80131bd21889cfecf9389e2709a793e6f53da523 Mon Sep 17 00:00:00 2001 From: Mattias Agren Date: Sat, 21 Apr 2012 12:49:59 +0200 Subject: Resolved uipc task termination issue during bluetooth on/off cycle. Cleanup. Change-Id: Iccaa9c36289108d8fc8a2ce7349cef6c6639b2a9 --- gki/ulinux/data_types.h | 2 +- gki/ulinux/gki_ulinux.c | 162 ++++++++++++++++++++++++------------------------ 2 files changed, 82 insertions(+), 82 deletions(-) (limited to 'gki') diff --git a/gki/ulinux/data_types.h b/gki/ulinux/data_types.h index 5263bba..c433b1a 100644 --- a/gki/ulinux/data_types.h +++ b/gki/ulinux/data_types.h @@ -10,7 +10,7 @@ ** ----------------------- ** 3/12/99 Create ** 07/27/00 Added nettohs macro for Little Endian -** +** ** Copyright (c) 1999- 2002, Widcomm Inc., All Rights Reserved. ** Proprietary and confidential. ** diff --git a/gki/ulinux/gki_ulinux.c b/gki/ulinux/gki_ulinux.c index c2838c1..8263d2b 100644 --- a/gki/ulinux/gki_ulinux.c +++ b/gki/ulinux/gki_ulinux.c @@ -3,44 +3,44 @@ * Copyright (C) 2009-2012 Broadcom Corporation * * This program is the proprietary software of Broadcom Corporation and/or its - * licensors, and may only be used, duplicated, modified or distributed - * pursuant to the terms and conditions of a separate, written license - * agreement executed between you and Broadcom (an "Authorized License"). - * Except as set forth in an Authorized License, Broadcom grants no license - * (express or implied), right to use, or waiver of any kind with respect to - * the Software, and Broadcom expressly reserves all rights in and to the - * Software and all intellectual property rights therein. - * IF YOU HAVE NO AUTHORIZED LICENSE, THEN YOU HAVE NO RIGHT TO USE THIS - * SOFTWARE IN ANY WAY, AND SHOULD IMMEDIATELY NOTIFY BROADCOM AND DISCONTINUE - * ALL USE OF THE SOFTWARE. + * licensors, and may only be used, duplicated, modified or distributed + * pursuant to the terms and conditions of a separate, written license + * agreement executed between you and Broadcom (an "Authorized License"). + * Except as set forth in an Authorized License, Broadcom grants no license + * (express or implied), right to use, or waiver of any kind with respect to + * the Software, and Broadcom expressly reserves all rights in and to the + * Software and all intellectual property rights therein. + * IF YOU HAVE NO AUTHORIZED LICENSE, THEN YOU HAVE NO RIGHT TO USE THIS + * SOFTWARE IN ANY WAY, AND SHOULD IMMEDIATELY NOTIFY BROADCOM AND DISCONTINUE + * ALL USE OF THE SOFTWARE. * * Except as expressly set forth in the Authorized License, * - * 1. This program, including its structure, sequence and organization, - * constitutes the valuable trade secrets of Broadcom, and you shall - * use all reasonable efforts to protect the confidentiality thereof, - * and to use this information only in connection with your use of + * 1. This program, including its structure, sequence and organization, + * constitutes the valuable trade secrets of Broadcom, and you shall + * use all reasonable efforts to protect the confidentiality thereof, + * and to use this information only in connection with your use of * Broadcom integrated circuit products. * - * 2. TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED - * "AS IS" AND WITH ALL FAULTS AND BROADCOM MAKES NO PROMISES, - * REPRESENTATIONS OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, - * OR OTHERWISE, WITH RESPECT TO THE SOFTWARE. BROADCOM SPECIFICALLY - * DISCLAIMS ANY AND ALL IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY, - * NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, - * ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR + * 2. TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED + * "AS IS" AND WITH ALL FAULTS AND BROADCOM MAKES NO PROMISES, + * REPRESENTATIONS OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, + * OR OTHERWISE, WITH RESPECT TO THE SOFTWARE. BROADCOM SPECIFICALLY + * DISCLAIMS ANY AND ALL IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY, + * NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, + * ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR * CORRESPONDENCE TO DESCRIPTION. YOU ASSUME THE ENTIRE RISK ARISING * OUT OF USE OR PERFORMANCE OF THE SOFTWARE. * * 3. TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL BROADCOM - * OR ITS LICENSORS BE LIABLE FOR - * (i) CONSEQUENTIAL, INCIDENTAL, SPECIAL, INDIRECT, OR EXEMPLARY - * DAMAGES WHATSOEVER ARISING OUT OF OR IN ANY WAY RELATING TO + * OR ITS LICENSORS BE LIABLE FOR + * (i) CONSEQUENTIAL, INCIDENTAL, SPECIAL, INDIRECT, OR EXEMPLARY + * DAMAGES WHATSOEVER ARISING OUT OF OR IN ANY WAY RELATING TO * YOUR USE OF OR INABILITY TO USE THE SOFTWARE EVEN IF BROADCOM - * HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES; OR - * (ii) ANY AMOUNT IN EXCESS OF THE AMOUNT ACTUALLY PAID FOR THE - * SOFTWARE ITSELF OR U.S. $1, WHICHEVER IS GREATER. THESE - * LIMITATIONS SHALL APPLY NOTWITHSTANDING ANY FAILURE OF + * HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES; OR + * (ii) ANY AMOUNT IN EXCESS OF THE AMOUNT ACTUALLY PAID FOR THE + * SOFTWARE ITSELF OR U.S. $1, WHICHEVER IS GREATER. THESE + * LIMITATIONS SHALL APPLY NOTWITHSTANDING ANY FAILURE OF * ESSENTIAL PURPOSE OF ANY LIMITED REMEDY. * *****************************************************************************/ @@ -49,7 +49,7 @@ ** ** Name gki_linux_pthreads.c ** -** Function pthreads version of Linux GKI. This version is used for +** Function pthreads version of Linux GKI. This version is used for ** settop projects that already use pthreads and not pth. ** *****************************************************************************/ @@ -75,10 +75,11 @@ #define GKI_TICK_TIMER_DEBUG FALSE #endif +#define GKI_INFO(fmt, ...) LOGI ("%s: " fmt, __FUNCTION__, ## __VA_ARGS__) /* always log errors */ #define GKI_ERROR_LOG(fmt, ...) LOGE ("##### ERROR : %s: " fmt "#####", __FUNCTION__, ## __VA_ARGS__) - + #if defined (GKI_TICK_TIMER_DEBUG) && (GKI_TICK_TIMER_DEBUG == TRUE) #define GKI_TIMER_TRACE(fmt, ...) LOGI ("%s: " fmt, __FUNCTION__, ## __VA_ARGS__) #else @@ -168,16 +169,18 @@ void gki_task_entry(UINT32 params) { gki_pthread_info_t *p_pthread_info = (gki_pthread_info_t *)params; gki_cb.os.thread_id[p_pthread_info->task_id] = pthread_self(); - + prctl(PR_SET_NAME, (unsigned long)gki_cb.com.OSTName[p_pthread_info->task_id], 0, 0, 0); - - GKI_TRACE("gki_task_entry task_id=%i\n", p_pthread_info->task_id); - + + GKI_INFO("gki_task_entry task_id=%i [%s] starting\n", p_pthread_info->task_id, + gki_cb.com.OSTName[p_pthread_info->task_id]); + /* Call the actual thread entry point */ (p_pthread_info->task_entry)(p_pthread_info->params); - GKI_TRACE("gki_task task_id=%i terminating\n", p_pthread_info->task_id); - + GKI_INFO("gki_task task_id=%i [%s] terminating\n", p_pthread_info->task_id, + gki_cb.com.OSTName[p_pthread_info->task_id]); + pthread_exit(0); /* GKI tasks have no return value */ } /* end android */ @@ -267,13 +270,13 @@ UINT8 GKI_create_task (TASKPTR task_entry, UINT8 task_id, INT8 *taskname, UINT16 struct sched_param param; int policy, ret = 0; pthread_attr_t attr1; - - GKI_TRACE( "GKI_create_task %x %d %s %x %d", (int)task_entry, (int)task_id, + + GKI_TRACE( "GKI_create_task %x %d %s %x %d", (int)task_entry, (int)task_id, (char*) taskname, (int) stack, (int)stacksize); if (task_id >= GKI_MAX_TASKS) { - GKI_TRACE("Error! task ID > max task allowed"); + GKI_ERROR_LOG("Error! task ID > max task allowed"); return (GKI_FAILURE); } @@ -294,9 +297,9 @@ UINT8 GKI_create_task (TASKPTR task_entry, UINT8 task_id, INT8 *taskname, UINT16 #if ( FALSE == GKI_PTHREAD_JOINABLE ) pthread_attr_setdetachstate(&attr1, PTHREAD_CREATE_DETACHED); - GKI_TRACE("GKI creating task %i\n", task_id); + GKI_TRACE("GKI creating task %i\n", task_id); #else - GKI_TRACE("GKI creating JOINABLE task %i\n", task_id); + GKI_TRACE("GKI creating JOINABLE task %i\n", task_id); #endif /* On Android, the new tasks starts running before 'gki_cb.os.thread_id[task_id]' is initialized */ @@ -304,18 +307,18 @@ UINT8 GKI_create_task (TASKPTR task_entry, UINT8 task_id, INT8 *taskname, UINT16 gki_pthread_info[task_id].task_id = task_id; gki_pthread_info[task_id].task_entry = task_entry; gki_pthread_info[task_id].params = 0; - + ret = pthread_create( &gki_cb.os.thread_id[task_id], &attr1, (void *)gki_task_entry, &gki_pthread_info[task_id]); - + if (ret != 0) { - printf("pthread_create failed(%d), %s!\n\r", ret, taskname); + GKI_ERROR_LOG("pthread_create failed(%d), %s!\n\r", ret, taskname); return GKI_FAILURE; } - + if(pthread_getschedparam(gki_cb.os.thread_id[task_id], &policy, ¶m)==0) { #if (GKI_LINUX_BASE_POLICY!=GKI_SCHED_NORMAL) @@ -325,7 +328,7 @@ UINT8 GKI_create_task (TASKPTR task_entry, UINT8 task_id, INT8 *taskname, UINT16 GKI_TRACE("PBS SQL lowest priority task"); policy = SCHED_NORMAL; } - else + else #endif #endif { @@ -337,12 +340,12 @@ UINT8 GKI_create_task (TASKPTR task_entry, UINT8 task_id, INT8 *taskname, UINT16 } pthread_setschedparam(gki_cb.os.thread_id[task_id], policy, ¶m); } - - GKI_TRACE( "Leaving GKI_create_task %x %d %x %s %x %d\n", + + GKI_TRACE( "Leaving GKI_create_task %x %d %x %s %x %d\n", (int)task_entry, (int)task_id, (int)gki_cb.os.thread_id[task_id], - (char*)taskname, + (char*)taskname, (int)stack, (int)stacksize); @@ -395,13 +398,12 @@ void GKI_destroy_task(UINT8 task_id) result = pthread_join( gki_cb.os.thread_id[task_id], NULL ); if ( result < 0 ) { - GKI_TRACE( "pthread_join() FAILED: result: %d", result ); + GKI_ERROR_LOG( "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); + GKI_INFO( "GKI_shutdown(): task [%s] terminated\n", gki_cb.com.OSTName[task_id]); } - } @@ -432,7 +434,7 @@ void GKI_task_self_cleanup(UINT8 task_id) __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 */ @@ -617,7 +619,7 @@ void* timer_thread(void *arg) { struct timespec delay; int err; - + while(!shutdown_timer) { delay.tv_sec = LINUX_SEC / 1000; @@ -661,7 +663,7 @@ static void gki_set_timer_scheduling( void ) GKI_TRACE("gki_set_timer_scheduling(()::scheduler current policy: %d", policy); /* ensure highest priority in the system + 2 to allow space for read threads */ - param.sched_priority = GKI_LINUX_TIMER_TICK_PRIORITY; + param.sched_priority = GKI_LINUX_TIMER_TICK_PRIORITY; if ( 0!=sched_setscheduler(main_pid, GKI_LINUX_TIMER_POLICY, ¶m ) ) { @@ -672,7 +674,7 @@ static void gki_set_timer_scheduling( void ) { GKI_TRACE( "getscheduler failed: %d", errno); } -} +} /***************************************************************************** @@ -681,7 +683,7 @@ static void gki_set_timer_scheduling( void ) ** ** Description Freeze GKI. Relevant only when NO_GKI_RUN_RETURN is defined ** -** Returns +** Returns ** *******************************************************************************/ @@ -700,7 +702,7 @@ void GKI_freeze() ** ** Description Main GKI loop ** -** Returns +** Returns ** *******************************************************************************/ @@ -731,13 +733,13 @@ void GKI_run (void *p_task_id) timer_thread, NULL) != 0 ) { - printf("GKI_run: pthread_create failed to create timer_thread!\n\r"); + GKI_ERROR_LOG("pthread_create failed to create timer_thread!\n\r"); return; } prctl(PR_SET_NAME, (unsigned long)"gki timer", 0, 0, 0); -#else +#else GKI_TRACE("GKI_run "); for (;;) { @@ -775,7 +777,7 @@ void GKI_run (void *p_task_id) *p_run_cond ); } -#endif +#endif return; } @@ -798,10 +800,10 @@ void GKI_run (void *p_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