11abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/* 21abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Copyright (C) 2015 The Android Open Source Project 31abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 41abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License"); 51abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * you may not use this file except in compliance with the License. 61abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * You may obtain a copy of the License at 71abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 81abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * http://www.apache.org/licenses/LICENSE-2.0 91abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * 101abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Unless required by applicable law or agreed to in writing, software 111abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS, 121abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * See the License for the specific language governing permissions and 141abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * limitations under the License. 151abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 161abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 171abddd9f6225298066094e20a6c29061b6af4590Nick Chalko#ifndef MUTEX_H_ 181abddd9f6225298066094e20a6c29061b6af4590Nick Chalko#define MUTEX_H_ 191abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 201abddd9f6225298066094e20a6c29061b6af4590Nick Chalko#include "pthread.h" 211abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 221abddd9f6225298066094e20a6c29061b6af4590Nick Chalko// Based on utils/threads.h, but tailored to build with the NDK and used unbundled. 231abddd9f6225298066094e20a6c29061b6af4590Nick Chalko// This is a simple wrapper over the pthread_mutex_t type. 241abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoclass Mutex { 251abddd9f6225298066094e20a6c29061b6af4590Nick Chalkopublic: 261abddd9f6225298066094e20a6c29061b6af4590Nick Chalko Mutex() { 271abddd9f6225298066094e20a6c29061b6af4590Nick Chalko pthread_mutex_init(&mMutex, NULL); 281abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 291abddd9f6225298066094e20a6c29061b6af4590Nick Chalko int lock() { 301abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return -pthread_mutex_lock(&mMutex); 311abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 321abddd9f6225298066094e20a6c29061b6af4590Nick Chalko void unlock() { 331abddd9f6225298066094e20a6c29061b6af4590Nick Chalko pthread_mutex_unlock(&mMutex); 341abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 351abddd9f6225298066094e20a6c29061b6af4590Nick Chalko ~Mutex() { 361abddd9f6225298066094e20a6c29061b6af4590Nick Chalko pthread_mutex_destroy(&mMutex); 371abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 381abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 391abddd9f6225298066094e20a6c29061b6af4590Nick Chalko // A simple class that locks a given mutex on construction 401abddd9f6225298066094e20a6c29061b6af4590Nick Chalko // and unlocks it when it goes out of scope. 411abddd9f6225298066094e20a6c29061b6af4590Nick Chalko class Autolock { 421abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public: 431abddd9f6225298066094e20a6c29061b6af4590Nick Chalko Autolock(Mutex &mutex) : lock(&mutex) { 441abddd9f6225298066094e20a6c29061b6af4590Nick Chalko lock->lock(); 451abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 461abddd9f6225298066094e20a6c29061b6af4590Nick Chalko ~Autolock() { 471abddd9f6225298066094e20a6c29061b6af4590Nick Chalko lock->unlock(); 481abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 491abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private: 501abddd9f6225298066094e20a6c29061b6af4590Nick Chalko Mutex *lock; 511abddd9f6225298066094e20a6c29061b6af4590Nick Chalko }; 521abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 531abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoprivate: 541abddd9f6225298066094e20a6c29061b6af4590Nick Chalko pthread_mutex_t mMutex; 551abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 561abddd9f6225298066094e20a6c29061b6af4590Nick Chalko // Disallow copy and assign. 571abddd9f6225298066094e20a6c29061b6af4590Nick Chalko Mutex(const Mutex&); 581abddd9f6225298066094e20a6c29061b6af4590Nick Chalko Mutex& operator=(const Mutex&); 591abddd9f6225298066094e20a6c29061b6af4590Nick Chalko}; 601abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 611abddd9f6225298066094e20a6c29061b6af4590Nick Chalko#endif // MUTEX_H_ 62