15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2009-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/**************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Name gki_linux_pthreads.c 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function pthreads version of Linux GKI. This version is used for 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** settop projects that already use pthreads and not pth. 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 27e6c363badaac6084e84775de59acb3976c80111dMatthew Xie#include "bt_target.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2910aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati#include <assert.h> 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/times.h> 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki_int.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_utils.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define LOG_TAG "GKI_LINUX" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <utils/Log.h> 3810aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati#include <hardware/bluetooth.h> 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Constants & Macros 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SCHED_NORMAL 0 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SCHED_FIFO 1 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SCHED_RR 2 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SCHED_BATCH 3 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 493857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach#define NANOSEC_PER_MILLISEC 1000000 503857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach#define NSEC_PER_SEC (1000 * NANOSEC_PER_MILLISEC) 513857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach#define USEC_PER_SEC 1000000 523857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach#define NSEC_PER_USEC 1000 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5410aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati#define WAKE_LOCK_ID "bluedroid_timer" 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if GKI_DYNAMIC_MEMORY == FALSE 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGKI_CB gki_cb; 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef GKI_SHUTDOWN_EVT 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define GKI_SHUTDOWN_EVT APPL_EVT_7 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Local type definitions 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 task_id; /* GKI task id */ 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project TASKPTR task_entry; /* Task entry function*/ 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 params; /* Extra params to pass to task entry function */ 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} gki_pthread_info_t; 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7510aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati// Alarm service structure used to pass up via JNI to the bluetooth 7610aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati// app in order to create a wakeable Alarm. 773857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbachtypedef struct 783857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach{ 793857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach UINT32 ticks_scheduled; 803857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach UINT64 timer_started_us; 813857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach UINT64 timer_last_expired_us; 8210aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati bool wakelock; 8310aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati} alarm_service_t; 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Static variables 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectgki_pthread_info_t gki_pthread_info[GKI_MAX_TASKS]; 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9110aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati// Only a single alarm is used to wake bluedroid. 9210aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati// NOTE: Must be manipulated with the GKI_disable() lock held. 9310aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavatistatic alarm_service_t alarm_service; 9410aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati 95ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavatistatic timer_t posix_timer; 96ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavatistatic bool timer_created; 97ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavati 983857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Externs 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10310aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavatiextern bt_os_callouts_t *bt_os_callouts; 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Functions 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1093857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbachstatic UINT64 now_us() 1103857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach{ 1113857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach struct timespec ts_now; 1123857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach clock_gettime(CLOCK_BOOTTIME, &ts_now); 11325067c0afc4d3ed95181b91801d3d638d9aa3f8fAndre Eisenbach return ((UINT64)ts_now.tv_sec * USEC_PER_SEC) + ((UINT64)ts_now.tv_nsec / NSEC_PER_USEC); 1143857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach} 115ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavati 1163857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbachstatic bool set_nonwake_alarm(UINT64 delay_millis) 1173857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach{ 1183857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach if (!timer_created) 1193857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach { 1203857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach ALOGE("%s timer is not available, not setting timer for %llums", __func__, delay_millis); 1213857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach return false; 1223857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach } 123ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavati 1243857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach const UINT64 now = now_us(); 1253857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach alarm_service.timer_started_us = now; 1263857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach 1273857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach UINT64 prev_timer_delay = 0; 1283857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach if (alarm_service.timer_last_expired_us) 1293857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach prev_timer_delay = now - alarm_service.timer_last_expired_us; 1303857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach 1313857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach UINT64 delay_micros = delay_millis * 1000; 1323857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach if (delay_micros > prev_timer_delay) 1333857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach delay_micros -= prev_timer_delay; 1343857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach else 1353857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach delay_micros = 1; 1363857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach 1373857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach struct itimerspec new_value; 1383857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach memset(&new_value, 0, sizeof(new_value)); 1393857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach new_value.it_value.tv_sec = (delay_micros / USEC_PER_SEC); 1403857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach new_value.it_value.tv_nsec = (delay_micros % USEC_PER_SEC) * NSEC_PER_USEC; 1413857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach if (timer_settime(posix_timer, 0, &new_value, NULL) == -1) 1423857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach { 1433857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach ALOGE("%s unable to set timer: %s", __func__, strerror(errno)); 1443857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach return false; 1453857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach } 1463857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach return true; 147ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavati} 148ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavati 14910aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati/** Callback from Java thread after alarm from AlarmService fires. */ 1503857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbachstatic void bt_alarm_cb(void *data) 1513857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach{ 152c11e1662d70bb5455a51c7b103cbe19876b58f44Matthew Xie UINT32 ticks_taken = 0; 153c11e1662d70bb5455a51c7b103cbe19876b58f44Matthew Xie 1543857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach alarm_service.timer_last_expired_us = now_us(); 155c11e1662d70bb5455a51c7b103cbe19876b58f44Matthew Xie if (alarm_service.timer_last_expired_us > alarm_service.timer_started_us) 156c11e1662d70bb5455a51c7b103cbe19876b58f44Matthew Xie { 157c11e1662d70bb5455a51c7b103cbe19876b58f44Matthew Xie ticks_taken = GKI_MS_TO_TICKS((alarm_service.timer_last_expired_us 158c11e1662d70bb5455a51c7b103cbe19876b58f44Matthew Xie - alarm_service.timer_started_us) / 1000); 159c11e1662d70bb5455a51c7b103cbe19876b58f44Matthew Xie } else { 160c11e1662d70bb5455a51c7b103cbe19876b58f44Matthew Xie // this could happen on some platform 161c11e1662d70bb5455a51c7b103cbe19876b58f44Matthew Xie ALOGE("%s now_us %lld less than %lld", __func__, alarm_service.timer_last_expired_us, 162c11e1662d70bb5455a51c7b103cbe19876b58f44Matthew Xie alarm_service.timer_started_us); 163c11e1662d70bb5455a51c7b103cbe19876b58f44Matthew Xie } 1643857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach 1653857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach GKI_timer_update(ticks_taken > alarm_service.ticks_scheduled 1663857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach ? ticks_taken : alarm_service.ticks_scheduled); 16710aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati} 16810aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati 16910aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati/** NOTE: This is only called on init and may be called without the GKI_disable() 17010aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati * lock held. 17110aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati */ 1723857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbachstatic void alarm_service_init() 1733857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach{ 1743857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach alarm_service.ticks_scheduled = 0; 1753857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach alarm_service.timer_started_us = 0; 1763857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach alarm_service.timer_last_expired_us = 0; 1773857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach alarm_service.wakelock = FALSE; 178f061e74b81863771b174d1717a6165034dbad8e5Mattias Agren raise_priority_a2dp(TASK_JAVA_ALARM); 17910aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati} 18010aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati 18110aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati/** Requests an alarm from AlarmService to fire when the next 18210aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati * timer in the timer queue is set to expire. Only takes a wakelock 18310aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati * if the timer tick expiration is a short interval in the future 18410aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati * and releases the wakelock if the timer is a longer interval 18510aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati * or if there are no more timers in the queue. 18610aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati * 18710aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati * NOTE: Must be called with GKI_disable() lock held. 18810aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati */ 1893857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbachvoid alarm_service_reschedule() 1903857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach{ 19110aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati int32_t ticks_till_next_exp = GKI_ready_to_sleep(); 19210aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati 19310aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati assert(ticks_till_next_exp >= 0); 1943857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach alarm_service.ticks_scheduled = ticks_till_next_exp; 19510aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati 19610aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati // No more timers remaining. Release wakelock if we're holding one. 1973857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach if (ticks_till_next_exp == 0) 1983857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach { 1993857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach alarm_service.timer_last_expired_us = 0; 2003857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach alarm_service.timer_started_us = 0; 2013857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach if (alarm_service.wakelock) 2023857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach { 203d42dba5420e5636dfcf71f883d73821ac923d549Sharvil Nanavati ALOGV("%s releasing wake lock.", __func__); 20410aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati alarm_service.wakelock = false; 20510aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati int rc = bt_os_callouts->release_wake_lock(WAKE_LOCK_ID); 2063857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach if (rc != BT_STATUS_SUCCESS) 2073857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach { 208d42dba5420e5636dfcf71f883d73821ac923d549Sharvil Nanavati ALOGE("%s unable to release wake lock with no timers: %d", __func__, rc); 20910aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati } 21010aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati } 211d42dba5420e5636dfcf71f883d73821ac923d549Sharvil Nanavati ALOGV("%s no more alarms.", __func__); 21210aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati return; 21310aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati } 21410aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati 2153857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach UINT64 ticks_in_millis = GKI_TICKS_TO_MS(ticks_till_next_exp); 216e6c363badaac6084e84775de59acb3976c80111dMatthew Xie if (ticks_in_millis <= GKI_TIMER_INTERVAL_FOR_WAKELOCK) 2173857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach { 21810aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati // The next deadline is close, just take a wakelock and set a regular (non-wake) timer. 219cf7f6a154aed48659260d391994dc59151be937bAndre Eisenbach if (!alarm_service.wakelock) 2203857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach { 221cf7f6a154aed48659260d391994dc59151be937bAndre Eisenbach int rc = bt_os_callouts->acquire_wake_lock(WAKE_LOCK_ID); 222cf7f6a154aed48659260d391994dc59151be937bAndre Eisenbach if (rc != BT_STATUS_SUCCESS) 223cf7f6a154aed48659260d391994dc59151be937bAndre Eisenbach { 224cf7f6a154aed48659260d391994dc59151be937bAndre Eisenbach ALOGE("%s unable to acquire wake lock: %d", __func__, rc); 225cf7f6a154aed48659260d391994dc59151be937bAndre Eisenbach return; 226cf7f6a154aed48659260d391994dc59151be937bAndre Eisenbach } 227cf7f6a154aed48659260d391994dc59151be937bAndre Eisenbach alarm_service.wakelock = true; 22810aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati } 229d42dba5420e5636dfcf71f883d73821ac923d549Sharvil Nanavati ALOGV("%s acquired wake lock, setting short alarm (%lldms).", __func__, ticks_in_millis); 2303857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach 2313857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach if (!set_nonwake_alarm(ticks_in_millis)) 2323857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach { 233d42dba5420e5636dfcf71f883d73821ac923d549Sharvil Nanavati ALOGE("%s unable to set short alarm.", __func__); 23410aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati } 23510aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati } else { 23610aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati // The deadline is far away, set a wake alarm and release wakelock if we're holding it. 2373857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach alarm_service.timer_started_us = now_us(); 2383857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach alarm_service.timer_last_expired_us = 0; 2393857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach if (!bt_os_callouts->set_wake_alarm(ticks_in_millis, true, bt_alarm_cb, &alarm_service)) 2403857e59a3ab800b47aac6f0b3eee7c65eb20faf5Andre Eisenbach { 241d42dba5420e5636dfcf71f883d73821ac923d549Sharvil Nanavati ALOGE("%s unable to set long alarm, releasing wake lock anyway.", __func__); 24210aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati } else { 243d42dba5420e5636dfcf71f883d73821ac923d549Sharvil Nanavati ALOGV("%s set long alarm (%lldms), releasing wake lock.", __func__, ticks_in_millis); 24410aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati } 245cf7f6a154aed48659260d391994dc59151be937bAndre Eisenbach 246cf7f6a154aed48659260d391994dc59151be937bAndre Eisenbach if (alarm_service.wakelock) 247cf7f6a154aed48659260d391994dc59151be937bAndre Eisenbach { 248cf7f6a154aed48659260d391994dc59151be937bAndre Eisenbach alarm_service.wakelock = false; 249cf7f6a154aed48659260d391994dc59151be937bAndre Eisenbach bt_os_callouts->release_wake_lock(WAKE_LOCK_ID); 250cf7f6a154aed48659260d391994dc59151be937bAndre Eisenbach } 25110aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati } 25210aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati} 25310aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gki_task_entry 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description GKI pthread callback 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2646449e497dfe4d500810c3e7b4d7d056027c33a0eSharvil Nanavatistatic void gki_task_entry(UINT32 params) 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_pthread_info_t *p_pthread_info = (gki_pthread_info_t *)params; 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.os.thread_id[p_pthread_info->task_id] = pthread_self(); 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project prctl(PR_SET_NAME, (unsigned long)gki_cb.com.OSTName[p_pthread_info->task_id], 0, 0, 0); 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 271d42dba5420e5636dfcf71f883d73821ac923d549Sharvil Nanavati ALOGI("gki_task_entry task_id=%i [%s] starting\n", p_pthread_info->task_id, 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSTName[p_pthread_info->task_id]); 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Call the actual thread entry point */ 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_pthread_info->task_entry)(p_pthread_info->params); 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 277d42dba5420e5636dfcf71f883d73821ac923d549Sharvil Nanavati ALOGI("gki_task task_id=%i [%s] terminating\n", p_pthread_info->task_id, 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSTName[p_pthread_info->task_id]); 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_exit(0); /* GKI tasks have no return value */ 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GKI_init 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called once at startup to initialize 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** all the timer structures. 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid GKI_init(void) 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutexattr_t attr; 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tGKI_OS *p_os; 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (&gki_cb, 0, sizeof (gki_cb)); 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_buffer_init(); 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_timers_init(); 30310aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati alarm_service_init(); 30410aecea0649e523ad9e94b5d0256e72729ec5875Sharvil Nanavati 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSTicks = (UINT32) times(0); 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutexattr_init(&attr); 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef __CYGWIN__ 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP); 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_os = &gki_cb.os; 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_init(&p_os->GKI_mutex, &attr); 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pthread_mutex_init(&GKI_sched_mutex, NULL); */ 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (GKI_DEBUG == TRUE) 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_init(&p_os->GKI_trace_mutex, NULL); 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pthread_mutex_init(&thread_delay_mutex, NULL); */ /* used in GKI_delay */ 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pthread_cond_init (&thread_delay_cond, NULL); */ 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 321ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavati struct sigevent sigevent; 322ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavati memset(&sigevent, 0, sizeof(sigevent)); 323ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavati sigevent.sigev_notify = SIGEV_THREAD; 324ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavati sigevent.sigev_notify_function = (void (*)(union sigval))bt_alarm_cb; 325ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavati sigevent.sigev_value.sival_ptr = NULL; 326ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavati if (timer_create(CLOCK_REALTIME, &sigevent, &posix_timer) == -1) { 327ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavati ALOGE("%s unable to create POSIX timer: %s", __func__, strerror(errno)); 328ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavati timer_created = false; 329ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavati } else { 330ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavati timer_created = true; 331ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavati } 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GKI_get_os_tick_count 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to retrieve the native OS system tick. 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Tick count of native OS. 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT32 GKI_get_os_tick_count(void) 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3466449e497dfe4d500810c3e7b4d7d056027c33a0eSharvil Nanavati return gki_cb.com.OSTicks; 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GKI_create_task 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to create a new OSS task. 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: task_entry - (input) pointer to the entry function of the task 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** task_id - (input) Task id is mapped to priority 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** taskname - (input) name given to the task 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** stack - (input) pointer to the top of the stack (highest memory location) 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** stacksize - (input) size of the stack allocated for the task 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns GKI_SUCCESS if all OK, GKI_FAILURE if any problem 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NOTE This function take some parameters that may not be needed 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** by your particular OS. They are here for compatability 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** of the function prototype. 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 GKI_create_task (TASKPTR task_entry, UINT8 task_id, INT8 *taskname, UINT16 *stack, UINT16 stacksize) 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 i; 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct sched_param param; 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int policy, ret = 0; 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_attr_t attr1; 3755cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(stack); 3765cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(stacksize); 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_TRACE( "GKI_create_task %x %d %s %x %d", (int)task_entry, (int)task_id, 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (char*) taskname, (int) stack, (int)stacksize); 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (task_id >= GKI_MAX_TASKS) 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 383d42dba5420e5636dfcf71f883d73821ac923d549Sharvil Nanavati ALOGE("Error! task ID > max task allowed"); 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (GKI_FAILURE); 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSRdyTbl[task_id] = TASK_READY; 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSTName[task_id] = taskname; 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSWaitTmr[task_id] = 0; 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSWaitEvt[task_id] = 0; 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Initialize mutex and condition variable objects for events and timeouts */ 394a90d343e16e19e25ea6a813f4a9f6cd922989b01Narayan Kamath pthread_condattr_t cond_attr; 395a90d343e16e19e25ea6a813f4a9f6cd922989b01Narayan Kamath pthread_condattr_init(&cond_attr); 396a90d343e16e19e25ea6a813f4a9f6cd922989b01Narayan Kamath pthread_condattr_setclock(&cond_attr, CLOCK_MONOTONIC); 397a90d343e16e19e25ea6a813f4a9f6cd922989b01Narayan Kamath 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_init(&gki_cb.os.thread_evt_mutex[task_id], NULL); 399a90d343e16e19e25ea6a813f4a9f6cd922989b01Narayan Kamath pthread_cond_init (&gki_cb.os.thread_evt_cond[task_id], &cond_attr); 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_init(&gki_cb.os.thread_timeout_mutex[task_id], NULL); 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_cond_init (&gki_cb.os.thread_timeout_cond[task_id], NULL); 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_attr_init(&attr1); 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* by default, pthread creates a joinable thread */ 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if ( FALSE == GKI_PTHREAD_JOINABLE ) 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_attr_setdetachstate(&attr1, PTHREAD_CREATE_DETACHED); 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_TRACE("GKI creating task %i\n", task_id); 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_TRACE("GKI creating JOINABLE task %i\n", task_id); 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* On Android, the new tasks starts running before 'gki_cb.os.thread_id[task_id]' is initialized */ 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Pass task_id to new task so it can initialize gki_cb.os.thread_id[task_id] for it calls GKI_wait */ 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_pthread_info[task_id].task_id = task_id; 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_pthread_info[task_id].task_entry = task_entry; 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_pthread_info[task_id].params = 0; 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret = pthread_create( &gki_cb.os.thread_id[task_id], 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &attr1, 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (void *)gki_task_entry, 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &gki_pthread_info[task_id]); 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (ret != 0) 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 426d42dba5420e5636dfcf71f883d73821ac923d549Sharvil Nanavati ALOGE("pthread_create failed(%d), %s!", ret, taskname); 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GKI_FAILURE; 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(pthread_getschedparam(gki_cb.os.thread_id[task_id], &policy, ¶m)==0) 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (GKI_LINUX_BASE_POLICY!=GKI_SCHED_NORMAL) 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(PBS_SQL_TASK) 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (task_id == PBS_SQL_TASK) 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_TRACE("PBS SQL lowest priority task"); 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project policy = SCHED_NORMAL; 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check if define in gki_int.h is correct for this compile environment! */ 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project policy = GKI_LINUX_BASE_POLICY; 445bcfbc24314a79e40e1036cdea62f42b612981b1cSharvil Nanavati#if (GKI_LINUX_BASE_POLICY != GKI_SCHED_NORMAL) 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project param.sched_priority = GKI_LINUX_BASE_PRIORITY - task_id - 2; 447bcfbc24314a79e40e1036cdea62f42b612981b1cSharvil Nanavati#else 448bcfbc24314a79e40e1036cdea62f42b612981b1cSharvil Nanavati param.sched_priority = 0; 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_setschedparam(gki_cb.os.thread_id[task_id], policy, ¶m); 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_TRACE( "Leaving GKI_create_task %x %d %x %s %x %d\n", 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (int)task_entry, 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (int)task_id, 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (int)gki_cb.os.thread_id[task_id], 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (char*)taskname, 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (int)stack, 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (int)stacksize); 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (GKI_SUCCESS); 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid GKI_destroy_task(UINT8 task_id) 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if ( FALSE == GKI_PTHREAD_JOINABLE ) 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i = 0; 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int result; 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gki_cb.com.OSRdyTbl[task_id] != TASK_DEAD) 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSRdyTbl[task_id] = TASK_DEAD; 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* paranoi settings, make sure that we do not execute any mailbox events */ 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSWaitEvt[task_id] &= ~(TASK_MBOX_0_EVT_MASK|TASK_MBOX_1_EVT_MASK| 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project TASK_MBOX_2_EVT_MASK|TASK_MBOX_3_EVT_MASK); 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (GKI_NUM_TIMERS > 0) 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSTaskTmr0R[task_id] = 0; 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSTaskTmr0 [task_id] = 0; 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (GKI_NUM_TIMERS > 1) 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSTaskTmr1R[task_id] = 0; 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSTaskTmr1 [task_id] = 0; 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (GKI_NUM_TIMERS > 2) 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSTaskTmr2R[task_id] = 0; 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSTaskTmr2 [task_id] = 0; 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (GKI_NUM_TIMERS > 3) 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSTaskTmr3R[task_id] = 0; 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSTaskTmr3 [task_id] = 0; 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_send_event(task_id, EVENT_MASK(GKI_SHUTDOWN_EVT)); 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if ( FALSE == GKI_PTHREAD_JOINABLE ) 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i = 0; 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while ((gki_cb.com.OSWaitEvt[task_id] != 0) && (++i < 10)) 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project usleep(100 * 1000); 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = pthread_join( gki_cb.os.thread_id[task_id], NULL ); 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( result < 0 ) 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 511d42dba5420e5636dfcf71f883d73821ac923d549Sharvil Nanavati ALOGE( "pthread_join() FAILED: result: %d", result ); 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_exit_task(task_id); 515d42dba5420e5636dfcf71f883d73821ac923d549Sharvil Nanavati ALOGI( "GKI_shutdown(): task [%s] terminated\n", gki_cb.com.OSTName[task_id]); 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GKI_task_self_cleanup 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is used in the case when the calling thread 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is exiting itself. The GKI_destroy_task function can not be 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** used in this case due to the pthread_join call. The function 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** cleans up GKI control block associated to the terminating 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** thread. 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: task_id - (input) Task id is used for sanity check to 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** make sure the calling thread is in the right 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** context. 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid GKI_task_self_cleanup(UINT8 task_id) 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 my_task_id = GKI_get_taskid(); 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (task_id != my_task_id) 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 543d42dba5420e5636dfcf71f883d73821ac923d549Sharvil Nanavati ALOGE("%s: Wrong context - current task %d is not the given task id %d",\ 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project __FUNCTION__, my_task_id, task_id); 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gki_cb.com.OSRdyTbl[task_id] != TASK_DEAD) 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* paranoi settings, make sure that we do not execute any mailbox events */ 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSWaitEvt[task_id] &= ~(TASK_MBOX_0_EVT_MASK|TASK_MBOX_1_EVT_MASK| 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project TASK_MBOX_2_EVT_MASK|TASK_MBOX_3_EVT_MASK); 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (GKI_NUM_TIMERS > 0) 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSTaskTmr0R[task_id] = 0; 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSTaskTmr0 [task_id] = 0; 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (GKI_NUM_TIMERS > 1) 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSTaskTmr1R[task_id] = 0; 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSTaskTmr1 [task_id] = 0; 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (GKI_NUM_TIMERS > 2) 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSTaskTmr2R[task_id] = 0; 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSTaskTmr2 [task_id] = 0; 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (GKI_NUM_TIMERS > 3) 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSTaskTmr3R[task_id] = 0; 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSTaskTmr3 [task_id] = 0; 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_exit_task(task_id); 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Calling pthread_detach here to mark the thread as detached. 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Once the thread terminates, the system can reclaim its resources 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project without waiting for another thread to join with. 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_detach(gki_cb.os.thread_id[task_id]); 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GKI_shutdown 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description shutdowns the GKI tasks/threads in from max task id to 0 and frees 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** pthread resources! 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** IMPORTANT: in case of join method, GKI_shutdown must be called outside 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** a GKI thread context! 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid GKI_shutdown(void) 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 task_id; 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if ( FALSE == GKI_PTHREAD_JOINABLE ) 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i = 0; 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int result; 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef GKI_USE_DEFERED_ALLOC_BUF_POOLS 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_dealloc_free_queue(); 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* release threads and set as TASK_DEAD. going from low to high priority fixes 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * GKI_exception problem due to btu->hci sleep request events */ 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (task_id = GKI_MAX_TASKS; task_id > 0; task_id--) 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gki_cb.com.OSRdyTbl[task_id - 1] != TASK_DEAD) 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSRdyTbl[task_id - 1] = TASK_DEAD; 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* paranoi settings, make sure that we do not execute any mailbox events */ 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSWaitEvt[task_id-1] &= ~(TASK_MBOX_0_EVT_MASK|TASK_MBOX_1_EVT_MASK| 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project TASK_MBOX_2_EVT_MASK|TASK_MBOX_3_EVT_MASK); 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_send_event(task_id - 1, EVENT_MASK(GKI_SHUTDOWN_EVT)); 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if ( FALSE == GKI_PTHREAD_JOINABLE ) 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i = 0; 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while ((gki_cb.com.OSWaitEvt[task_id - 1] != 0) && (++i < 10)) 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project usleep(100 * 1000); 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = pthread_join( gki_cb.os.thread_id[task_id-1], NULL ); 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( result < 0 ) 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ALOGE( "pthread_join() FAILED: result: %d", result ); 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_exit_task(task_id - 1); 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Destroy mutex and condition variable objects */ 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_destroy(&gki_cb.os.GKI_mutex); 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pthread_mutex_destroy(&GKI_sched_mutex); */ 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (GKI_DEBUG == TRUE) 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_destroy(&gki_cb.os.GKI_trace_mutex); 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pthread_mutex_destroy(&thread_delay_mutex); 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_cond_destroy (&thread_delay_cond); */ 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if ( FALSE == GKI_PTHREAD_JOINABLE ) 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i = 0; 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 653ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavati if (timer_created) { 654ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavati timer_delete(posix_timer); 655ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavati timer_created = false; 656ceec4d1f71f9b71bc1175f684699be45b96d9efcSharvil Nanavati } 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function gki_set_timer_scheduling 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description helper function to set scheduling policy and priority of btdl 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void gki_set_timer_scheduling( void ) 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pid_t main_pid = getpid(); 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct sched_param param; 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int policy; 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project policy = sched_getscheduler(main_pid); 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( policy != -1 ) 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_TRACE("gki_set_timer_scheduling(()::scheduler current policy: %d", policy); 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* ensure highest priority in the system + 2 to allow space for read threads */ 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project param.sched_priority = GKI_LINUX_TIMER_TICK_PRIORITY; 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( 0!=sched_setscheduler(main_pid, GKI_LINUX_TIMER_POLICY, ¶m ) ) 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_TRACE("sched_setscheduler() failed with error: %d", errno); 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_TRACE( "getscheduler failed: %d", errno); 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GKI_run 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Main GKI loop 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 706b5382489d4092d6e8418297ce7bd5d0c82ad2eefSharvil Nanavativoid GKI_run(void) 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* adjust btld scheduling scheme now */ 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_set_timer_scheduling(); 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_TRACE( "GKI_run(): Start/Stop GKI_timer_update_registered!" ); 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GKI_stop 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to stop 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the tasks and timers when the system is being stopped 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NOTE This function is NOT called by the Broadcom stack and 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** profiles. If you want to use it in your own implementation, 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** put specific code here. 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid GKI_stop (void) 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 task_id; 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* gki_queue_timer_cback(FALSE); */ 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* TODO - add code here if needed*/ 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(task_id = 0; task_id<GKI_MAX_TASKS; task_id++) 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(gki_cb.com.OSRdyTbl[task_id] != TASK_DEAD) 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_exit_task(task_id); 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GKI_wait 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by tasks to wait for a specific 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event or set of events. The task may specify the duration 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** that it wants to wait for, or 0 if infinite. 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: flag - (input) the event or set of events to wait for 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** timeout - (input) the duration that the task wants to wait 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** for the specific events (in system ticks) 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns the event mask of received events or zero if timeout 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 GKI_wait (UINT16 flag, UINT32 timeout) 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 evt; 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 rtask; 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct timespec abstime = { 0, 0 }; 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int sec; 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int nano_sec; 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rtask = GKI_get_taskid(); 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_TRACE("GKI_wait %d %x %d", (int)rtask, (int)flag, (int)timeout); 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSWaitForEvt[rtask] = flag; 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* protect OSWaitEvt[rtask] from modification from an other thread */ 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_lock(&gki_cb.os.thread_evt_mutex[rtask]); 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(gki_cb.com.OSWaitEvt[rtask] & flag)) 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (timeout) 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project clock_gettime(CLOCK_MONOTONIC, &abstime); 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add timeout */ 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec = timeout / 1000; 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project nano_sec = (timeout % 1000) * NANOSEC_PER_MILLISEC; 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project abstime.tv_nsec += nano_sec; 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (abstime.tv_nsec > NSEC_PER_SEC) 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project abstime.tv_sec += (abstime.tv_nsec / NSEC_PER_SEC); 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project abstime.tv_nsec = abstime.tv_nsec % NSEC_PER_SEC; 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project abstime.tv_sec += sec; 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 797a90d343e16e19e25ea6a813f4a9f6cd922989b01Narayan Kamath pthread_cond_timedwait(&gki_cb.os.thread_evt_cond[rtask], 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &gki_cb.os.thread_evt_mutex[rtask], &abstime); 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_cond_wait(&gki_cb.os.thread_evt_cond[rtask], &gki_cb.os.thread_evt_mutex[rtask]); 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* TODO: check, this is probably neither not needed depending on phtread_cond_wait() implmentation, 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project e.g. it looks like it is implemented as a counter in which case multiple cond_signal 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project should NOT be lost! */ 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we are waking up after waiting for some events, so refresh variables 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project no need to call GKI_disable() here as we know that we will have some events as we've been waking 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project up after condition pending or timeout */ 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gki_cb.com.OSTaskQFirst[rtask][0]) 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_0_EVT_MASK; 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gki_cb.com.OSTaskQFirst[rtask][1]) 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_1_EVT_MASK; 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gki_cb.com.OSTaskQFirst[rtask][2]) 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_2_EVT_MASK; 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gki_cb.com.OSTaskQFirst[rtask][3]) 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSWaitEvt[rtask] |= TASK_MBOX_3_EVT_MASK; 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gki_cb.com.OSRdyTbl[rtask] == TASK_DEAD) 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSWaitEvt[rtask] = 0; 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* unlock thread_evt_mutex as pthread_cond_wait() does auto lock when cond is met */ 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_unlock(&gki_cb.os.thread_evt_mutex[rtask]); 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (EVENT_MASK(GKI_SHUTDOWN_EVT)); 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Clear the wait for event mask */ 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSWaitForEvt[rtask] = 0; 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Return only those bits which user wants... */ 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt = gki_cb.com.OSWaitEvt[rtask] & flag; 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Clear only those bits which user wants... */ 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSWaitEvt[rtask] &= ~flag; 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* unlock thread_evt_mutex as pthread_cond_wait() does auto lock mutex when cond is met */ 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_unlock(&gki_cb.os.thread_evt_mutex[rtask]); 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_TRACE("GKI_wait %d %x %d %x done", (int)rtask, (int)flag, (int)timeout, (int)evt); 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (evt); 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GKI_delay 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by tasks to sleep unconditionally 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** for a specified amount of time. The duration is in milliseconds 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: timeout - (input) the duration in milliseconds 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid GKI_delay (UINT32 timeout) 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 rtask = GKI_get_taskid(); 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct timespec delay; 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int err; 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_TRACE("GKI_delay %d %d", (int)rtask, (int)timeout); 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delay.tv_sec = timeout / 1000; 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delay.tv_nsec = 1000 * 1000 * (timeout%1000); 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* [u]sleep can't be used because it uses SIGALRM */ 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project do { 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project err = nanosleep(&delay, &delay); 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } while (err < 0 && errno ==EINTR); 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if task was killed while sleeping */ 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* NOTE : if you do not implement task killing, you do not need this check */ 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (rtask && gki_cb.com.OSRdyTbl[rtask] == TASK_DEAD) 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_TRACE("GKI_delay %d %d done", (int)rtask, (int)timeout); 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GKI_send_event 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by tasks to send events to other 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** tasks. Tasks can also send events to themselves. 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: task_id - (input) The id of the task to which the event has to 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** be sent 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event - (input) The event that has to be sent 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns GKI_SUCCESS if all OK, else GKI_FAILURE 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 GKI_send_event (UINT8 task_id, UINT16 event) 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_TRACE("GKI_send_event %d %x", task_id, event); 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (task_id < GKI_MAX_TASKS) 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* protect OSWaitEvt[task_id] from manipulation in GKI_wait() */ 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_lock(&gki_cb.os.thread_evt_mutex[task_id]); 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set the event bit */ 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSWaitEvt[task_id] |= event; 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_cond_signal(&gki_cb.os.thread_evt_cond[task_id]); 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_unlock(&gki_cb.os.thread_evt_mutex[task_id]); 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_TRACE("GKI_send_event %d %x done", task_id, event); 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ( GKI_SUCCESS ); 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_TRACE("############## GKI_send_event FAILED!! ##################"); 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (GKI_FAILURE); 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GKI_get_taskid 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function gets the currently running task ID. 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns task ID 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NOTE The Broadcom upper stack and profiles may run as a single task. 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If you only have one GKI task, then you can hard-code this 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** function to return a '1'. Otherwise, you should have some 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** OS-specific method to determine the current task. 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 GKI_get_taskid (void) 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_t thread_id = pthread_self( ); 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_TRACE("GKI_get_taskid %x", (int)thread_id); 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < GKI_MAX_TASKS; i++) { 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gki_cb.os.thread_id[i] == thread_id) { 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //GKI_TRACE("GKI_get_taskid %x %d done", thread_id, i); 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(i); 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_TRACE("GKI_get_taskid: task id = -1"); 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(-1); 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GKI_map_taskname 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function gets the task name of the taskid passed as arg. 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If GKI_MAX_TASKS is passed as arg the currently running task 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** name is returned 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: task_id - (input) The id of the task whose name is being 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** sought. GKI_MAX_TASKS is passed to get the name of the 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** currently running task. 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns pointer to task name 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NOTE this function needs no customization 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectINT8 *GKI_map_taskname (UINT8 task_id) 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_TRACE("GKI_map_taskname %d", task_id); 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (task_id < GKI_MAX_TASKS) 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_TRACE("GKI_map_taskname %d %s done", task_id, gki_cb.com.OSTName[task_id]); 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (gki_cb.com.OSTName[task_id]); 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (task_id == GKI_MAX_TASKS ) 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (gki_cb.com.OSTName[GKI_get_taskid()]); 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (INT8*)"BAD"; 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GKI_enable 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function enables interrupts. 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid GKI_enable (void) 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_unlock(&gki_cb.os.GKI_mutex); 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GKI_disable 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function disables interrupts. 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid GKI_disable (void) 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_lock(&gki_cb.os.GKI_mutex); 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GKI_exception 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function throws an exception. 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** This is normally only called for a nonrecoverable error. 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: code - (input) The code for the error 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** msg - (input) The message that has to be logged 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid GKI_exception (UINT16 code, char *msg) 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 task_id; 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i = 0; 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1055d42dba5420e5636dfcf71f883d73821ac923d549Sharvil Nanavati ALOGE( "GKI_exception(): Task State Table"); 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(task_id = 0; task_id < GKI_MAX_TASKS; task_id++) 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1059d42dba5420e5636dfcf71f883d73821ac923d549Sharvil Nanavati ALOGE( "TASK ID [%d] task name [%s] state [%d]", 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project task_id, 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSTName[task_id], 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSRdyTbl[task_id]); 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1065d42dba5420e5636dfcf71f883d73821ac923d549Sharvil Nanavati ALOGE("GKI_exception %d %s", code, msg); 1066d42dba5420e5636dfcf71f883d73821ac923d549Sharvil Nanavati ALOGE( "********************************************************************"); 1067d42dba5420e5636dfcf71f883d73821ac923d549Sharvil Nanavati ALOGE( "* GKI_exception(): %d %s", code, msg); 1068d42dba5420e5636dfcf71f883d73821ac923d549Sharvil Nanavati ALOGE( "********************************************************************"); 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if 0//(GKI_DEBUG == TRUE) 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_disable(); 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (gki_cb.com.ExceptionCnt < GKI_MAX_EXCEPTION) 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project EXCEPTION_T *pExp; 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pExp = &gki_cb.com.Exception[gki_cb.com.ExceptionCnt++]; 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pExp->type = code; 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pExp->taskid = GKI_get_taskid(); 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project strncpy((char *)pExp->msg, msg, GKI_MAX_EXCEPTION_MSGLEN - 1); 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enable(); 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_TRACE("GKI_exception %d %s done", code, msg); 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GKI_os_malloc 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function allocates memory 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: size - (input) The size of the memory that has to be 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** allocated 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns the address of the memory allocated, or NULL if failed 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NOTE This function is called by the Broadcom stack when 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** dynamic memory allocation is used. (see dyn_mem.h) 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid *GKI_os_malloc (UINT32 size) 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11076449e497dfe4d500810c3e7b4d7d056027c33a0eSharvil Nanavati return malloc(size); 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GKI_os_free 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function frees memory 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: size - (input) The address of the memory that has to be 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** freed 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NOTE This function is NOT called by the Broadcom stack and 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** profiles. It is only called from within GKI if dynamic 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid GKI_os_free (void *p_mem) 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11276449e497dfe4d500810c3e7b4d7d056027c33a0eSharvil Nanavati free(p_mem); 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function GKI_exit_task 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to stop a GKI task. 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: task_id - (input) the id of the task that has to be stopped 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NOTE This function is NOT called by the Broadcom stack and 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** profiles. If you want to use it in your own implementation, 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** put specific code here to kill a task. 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid GKI_exit_task (UINT8 task_id) 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_disable(); 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project gki_cb.com.OSRdyTbl[task_id] = TASK_DEAD; 11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Destroy mutex and condition variable objects */ 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_destroy(&gki_cb.os.thread_evt_mutex[task_id]); 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_cond_destroy (&gki_cb.os.thread_evt_cond[task_id]); 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_mutex_destroy(&gki_cb.os.thread_timeout_mutex[task_id]); 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pthread_cond_destroy (&gki_cb.os.thread_timeout_cond[task_id]); 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enable(); 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1159d42dba5420e5636dfcf71f883d73821ac923d549Sharvil Nanavati ALOGI("GKI_exit_task %d done", task_id); 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1162