Home | History | Annotate | Download | only in ulinux
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2009-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /****************************************************************************
     20 **
     21 **  Name        gki_linux_pthreads.c
     22 **
     23 **  Function    pthreads version of Linux GKI. This version is used for
     24 **              settop projects that already use pthreads and not pth.
     25 **
     26 *****************************************************************************/
     27 #include "bt_target.h"
     28 
     29 #include <assert.h>
     30 #include <sys/times.h>
     31 
     32 #include "gki_int.h"
     33 #include "bt_utils.h"
     34 
     35 #define LOG_TAG "GKI_LINUX"
     36 
     37 #include <utils/Log.h>
     38 #include <hardware/bluetooth.h>
     39 
     40 /*****************************************************************************
     41 **  Constants & Macros
     42 ******************************************************************************/
     43 
     44 #define SCHED_NORMAL 0
     45 #define SCHED_FIFO 1
     46 #define SCHED_RR 2
     47 #define SCHED_BATCH 3
     48 
     49 #define NANOSEC_PER_MILLISEC    1000000
     50 #define NSEC_PER_SEC            (1000 * NANOSEC_PER_MILLISEC)
     51 #define USEC_PER_SEC            1000000
     52 #define NSEC_PER_USEC           1000
     53 
     54 #define WAKE_LOCK_ID "bluedroid_timer"
     55 
     56 #if GKI_DYNAMIC_MEMORY == FALSE
     57 tGKI_CB   gki_cb;
     58 #endif
     59 
     60 #ifndef GKI_SHUTDOWN_EVT
     61 #define GKI_SHUTDOWN_EVT    APPL_EVT_7
     62 #endif
     63 
     64 /*****************************************************************************
     65 **  Local type definitions
     66 ******************************************************************************/
     67 
     68 typedef struct
     69 {
     70     UINT8 task_id;          /* GKI task id */
     71     TASKPTR task_entry;     /* Task entry function*/
     72     UINT32 params;          /* Extra params to pass to task entry function */
     73 } gki_pthread_info_t;
     74 
     75 // Alarm service structure used to pass up via JNI to the bluetooth
     76 // app in order to create a wakeable Alarm.
     77 typedef struct
     78 {
     79     UINT32 ticks_scheduled;
     80     UINT64 timer_started_us;
     81     UINT64 timer_last_expired_us;
     82     bool wakelock;
     83 } alarm_service_t;
     84 
     85 /*****************************************************************************
     86 **  Static variables
     87 ******************************************************************************/
     88 
     89 gki_pthread_info_t gki_pthread_info[GKI_MAX_TASKS];
     90 
     91 // Only a single alarm is used to wake bluedroid.
     92 // NOTE: Must be manipulated with the GKI_disable() lock held.
     93 static alarm_service_t alarm_service;
     94 
     95 static timer_t posix_timer;
     96 static bool timer_created;
     97 
     98 
     99 /*****************************************************************************
    100 **  Externs
    101 ******************************************************************************/
    102 
    103 extern bt_os_callouts_t *bt_os_callouts;
    104 
    105 /*****************************************************************************
    106 **  Functions
    107 ******************************************************************************/
    108 
    109 static UINT64 now_us()
    110 {
    111     struct timespec ts_now;
    112     clock_gettime(CLOCK_BOOTTIME, &ts_now);
    113     return ((UINT64)ts_now.tv_sec * USEC_PER_SEC) + ((UINT64)ts_now.tv_nsec / NSEC_PER_USEC);
    114 }
    115 
    116 static bool set_nonwake_alarm(UINT64 delay_millis)
    117 {
    118     if (!timer_created)
    119     {
    120         ALOGE("%s timer is not available, not setting timer for %llums", __func__, delay_millis);
    121         return false;
    122     }
    123 
    124     const UINT64 now = now_us();
    125     alarm_service.timer_started_us = now;
    126 
    127     UINT64 prev_timer_delay = 0;
    128     if (alarm_service.timer_last_expired_us)
    129         prev_timer_delay = now - alarm_service.timer_last_expired_us;
    130 
    131     UINT64 delay_micros = delay_millis * 1000;
    132     if (delay_micros > prev_timer_delay)
    133         delay_micros -= prev_timer_delay;
    134     else
    135         delay_micros = 1;
    136 
    137     struct itimerspec new_value;
    138     memset(&new_value, 0, sizeof(new_value));
    139     new_value.it_value.tv_sec = (delay_micros / USEC_PER_SEC);
    140     new_value.it_value.tv_nsec = (delay_micros % USEC_PER_SEC) * NSEC_PER_USEC;
    141     if (timer_settime(posix_timer, 0, &new_value, NULL) == -1)
    142     {
    143         ALOGE("%s unable to set timer: %s", __func__, strerror(errno));
    144         return false;
    145     }
    146     return true;
    147 }
    148 
    149 /** Callback from Java thread after alarm from AlarmService fires. */
    150 static void bt_alarm_cb(void *data)
    151 {
    152     UINT32 ticks_taken = 0;
    153 
    154     alarm_service.timer_last_expired_us = now_us();
    155     if (alarm_service.timer_last_expired_us > alarm_service.timer_started_us)
    156     {
    157         ticks_taken = GKI_MS_TO_TICKS((alarm_service.timer_last_expired_us
    158                                        - alarm_service.timer_started_us) / 1000);
    159     } else {
    160         // this could happen on some platform
    161         ALOGE("%s now_us %lld less than %lld", __func__, alarm_service.timer_last_expired_us,
    162               alarm_service.timer_started_us);
    163     }
    164 
    165     GKI_timer_update(ticks_taken > alarm_service.ticks_scheduled
    166                    ? ticks_taken : alarm_service.ticks_scheduled);
    167 }
    168 
    169 /** NOTE: This is only called on init and may be called without the GKI_disable()
    170   * lock held.
    171   */
    172 static void alarm_service_init()
    173 {
    174     alarm_service.ticks_scheduled = 0;
    175     alarm_service.timer_started_us = 0;
    176     alarm_service.timer_last_expired_us = 0;
    177     alarm_service.wakelock = FALSE;
    178     raise_priority_a2dp(TASK_JAVA_ALARM);
    179 }
    180 
    181 /** Requests an alarm from AlarmService to fire when the next
    182   * timer in the timer queue is set to expire. Only takes a wakelock
    183   * if the timer tick expiration is a short interval in the future
    184   * and releases the wakelock if the timer is a longer interval
    185   * or if there are no more timers in the queue.
    186   *
    187   * NOTE: Must be called with GKI_disable() lock held.
    188   */
    189 void alarm_service_reschedule()
    190 {
    191     int32_t ticks_till_next_exp = GKI_ready_to_sleep();
    192 
    193     assert(ticks_till_next_exp >= 0);
    194     alarm_service.ticks_scheduled = ticks_till_next_exp;
    195 
    196     // No more timers remaining. Release wakelock if we're holding one.
    197     if (ticks_till_next_exp == 0)
    198     {
    199         alarm_service.timer_last_expired_us = 0;
    200         alarm_service.timer_started_us = 0;
    201         if (alarm_service.wakelock)
    202         {
    203             ALOGV("%s releasing wake lock.", __func__);
    204             alarm_service.wakelock = false;
    205             int rc = bt_os_callouts->release_wake_lock(WAKE_LOCK_ID);
    206             if (rc != BT_STATUS_SUCCESS)
    207             {
    208                 ALOGE("%s unable to release wake lock with no timers: %d", __func__, rc);
    209             }
    210         }
    211         ALOGV("%s no more alarms.", __func__);
    212         return;
    213     }
    214 
    215     UINT64 ticks_in_millis = GKI_TICKS_TO_MS(ticks_till_next_exp);
    216     if (ticks_in_millis <= GKI_TIMER_INTERVAL_FOR_WAKELOCK)
    217     {
    218         // The next deadline is close, just take a wakelock and set a regular (non-wake) timer.
    219         if (!alarm_service.wakelock)
    220         {
    221             int rc = bt_os_callouts->acquire_wake_lock(WAKE_LOCK_ID);
    222             if (rc != BT_STATUS_SUCCESS)
    223             {
    224                 ALOGE("%s unable to acquire wake lock: %d", __func__, rc);
    225                 return;
    226             }
    227             alarm_service.wakelock = true;
    228         }
    229         ALOGV("%s acquired wake lock, setting short alarm (%lldms).", __func__, ticks_in_millis);
    230 
    231         if (!set_nonwake_alarm(ticks_in_millis))
    232         {
    233             ALOGE("%s unable to set short alarm.", __func__);
    234         }
    235     } else {
    236         // The deadline is far away, set a wake alarm and release wakelock if we're holding it.
    237         alarm_service.timer_started_us = now_us();
    238         alarm_service.timer_last_expired_us = 0;
    239         if (!bt_os_callouts->set_wake_alarm(ticks_in_millis, true, bt_alarm_cb, &alarm_service))
    240         {
    241             ALOGE("%s unable to set long alarm, releasing wake lock anyway.", __func__);
    242         } else {
    243             ALOGV("%s set long alarm (%lldms), releasing wake lock.", __func__, ticks_in_millis);
    244         }
    245 
    246         if (alarm_service.wakelock)
    247         {
    248             alarm_service.wakelock = false;
    249             bt_os_callouts->release_wake_lock(WAKE_LOCK_ID);
    250         }
    251     }
    252 }
    253 
    254 
    255 /*****************************************************************************
    256 **
    257 ** Function        gki_task_entry
    258 **
    259 ** Description     GKI pthread callback
    260 **
    261 ** Returns         void
    262 **
    263 *******************************************************************************/
    264 static void gki_task_entry(UINT32 params)
    265 {
    266     gki_pthread_info_t *p_pthread_info = (gki_pthread_info_t *)params;
    267     gki_cb.os.thread_id[p_pthread_info->task_id] = pthread_self();
    268 
    269     prctl(PR_SET_NAME, (unsigned long)gki_cb.com.OSTName[p_pthread_info->task_id], 0, 0, 0);
    270 
    271     ALOGI("gki_task_entry task_id=%i [%s] starting\n", p_pthread_info->task_id,
    272                 gki_cb.com.OSTName[p_pthread_info->task_id]);
    273 
    274     /* Call the actual thread entry point */
    275     (p_pthread_info->task_entry)(p_pthread_info->params);
    276 
    277     ALOGI("gki_task task_id=%i [%s] terminating\n", p_pthread_info->task_id,
    278                 gki_cb.com.OSTName[p_pthread_info->task_id]);
    279 
    280     pthread_exit(0);    /* GKI tasks have no return value */
    281 }
    282 
    283 /*******************************************************************************
    284 **
    285 ** Function         GKI_init
    286 **
    287 ** Description      This function is called once at startup to initialize
    288 **                  all the timer structures.
    289 **
    290 ** Returns          void
    291 **
    292 *******************************************************************************/
    293 
    294 void GKI_init(void)
    295 {
    296     pthread_mutexattr_t attr;
    297     tGKI_OS             *p_os;
    298 
    299     memset (&gki_cb, 0, sizeof (gki_cb));
    300 
    301     gki_buffer_init();
    302     gki_timers_init();
    303     alarm_service_init();
    304 
    305     gki_cb.com.OSTicks = (UINT32) times(0);
    306 
    307     pthread_mutexattr_init(&attr);
    308 
    309 #ifndef __CYGWIN__
    310     pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
    311 #endif
    312     p_os = &gki_cb.os;
    313     pthread_mutex_init(&p_os->GKI_mutex, &attr);
    314     /* pthread_mutex_init(&GKI_sched_mutex, NULL); */
    315 #if (GKI_DEBUG == TRUE)
    316     pthread_mutex_init(&p_os->GKI_trace_mutex, NULL);
    317 #endif
    318     /* pthread_mutex_init(&thread_delay_mutex, NULL); */  /* used in GKI_delay */
    319     /* pthread_cond_init (&thread_delay_cond, NULL); */
    320 
    321     struct sigevent sigevent;
    322     memset(&sigevent, 0, sizeof(sigevent));
    323     sigevent.sigev_notify = SIGEV_THREAD;
    324     sigevent.sigev_notify_function = (void (*)(union sigval))bt_alarm_cb;
    325     sigevent.sigev_value.sival_ptr = NULL;
    326     if (timer_create(CLOCK_REALTIME, &sigevent, &posix_timer) == -1) {
    327         ALOGE("%s unable to create POSIX timer: %s", __func__, strerror(errno));
    328         timer_created = false;
    329     } else {
    330         timer_created = true;
    331     }
    332 }
    333 
    334 
    335 /*******************************************************************************
    336 **
    337 ** Function         GKI_get_os_tick_count
    338 **
    339 ** Description      This function is called to retrieve the native OS system tick.
    340 **
    341 ** Returns          Tick count of native OS.
    342 **
    343 *******************************************************************************/
    344 UINT32 GKI_get_os_tick_count(void)
    345 {
    346     return gki_cb.com.OSTicks;
    347 }
    348 
    349 /*******************************************************************************
    350 **
    351 ** Function         GKI_create_task
    352 **
    353 ** Description      This function is called to create a new OSS task.
    354 **
    355 ** Parameters:      task_entry  - (input) pointer to the entry function of the task
    356 **                  task_id     - (input) Task id is mapped to priority
    357 **                  taskname    - (input) name given to the task
    358 **                  stack       - (input) pointer to the top of the stack (highest memory location)
    359 **                  stacksize   - (input) size of the stack allocated for the task
    360 **
    361 ** Returns          GKI_SUCCESS if all OK, GKI_FAILURE if any problem
    362 **
    363 ** NOTE             This function take some parameters that may not be needed
    364 **                  by your particular OS. They are here for compatability
    365 **                  of the function prototype.
    366 **
    367 *******************************************************************************/
    368 UINT8 GKI_create_task (TASKPTR task_entry, UINT8 task_id, INT8 *taskname, UINT16 *stack, UINT16 stacksize)
    369 {
    370     UINT16  i;
    371     UINT8   *p;
    372     struct sched_param param;
    373     int policy, ret = 0;
    374     pthread_attr_t attr1;
    375     UNUSED(stack);
    376     UNUSED(stacksize);
    377 
    378     GKI_TRACE( "GKI_create_task %x %d %s %x %d", (int)task_entry, (int)task_id,
    379             (char*) taskname, (int) stack, (int)stacksize);
    380 
    381     if (task_id >= GKI_MAX_TASKS)
    382     {
    383         ALOGE("Error! task ID > max task allowed");
    384         return (GKI_FAILURE);
    385     }
    386 
    387 
    388     gki_cb.com.OSRdyTbl[task_id]    = TASK_READY;
    389     gki_cb.com.OSTName[task_id]     = taskname;
    390     gki_cb.com.OSWaitTmr[task_id]   = 0;
    391     gki_cb.com.OSWaitEvt[task_id]   = 0;
    392 
    393     /* Initialize mutex and condition variable objects for events and timeouts */
    394     pthread_condattr_t cond_attr;
    395     pthread_condattr_init(&cond_attr);
    396     pthread_condattr_setclock(&cond_attr, CLOCK_MONOTONIC);
    397 
    398     pthread_mutex_init(&gki_cb.os.thread_evt_mutex[task_id], NULL);
    399     pthread_cond_init (&gki_cb.os.thread_evt_cond[task_id], &cond_attr);
    400     pthread_mutex_init(&gki_cb.os.thread_timeout_mutex[task_id], NULL);
    401     pthread_cond_init (&gki_cb.os.thread_timeout_cond[task_id], NULL);
    402 
    403     pthread_attr_init(&attr1);
    404     /* by default, pthread creates a joinable thread */
    405 #if ( FALSE == GKI_PTHREAD_JOINABLE )
    406     pthread_attr_setdetachstate(&attr1, PTHREAD_CREATE_DETACHED);
    407 
    408     GKI_TRACE("GKI creating task %i\n", task_id);
    409 #else
    410     GKI_TRACE("GKI creating JOINABLE task %i\n", task_id);
    411 #endif
    412 
    413     /* On Android, the new tasks starts running before 'gki_cb.os.thread_id[task_id]' is initialized */
    414     /* Pass task_id to new task so it can initialize gki_cb.os.thread_id[task_id] for it calls GKI_wait */
    415     gki_pthread_info[task_id].task_id = task_id;
    416     gki_pthread_info[task_id].task_entry = task_entry;
    417     gki_pthread_info[task_id].params = 0;
    418 
    419     ret = pthread_create( &gki_cb.os.thread_id[task_id],
    420               &attr1,
    421               (void *)gki_task_entry,
    422               &gki_pthread_info[task_id]);
    423 
    424     if (ret != 0)
    425     {
    426          ALOGE("pthread_create failed(%d), %s!", ret, taskname);
    427          return GKI_FAILURE;
    428     }
    429 
    430     if(pthread_getschedparam(gki_cb.os.thread_id[task_id], &policy, &param)==0)
    431      {
    432 #if (GKI_LINUX_BASE_POLICY!=GKI_SCHED_NORMAL)
    433 #if defined(PBS_SQL_TASK)
    434          if (task_id == PBS_SQL_TASK)
    435          {
    436              GKI_TRACE("PBS SQL lowest priority task");
    437              policy = SCHED_NORMAL;
    438          }
    439          else
    440 #endif
    441 #endif
    442          {
    443              /* check if define in gki_int.h is correct for this compile environment! */
    444              policy = GKI_LINUX_BASE_POLICY;
    445 #if (GKI_LINUX_BASE_POLICY != GKI_SCHED_NORMAL)
    446              param.sched_priority = GKI_LINUX_BASE_PRIORITY - task_id - 2;
    447 #else
    448              param.sched_priority = 0;
    449 #endif
    450          }
    451          pthread_setschedparam(gki_cb.os.thread_id[task_id], policy, &param);
    452      }
    453 
    454     GKI_TRACE( "Leaving GKI_create_task %x %d %x %s %x %d\n",
    455               (int)task_entry,
    456               (int)task_id,
    457               (int)gki_cb.os.thread_id[task_id],
    458               (char*)taskname,
    459               (int)stack,
    460               (int)stacksize);
    461 
    462     return (GKI_SUCCESS);
    463 }
    464 
    465 void GKI_destroy_task(UINT8 task_id)
    466 {
    467 #if ( FALSE == GKI_PTHREAD_JOINABLE )
    468         int i = 0;
    469 #else
    470         int result;
    471 #endif
    472     if (gki_cb.com.OSRdyTbl[task_id] != TASK_DEAD)
    473     {
    474         gki_cb.com.OSRdyTbl[task_id] = TASK_DEAD;
    475 
    476         /* paranoi settings, make sure that we do not execute any mailbox events */
    477         gki_cb.com.OSWaitEvt[task_id] &= ~(TASK_MBOX_0_EVT_MASK|TASK_MBOX_1_EVT_MASK|
    478                                             TASK_MBOX_2_EVT_MASK|TASK_MBOX_3_EVT_MASK);
    479 
    480 #if (GKI_NUM_TIMERS > 0)
    481         gki_cb.com.OSTaskTmr0R[task_id] = 0;
    482         gki_cb.com.OSTaskTmr0 [task_id] = 0;
    483 #endif
    484 
    485 #if (GKI_NUM_TIMERS > 1)
    486         gki_cb.com.OSTaskTmr1R[task_id] = 0;
    487         gki_cb.com.OSTaskTmr1 [task_id] = 0;
    488 #endif
    489 
    490 #if (GKI_NUM_TIMERS > 2)
    491         gki_cb.com.OSTaskTmr2R[task_id] = 0;
    492         gki_cb.com.OSTaskTmr2 [task_id] = 0;
    493 #endif
    494 
    495 #if (GKI_NUM_TIMERS > 3)
    496         gki_cb.com.OSTaskTmr3R[task_id] = 0;
    497         gki_cb.com.OSTaskTmr3 [task_id] = 0;
    498 #endif
    499 
    500         GKI_send_event(task_id, EVENT_MASK(GKI_SHUTDOWN_EVT));
    501 
    502 #if ( FALSE == GKI_PTHREAD_JOINABLE )
    503         i = 0;
    504 
    505         while ((gki_cb.com.OSWaitEvt[task_id] != 0) && (++i < 10))
    506             usleep(100 * 1000);
    507 #else
    508         result = pthread_join( gki_cb.os.thread_id[task_id], NULL );
    509         if ( result < 0 )
    510         {
    511             ALOGE( "pthread_join() FAILED: result: %d", result );
    512         }
    513 #endif
    514         GKI_exit_task(task_id);
    515         ALOGI( "GKI_shutdown(): task [%s] terminated\n", gki_cb.com.OSTName[task_id]);
    516     }
    517 }
    518 
    519 
    520 /*******************************************************************************
    521 **
    522 ** Function         GKI_task_self_cleanup
    523 **
    524 ** Description      This function is used in the case when the calling thread
    525 **                  is exiting itself. The GKI_destroy_task function can not be
    526 **                  used in this case due to the pthread_join call. The function
    527 **                  cleans up GKI control block associated to the terminating
    528 **                  thread.
    529 **
    530 ** Parameters:      task_id     - (input) Task id is used for sanity check to
    531 **                                 make sure the calling thread is in the right
    532 **                                 context.
    533 **
    534 ** Returns          None
    535 **
    536 *******************************************************************************/
    537 void GKI_task_self_cleanup(UINT8 task_id)
    538 {
    539     UINT8 my_task_id = GKI_get_taskid();
    540 
    541     if (task_id != my_task_id)
    542     {
    543         ALOGE("%s: Wrong context - current task %d is not the given task id %d",\
    544                       __FUNCTION__, my_task_id, task_id);
    545         return;
    546     }
    547 
    548     if (gki_cb.com.OSRdyTbl[task_id] != TASK_DEAD)
    549     {
    550         /* paranoi settings, make sure that we do not execute any mailbox events */
    551         gki_cb.com.OSWaitEvt[task_id] &= ~(TASK_MBOX_0_EVT_MASK|TASK_MBOX_1_EVT_MASK|
    552                                             TASK_MBOX_2_EVT_MASK|TASK_MBOX_3_EVT_MASK);
    553 
    554 #if (GKI_NUM_TIMERS > 0)
    555         gki_cb.com.OSTaskTmr0R[task_id] = 0;
    556         gki_cb.com.OSTaskTmr0 [task_id] = 0;
    557 #endif
    558 
    559 #if (GKI_NUM_TIMERS > 1)
    560         gki_cb.com.OSTaskTmr1R[task_id] = 0;
    561         gki_cb.com.OSTaskTmr1 [task_id] = 0;
    562 #endif
    563 
    564 #if (GKI_NUM_TIMERS > 2)
    565         gki_cb.com.OSTaskTmr2R[task_id] = 0;
    566         gki_cb.com.OSTaskTmr2 [task_id] = 0;
    567 #endif
    568 
    569 #if (GKI_NUM_TIMERS > 3)
    570         gki_cb.com.OSTaskTmr3R[task_id] = 0;
    571         gki_cb.com.OSTaskTmr3 [task_id] = 0;
    572 #endif
    573 
    574         GKI_exit_task(task_id);
    575 
    576         /* Calling pthread_detach here to mark the thread as detached.
    577            Once the thread terminates, the system can reclaim its resources
    578            without waiting for another thread to join with.
    579         */
    580         pthread_detach(gki_cb.os.thread_id[task_id]);
    581     }
    582 }
    583 
    584 /*******************************************************************************
    585 **
    586 ** Function         GKI_shutdown
    587 **
    588 ** Description      shutdowns the GKI tasks/threads in from max task id to 0 and frees
    589 **                  pthread resources!
    590 **                  IMPORTANT: in case of join method, GKI_shutdown must be called outside
    591 **                  a GKI thread context!
    592 **
    593 ** Returns          void
    594 **
    595 *******************************************************************************/
    596 
    597 void GKI_shutdown(void)
    598 {
    599     UINT8 task_id;
    600 #if ( FALSE == GKI_PTHREAD_JOINABLE )
    601     int i = 0;
    602 #else
    603     int result;
    604 #endif
    605 
    606 #ifdef GKI_USE_DEFERED_ALLOC_BUF_POOLS
    607     gki_dealloc_free_queue();
    608 #endif
    609 
    610     /* release threads and set as TASK_DEAD. going from low to high priority fixes
    611      * GKI_exception problem due to btu->hci sleep request events  */
    612     for (task_id = GKI_MAX_TASKS; task_id > 0; task_id--)
    613     {
    614         if (gki_cb.com.OSRdyTbl[task_id - 1] != TASK_DEAD)
    615         {
    616             gki_cb.com.OSRdyTbl[task_id - 1] = TASK_DEAD;
    617 
    618             /* paranoi settings, make sure that we do not execute any mailbox events */
    619             gki_cb.com.OSWaitEvt[task_id-1] &= ~(TASK_MBOX_0_EVT_MASK|TASK_MBOX_1_EVT_MASK|
    620                                                 TASK_MBOX_2_EVT_MASK|TASK_MBOX_3_EVT_MASK);
    621             GKI_send_event(task_id - 1, EVENT_MASK(GKI_SHUTDOWN_EVT));
    622 
    623 #if ( FALSE == GKI_PTHREAD_JOINABLE )
    624             i = 0;
    625 
    626             while ((gki_cb.com.OSWaitEvt[task_id - 1] != 0) && (++i < 10))
    627                 usleep(100 * 1000);
    628 #else
    629             result = pthread_join( gki_cb.os.thread_id[task_id-1], NULL );
    630 
    631             if ( result < 0 )
    632             {
    633                 ALOGE( "pthread_join() FAILED: result: %d", result );
    634             }
    635 #endif
    636             GKI_exit_task(task_id - 1);
    637         }
    638     }
    639 
    640     /* Destroy mutex and condition variable objects */
    641     pthread_mutex_destroy(&gki_cb.os.GKI_mutex);
    642 
    643     /*    pthread_mutex_destroy(&GKI_sched_mutex); */
    644 #if (GKI_DEBUG == TRUE)
    645     pthread_mutex_destroy(&gki_cb.os.GKI_trace_mutex);
    646 #endif
    647     /*    pthread_mutex_destroy(&thread_delay_mutex);
    648      pthread_cond_destroy (&thread_delay_cond); */
    649 #if ( FALSE == GKI_PTHREAD_JOINABLE )
    650     i = 0;
    651 #endif
    652 
    653     if (timer_created) {
    654         timer_delete(posix_timer);
    655         timer_created = false;
    656     }
    657 }
    658 
    659 /*****************************************************************************
    660 **
    661 ** Function        gki_set_timer_scheduling
    662 **
    663 ** Description     helper function to set scheduling policy and priority of btdl
    664 **
    665 ** Returns         void
    666 **
    667 *******************************************************************************/
    668 
    669 static void gki_set_timer_scheduling( void )
    670 {
    671     pid_t               main_pid = getpid();
    672     struct sched_param  param;
    673     int                 policy;
    674 
    675     policy = sched_getscheduler(main_pid);
    676 
    677     if ( policy != -1 )
    678     {
    679         GKI_TRACE("gki_set_timer_scheduling(()::scheduler current policy: %d", policy);
    680 
    681         /* ensure highest priority in the system + 2 to allow space for read threads */
    682         param.sched_priority = GKI_LINUX_TIMER_TICK_PRIORITY;
    683 
    684         if ( 0!=sched_setscheduler(main_pid, GKI_LINUX_TIMER_POLICY, &param ) )
    685         {
    686             GKI_TRACE("sched_setscheduler() failed with error: %d", errno);
    687         }
    688     }
    689     else
    690     {
    691         GKI_TRACE( "getscheduler failed: %d", errno);
    692     }
    693 }
    694 
    695 
    696 /*****************************************************************************
    697 **
    698 ** Function        GKI_run
    699 **
    700 ** Description     Main GKI loop
    701 **
    702 ** Returns
    703 **
    704 *******************************************************************************/
    705 
    706 void GKI_run(void)
    707 {
    708     /* adjust btld scheduling scheme now */
    709     gki_set_timer_scheduling();
    710     GKI_TRACE( "GKI_run(): Start/Stop GKI_timer_update_registered!" );
    711 }
    712 
    713 
    714 /*******************************************************************************
    715 **
    716 ** Function         GKI_stop
    717 **
    718 ** Description      This function is called to stop
    719 **                  the tasks and timers when the system is being stopped
    720 **
    721 ** Returns          void
    722 **
    723 ** NOTE             This function is NOT called by the Broadcom stack and
    724 **                  profiles. If you want to use it in your own implementation,
    725 **                  put specific code here.
    726 **
    727 *******************************************************************************/
    728 
    729 void GKI_stop (void)
    730 {
    731     UINT8 task_id;
    732 
    733     /*  gki_queue_timer_cback(FALSE); */
    734     /* TODO - add code here if needed*/
    735 
    736     for(task_id = 0; task_id<GKI_MAX_TASKS; task_id++)
    737     {
    738         if(gki_cb.com.OSRdyTbl[task_id] != TASK_DEAD)
    739         {
    740             GKI_exit_task(task_id);
    741         }
    742     }
    743 }
    744 
    745 
    746 /*******************************************************************************
    747 **
    748 ** Function         GKI_wait
    749 **
    750 ** Description      This function is called by tasks to wait for a specific
    751 **                  event or set of events. The task may specify the duration
    752 **                  that it wants to wait for, or 0 if infinite.
    753 **
    754 ** Parameters:      flag -    (input) the event or set of events to wait for
    755 **                  timeout - (input) the duration that the task wants to wait
    756 **                                    for the specific events (in system ticks)
    757 **
    758 **
    759 ** Returns          the event mask of received events or zero if timeout
    760 **
    761 *******************************************************************************/
    762 UINT16 GKI_wait (UINT16 flag, UINT32 timeout)
    763 {
    764     UINT16 evt;
    765     UINT8 rtask;
    766     struct timespec abstime = { 0, 0 };
    767 
    768     int sec;
    769     int nano_sec;
    770 
    771     rtask = GKI_get_taskid();
    772 
    773     GKI_TRACE("GKI_wait %d %x %d", (int)rtask, (int)flag, (int)timeout);
    774 
    775     gki_cb.com.OSWaitForEvt[rtask] = flag;
    776 
    777     /* protect OSWaitEvt[rtask] from modification from an other thread */
    778     pthread_mutex_lock(&gki_cb.os.thread_evt_mutex[rtask]);
    779 
    780     if (!(gki_cb.com.OSWaitEvt[rtask] & flag))
    781     {
    782         if (timeout)
    783         {
    784             clock_gettime(CLOCK_MONOTONIC, &abstime);
    785 
    786             /* add timeout */
    787             sec = timeout / 1000;
    788             nano_sec = (timeout % 1000) * NANOSEC_PER_MILLISEC;
    789             abstime.tv_nsec += nano_sec;
    790             if (abstime.tv_nsec > NSEC_PER_SEC)
    791             {
    792                 abstime.tv_sec += (abstime.tv_nsec / NSEC_PER_SEC);
    793                 abstime.tv_nsec = abstime.tv_nsec % NSEC_PER_SEC;
    794             }
    795             abstime.tv_sec += sec;
    796 
    797             pthread_cond_timedwait(&gki_cb.os.thread_evt_cond[rtask],
    798                     &gki_cb.os.thread_evt_mutex[rtask], &abstime);
    799         }
    800         else
    801         {
    802             pthread_cond_wait(&gki_cb.os.thread_evt_cond[rtask], &gki_cb.os.thread_evt_mutex[rtask]);
    803         }
    804 
    805         /* TODO: check, this is probably neither not needed depending on phtread_cond_wait() implmentation,
    806          e.g. it looks like it is implemented as a counter in which case multiple cond_signal
    807          should NOT be lost! */
    808 
    809         /* we are waking up after waiting for some events, so refresh variables
    810            no need to call GKI_disable() here as we know that we will have some events as we've been waking
    811            up after condition pending or timeout */
    812 
    813         if (gki_cb.com.OSTaskQFirst[rtask][0])
    814             gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_0_EVT_MASK;
    815         if (gki_cb.com.OSTaskQFirst[rtask][1])
    816             gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_1_EVT_MASK;
    817         if (gki_cb.com.OSTaskQFirst[rtask][2])
    818             gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_2_EVT_MASK;
    819         if (gki_cb.com.OSTaskQFirst[rtask][3])
    820             gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_3_EVT_MASK;
    821 
    822         if (gki_cb.com.OSRdyTbl[rtask] == TASK_DEAD)
    823         {
    824             gki_cb.com.OSWaitEvt[rtask] = 0;
    825             /* unlock thread_evt_mutex as pthread_cond_wait() does auto lock when cond is met */
    826             pthread_mutex_unlock(&gki_cb.os.thread_evt_mutex[rtask]);
    827             return (EVENT_MASK(GKI_SHUTDOWN_EVT));
    828         }
    829     }
    830 
    831     /* Clear the wait for event mask */
    832     gki_cb.com.OSWaitForEvt[rtask] = 0;
    833 
    834     /* Return only those bits which user wants... */
    835     evt = gki_cb.com.OSWaitEvt[rtask] & flag;
    836 
    837     /* Clear only those bits which user wants... */
    838     gki_cb.com.OSWaitEvt[rtask] &= ~flag;
    839 
    840     /* unlock thread_evt_mutex as pthread_cond_wait() does auto lock mutex when cond is met */
    841     pthread_mutex_unlock(&gki_cb.os.thread_evt_mutex[rtask]);
    842 
    843     GKI_TRACE("GKI_wait %d %x %d %x done", (int)rtask, (int)flag, (int)timeout, (int)evt);
    844     return (evt);
    845 }
    846 
    847 
    848 /*******************************************************************************
    849 **
    850 ** Function         GKI_delay
    851 **
    852 ** Description      This function is called by tasks to sleep unconditionally
    853 **                  for a specified amount of time. The duration is in milliseconds
    854 **
    855 ** Parameters:      timeout -    (input) the duration in milliseconds
    856 **
    857 ** Returns          void
    858 **
    859 *******************************************************************************/
    860 
    861 void GKI_delay (UINT32 timeout)
    862 {
    863     UINT8 rtask = GKI_get_taskid();
    864     struct timespec delay;
    865     int err;
    866 
    867     GKI_TRACE("GKI_delay %d %d", (int)rtask, (int)timeout);
    868 
    869     delay.tv_sec = timeout / 1000;
    870     delay.tv_nsec = 1000 * 1000 * (timeout%1000);
    871 
    872     /* [u]sleep can't be used because it uses SIGALRM */
    873 
    874     do {
    875         err = nanosleep(&delay, &delay);
    876     } while (err < 0 && errno ==EINTR);
    877 
    878     /* Check if task was killed while sleeping */
    879 
    880      /* NOTE : if you do not implement task killing, you do not need this check */
    881 
    882     if (rtask && gki_cb.com.OSRdyTbl[rtask] == TASK_DEAD)
    883     {
    884     }
    885 
    886     GKI_TRACE("GKI_delay %d %d done", (int)rtask, (int)timeout);
    887 
    888     return;
    889 }
    890 
    891 
    892 /*******************************************************************************
    893 **
    894 ** Function         GKI_send_event
    895 **
    896 ** Description      This function is called by tasks to send events to other
    897 **                  tasks. Tasks can also send events to themselves.
    898 **
    899 ** Parameters:      task_id -  (input) The id of the task to which the event has to
    900 **                  be sent
    901 **                  event   -  (input) The event that has to be sent
    902 **
    903 **
    904 ** Returns          GKI_SUCCESS if all OK, else GKI_FAILURE
    905 **
    906 *******************************************************************************/
    907 
    908 UINT8 GKI_send_event (UINT8 task_id, UINT16 event)
    909 {
    910     GKI_TRACE("GKI_send_event %d %x", task_id, event);
    911 
    912     if (task_id < GKI_MAX_TASKS)
    913     {
    914         /* protect OSWaitEvt[task_id] from manipulation in GKI_wait() */
    915         pthread_mutex_lock(&gki_cb.os.thread_evt_mutex[task_id]);
    916 
    917         /* Set the event bit */
    918         gki_cb.com.OSWaitEvt[task_id] |= event;
    919 
    920         pthread_cond_signal(&gki_cb.os.thread_evt_cond[task_id]);
    921 
    922         pthread_mutex_unlock(&gki_cb.os.thread_evt_mutex[task_id]);
    923 
    924         GKI_TRACE("GKI_send_event %d %x done", task_id, event);
    925         return ( GKI_SUCCESS );
    926     }
    927     GKI_TRACE("############## GKI_send_event FAILED!! ##################");
    928     return (GKI_FAILURE);
    929 }
    930 
    931 
    932 /*******************************************************************************
    933 **
    934 ** Function         GKI_get_taskid
    935 **
    936 ** Description      This function gets the currently running task ID.
    937 **
    938 ** Returns          task ID
    939 **
    940 ** NOTE             The Broadcom upper stack and profiles may run as a single task.
    941 **                  If you only have one GKI task, then you can hard-code this
    942 **                  function to return a '1'. Otherwise, you should have some
    943 **                  OS-specific method to determine the current task.
    944 **
    945 *******************************************************************************/
    946 UINT8 GKI_get_taskid (void)
    947 {
    948     int i;
    949 
    950     pthread_t thread_id = pthread_self( );
    951 
    952     GKI_TRACE("GKI_get_taskid %x", (int)thread_id);
    953 
    954     for (i = 0; i < GKI_MAX_TASKS; i++) {
    955         if (gki_cb.os.thread_id[i] == thread_id) {
    956             //GKI_TRACE("GKI_get_taskid %x %d done", thread_id, i);
    957             return(i);
    958         }
    959     }
    960 
    961     GKI_TRACE("GKI_get_taskid: task id = -1");
    962 
    963     return(-1);
    964 }
    965 
    966 
    967 /*******************************************************************************
    968 **
    969 ** Function         GKI_map_taskname
    970 **
    971 ** Description      This function gets the task name of the taskid passed as arg.
    972 **                  If GKI_MAX_TASKS is passed as arg the currently running task
    973 **                  name is returned
    974 **
    975 ** Parameters:      task_id -  (input) The id of the task whose name is being
    976 **                  sought. GKI_MAX_TASKS is passed to get the name of the
    977 **                  currently running task.
    978 **
    979 ** Returns          pointer to task name
    980 **
    981 ** NOTE             this function needs no customization
    982 **
    983 *******************************************************************************/
    984 
    985 INT8 *GKI_map_taskname (UINT8 task_id)
    986 {
    987     GKI_TRACE("GKI_map_taskname %d", task_id);
    988 
    989     if (task_id < GKI_MAX_TASKS)
    990     {
    991         GKI_TRACE("GKI_map_taskname %d %s done", task_id, gki_cb.com.OSTName[task_id]);
    992          return (gki_cb.com.OSTName[task_id]);
    993     }
    994     else if (task_id == GKI_MAX_TASKS )
    995     {
    996         return (gki_cb.com.OSTName[GKI_get_taskid()]);
    997     }
    998     else
    999     {
   1000         return (INT8*)"BAD";
   1001     }
   1002 }
   1003 
   1004 
   1005 /*******************************************************************************
   1006 **
   1007 ** Function         GKI_enable
   1008 **
   1009 ** Description      This function enables interrupts.
   1010 **
   1011 ** Returns          void
   1012 **
   1013 *******************************************************************************/
   1014 void GKI_enable (void)
   1015 {
   1016     pthread_mutex_unlock(&gki_cb.os.GKI_mutex);
   1017 }
   1018 
   1019 
   1020 /*******************************************************************************
   1021 **
   1022 ** Function         GKI_disable
   1023 **
   1024 ** Description      This function disables interrupts.
   1025 **
   1026 ** Returns          void
   1027 **
   1028 *******************************************************************************/
   1029 
   1030 void GKI_disable (void)
   1031 {
   1032     pthread_mutex_lock(&gki_cb.os.GKI_mutex);
   1033 }
   1034 
   1035 
   1036 /*******************************************************************************
   1037 **
   1038 ** Function         GKI_exception
   1039 **
   1040 ** Description      This function throws an exception.
   1041 **                  This is normally only called for a nonrecoverable error.
   1042 **
   1043 ** Parameters:      code    -  (input) The code for the error
   1044 **                  msg     -  (input) The message that has to be logged
   1045 **
   1046 ** Returns          void
   1047 **
   1048 *******************************************************************************/
   1049 
   1050 void GKI_exception (UINT16 code, char *msg)
   1051 {
   1052     UINT8 task_id;
   1053     int i = 0;
   1054 
   1055     ALOGE( "GKI_exception(): Task State Table");
   1056 
   1057     for(task_id = 0; task_id < GKI_MAX_TASKS; task_id++)
   1058     {
   1059         ALOGE( "TASK ID [%d] task name [%s] state [%d]",
   1060                          task_id,
   1061                          gki_cb.com.OSTName[task_id],
   1062                          gki_cb.com.OSRdyTbl[task_id]);
   1063     }
   1064 
   1065     ALOGE("GKI_exception %d %s", code, msg);
   1066     ALOGE( "********************************************************************");
   1067     ALOGE( "* GKI_exception(): %d %s", code, msg);
   1068     ALOGE( "********************************************************************");
   1069 
   1070 #if 0//(GKI_DEBUG == TRUE)
   1071     GKI_disable();
   1072 
   1073     if (gki_cb.com.ExceptionCnt < GKI_MAX_EXCEPTION)
   1074     {
   1075         EXCEPTION_T *pExp;
   1076 
   1077         pExp =  &gki_cb.com.Exception[gki_cb.com.ExceptionCnt++];
   1078         pExp->type = code;
   1079         pExp->taskid = GKI_get_taskid();
   1080         strncpy((char *)pExp->msg, msg, GKI_MAX_EXCEPTION_MSGLEN - 1);
   1081     }
   1082 
   1083     GKI_enable();
   1084 #endif
   1085 
   1086     GKI_TRACE("GKI_exception %d %s done", code, msg);
   1087     return;
   1088 }
   1089 
   1090 /*******************************************************************************
   1091 **
   1092 ** Function         GKI_os_malloc
   1093 **
   1094 ** Description      This function allocates memory
   1095 **
   1096 ** Parameters:      size -  (input) The size of the memory that has to be
   1097 **                  allocated
   1098 **
   1099 ** Returns          the address of the memory allocated, or NULL if failed
   1100 **
   1101 ** NOTE             This function is called by the Broadcom stack when
   1102 **                  dynamic memory allocation is used. (see dyn_mem.h)
   1103 **
   1104 *******************************************************************************/
   1105 void *GKI_os_malloc (UINT32 size)
   1106 {
   1107     return malloc(size);
   1108 }
   1109 
   1110 /*******************************************************************************
   1111 **
   1112 ** Function         GKI_os_free
   1113 **
   1114 ** Description      This function frees memory
   1115 **
   1116 ** Parameters:      size -  (input) The address of the memory that has to be
   1117 **                  freed
   1118 **
   1119 ** Returns          void
   1120 **
   1121 ** NOTE             This function is NOT called by the Broadcom stack and
   1122 **                  profiles. It is only called from within GKI if dynamic
   1123 **
   1124 *******************************************************************************/
   1125 void GKI_os_free (void *p_mem)
   1126 {
   1127     free(p_mem);
   1128 }
   1129 
   1130 
   1131 /*******************************************************************************
   1132 **
   1133 ** Function         GKI_exit_task
   1134 **
   1135 ** Description      This function is called to stop a GKI task.
   1136 **
   1137 ** Parameters:      task_id  - (input) the id of the task that has to be stopped
   1138 **
   1139 ** Returns          void
   1140 **
   1141 ** NOTE             This function is NOT called by the Broadcom stack and
   1142 **                  profiles. If you want to use it in your own implementation,
   1143 **                  put specific code here to kill a task.
   1144 **
   1145 *******************************************************************************/
   1146 void GKI_exit_task (UINT8 task_id)
   1147 {
   1148     GKI_disable();
   1149     gki_cb.com.OSRdyTbl[task_id] = TASK_DEAD;
   1150 
   1151     /* Destroy mutex and condition variable objects */
   1152     pthread_mutex_destroy(&gki_cb.os.thread_evt_mutex[task_id]);
   1153     pthread_cond_destroy (&gki_cb.os.thread_evt_cond[task_id]);
   1154     pthread_mutex_destroy(&gki_cb.os.thread_timeout_mutex[task_id]);
   1155     pthread_cond_destroy (&gki_cb.os.thread_timeout_cond[task_id]);
   1156 
   1157     GKI_enable();
   1158 
   1159     ALOGI("GKI_exit_task %d done", task_id);
   1160     return;
   1161 }
   1162