1525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/* 2525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Copyright (C) 2012 The Android Open Source Project 3525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * 4525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * you may not use this file except in compliance with the License. 6525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * You may obtain a copy of the License at 7525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * 8525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * 10525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * See the License for the specific language governing permissions and 14525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * limitations under the License. 15525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */ 16525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 17525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/* 18525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project * Encapsulate a mutex for thread synchronization. 19525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project */ 20525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 21525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "Mutex.h" 22525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include "NfcJniUtil.h" 237b223358c5564a7bc7c72a74889f61fbc5a3cc27Ruben Brunk 247b223358c5564a7bc7c72a74889f61fbc5a3cc27Ruben Brunk#include <cutils/log.h> 25525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project#include <errno.h> 26525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 27525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 28525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 29525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: Mutex 30525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 31525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Initialize member variables. 32525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 33525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None. 34525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 35525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 36525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectMutex::Mutex () 37525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 38525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project memset (&mMutex, 0, sizeof(mMutex)); 39525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project int res = pthread_mutex_init (&mMutex, NULL); 40525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (res != 0) 41525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 42525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("Mutex::Mutex: fail init; error=0x%X", res); 43525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 44525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 45525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 46525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 47525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 48525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 49525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: ~Mutex 50525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 51525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Cleanup all resources. 52525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 53525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None. 54525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 55525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 56525c260303268a83da4c3413b953d13c9084e834The Android Open Source ProjectMutex::~Mutex () 57525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 58525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project int res = pthread_mutex_destroy (&mMutex); 59525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (res != 0) 60525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 61525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("Mutex::~Mutex: fail destroy; error=0x%X", res); 62525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 63525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 64525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 65525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 66525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 67525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 68525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: lock 69525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 70525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Block the thread and try lock the mutex. 71525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 72525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None. 73525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 74525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 75525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid Mutex::lock () 76525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 77525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project int res = pthread_mutex_lock (&mMutex); 78525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (res != 0) 79525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 80525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("Mutex::lock: fail lock; error=0x%X", res); 81525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 82525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 83525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 84525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 85525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 86525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 87525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: unlock 88525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 89525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Unlock a mutex to unblock a thread. 90525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 91525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: None. 92525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 93525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 94525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectvoid Mutex::unlock () 95525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 96525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project int res = pthread_mutex_unlock (&mMutex); 97525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if (res != 0) 98525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 99525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("Mutex::unlock: fail unlock; error=0x%X", res); 100525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 101525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 102525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 103525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 104525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 105525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 106525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: tryLock 107525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 108525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Try to lock the mutex. 109525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 110525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: True if the mutex is locked. 111525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 112525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 113525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectbool Mutex::tryLock () 114525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 115525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project int res = pthread_mutex_trylock (&mMutex); 116525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project if ((res != 0) && (res != EBUSY)) 117525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project { 118525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project ALOGE ("Mutex::tryLock: error=0x%X", res); 119525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project } 120525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return res == 0; 121525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 122525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 123525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 124525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project/******************************************************************************* 125525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 126525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Function: nativeHandle 127525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 128525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Description: Get the handle of the mutex. 129525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 130525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** Returns: Handle of the mutex. 131525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project** 132525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project*******************************************************************************/ 133525c260303268a83da4c3413b953d13c9084e834The Android Open Source Projectpthread_mutex_t* Mutex::nativeHandle () 134525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project{ 135525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project return &mMutex; 136525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project} 137525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 138525c260303268a83da4c3413b953d13c9084e834The Android Open Source Project 139