1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /* 18 * Encapsulate a mutex for thread synchronization. 19 */ 20 21 #include "Mutex.h" 22 #include "NfcJniUtil.h" 23 24 #include <errno.h> 25 #include <string.h> 26 27 #include <log/log.h> 28 29 /******************************************************************************* 30 ** 31 ** Function: Mutex 32 ** 33 ** Description: Initialize member variables. 34 ** 35 ** Returns: None. 36 ** 37 *******************************************************************************/ 38 Mutex::Mutex () 39 { 40 memset (&mMutex, 0, sizeof(mMutex)); 41 int res = pthread_mutex_init (&mMutex, NULL); 42 if (res != 0) 43 { 44 ALOGE("Mutex::Mutex: fail init; error=0x%X", res); 45 } 46 } 47 48 49 /******************************************************************************* 50 ** 51 ** Function: ~Mutex 52 ** 53 ** Description: Cleanup all resources. 54 ** 55 ** Returns: None. 56 ** 57 *******************************************************************************/ 58 Mutex::~Mutex () 59 { 60 int res = pthread_mutex_destroy (&mMutex); 61 if (res != 0) 62 { 63 ALOGE("Mutex::~Mutex: fail destroy; error=0x%X", res); 64 } 65 } 66 67 68 /******************************************************************************* 69 ** 70 ** Function: lock 71 ** 72 ** Description: Block the thread and try lock the mutex. 73 ** 74 ** Returns: None. 75 ** 76 *******************************************************************************/ 77 void Mutex::lock () 78 { 79 int res = pthread_mutex_lock (&mMutex); 80 if (res != 0) 81 { 82 ALOGE("Mutex::lock: fail lock; error=0x%X", res); 83 } 84 } 85 86 87 /******************************************************************************* 88 ** 89 ** Function: unlock 90 ** 91 ** Description: Unlock a mutex to unblock a thread. 92 ** 93 ** Returns: None. 94 ** 95 *******************************************************************************/ 96 void Mutex::unlock () 97 { 98 int res = pthread_mutex_unlock (&mMutex); 99 if (res != 0) 100 { 101 ALOGE("Mutex::unlock: fail unlock; error=0x%X", res); 102 } 103 } 104 105 106 /******************************************************************************* 107 ** 108 ** Function: tryLock 109 ** 110 ** Description: Try to lock the mutex. 111 ** 112 ** Returns: True if the mutex is locked. 113 ** 114 *******************************************************************************/ 115 bool Mutex::tryLock () 116 { 117 int res = pthread_mutex_trylock (&mMutex); 118 if ((res != 0) && (res != EBUSY)) 119 { 120 ALOGE("Mutex::tryLock: error=0x%X", res); 121 } 122 return res == 0; 123 } 124 125 126 /******************************************************************************* 127 ** 128 ** Function: nativeHandle 129 ** 130 ** Description: Get the handle of the mutex. 131 ** 132 ** Returns: Handle of the mutex. 133 ** 134 *******************************************************************************/ 135 pthread_mutex_t* Mutex::nativeHandle () 136 { 137 return &mMutex; 138 } 139 140 141