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