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