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