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