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 <cutils/log.h>
25#include <errno.h>
26
27/*******************************************************************************
28**
29** Function:        Mutex
30**
31** Description:     Initialize member variables.
32**
33** Returns:         None.
34**
35*******************************************************************************/
36Mutex::Mutex ()
37{
38    memset (&mMutex, 0, sizeof(mMutex));
39    int res = pthread_mutex_init (&mMutex, NULL);
40    if (res != 0)
41    {
42        ALOGE ("Mutex::Mutex: fail init; error=0x%X", res);
43    }
44}
45
46
47/*******************************************************************************
48**
49** Function:        ~Mutex
50**
51** Description:     Cleanup all resources.
52**
53** Returns:         None.
54**
55*******************************************************************************/
56Mutex::~Mutex ()
57{
58    int res = pthread_mutex_destroy (&mMutex);
59    if (res != 0)
60    {
61        ALOGE ("Mutex::~Mutex: fail destroy; error=0x%X", res);
62    }
63}
64
65
66/*******************************************************************************
67**
68** Function:        lock
69**
70** Description:     Block the thread and try lock the mutex.
71**
72** Returns:         None.
73**
74*******************************************************************************/
75void Mutex::lock ()
76{
77    int res = pthread_mutex_lock (&mMutex);
78    if (res != 0)
79    {
80        ALOGE ("Mutex::lock: fail lock; error=0x%X", res);
81    }
82}
83
84
85/*******************************************************************************
86**
87** Function:        unlock
88**
89** Description:     Unlock a mutex to unblock a thread.
90**
91** Returns:         None.
92**
93*******************************************************************************/
94void Mutex::unlock ()
95{
96    int res = pthread_mutex_unlock (&mMutex);
97    if (res != 0)
98    {
99        ALOGE ("Mutex::unlock: fail unlock; error=0x%X", res);
100    }
101}
102
103
104/*******************************************************************************
105**
106** Function:        tryLock
107**
108** Description:     Try to lock the mutex.
109**
110** Returns:         True if the mutex is locked.
111**
112*******************************************************************************/
113bool Mutex::tryLock ()
114{
115    int res = pthread_mutex_trylock (&mMutex);
116    if ((res != 0) && (res != EBUSY))
117    {
118        ALOGE ("Mutex::tryLock: error=0x%X", res);
119    }
120    return res == 0;
121}
122
123
124/*******************************************************************************
125**
126** Function:        nativeHandle
127**
128** Description:     Get the handle of the mutex.
129**
130** Returns:         Handle of the mutex.
131**
132*******************************************************************************/
133pthread_mutex_t* Mutex::nativeHandle ()
134{
135    return &mMutex;
136}
137
138
139