1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 3e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Copyright (C) 2012 Broadcom Corporation 4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * you may not use this file except in compliance with the License. 7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * You may obtain a copy of the License at: 8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * See the License for the specific language governing permissions and 15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * limitations under the License. 16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Encapsulate a mutex for thread synchronization. 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define LOG_TAG "NfcNciHal" 26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "Mutex.h" 27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <errno.h> 28be6e6864e012010919062e94a71989efc77592fbElliott Hughes#include <string.h> 296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "_OverrideLog.h" 30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function: Mutex 34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Initialize member variables. 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns: None. 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 406fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoiMutex::Mutex() { 416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi memset(&mMutex, 0, sizeof(mMutex)); 426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int res = pthread_mutex_init(&mMutex, NULL); 436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (res != 0) { 446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGE("Mutex::Mutex: fail init; error=0x%X", res); 456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function: ~Mutex 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Cleanup all resources. 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns: None. 55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 576fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoiMutex::~Mutex() { 586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int res = pthread_mutex_destroy(&mMutex); 596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (res != 0) { 606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGE("Mutex::~Mutex: fail destroy; error=0x%X", res); 616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function: lock 67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Block the thread and try lock the mutex. 69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns: None. 71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid Mutex::lock() { 746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int res = pthread_mutex_lock(&mMutex); 756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (res != 0) { 766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGE("Mutex::lock: fail lock; error=0x%X", res); 776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function: unlock 83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Unlock a mutex to unblock a thread. 85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns: None. 87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid Mutex::unlock() { 906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int res = pthread_mutex_unlock(&mMutex); 916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if (res != 0) { 926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGE("Mutex::unlock: fail unlock; error=0x%X", res); 936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function: tryLock 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Try to lock the mutex. 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns: True if the mutex is locked. 103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool Mutex::tryLock() { 1066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi int res = pthread_mutex_trylock(&mMutex); 1076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi if ((res != 0) && (res != EBUSY)) { 1086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ALOGE("Mutex::tryLock: error=0x%X", res); 1096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi } 1106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi return res == 0; 111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function: nativeHandle 116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description: Get the handle of the mutex. 118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns: Handle of the mutex. 120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoipthread_mutex_t* Mutex::nativeHandle() { return &mMutex; } 123