LCOV - code coverage report
Current view: top level - media/libstagefright/system/core/include/utils - Mutex.h (source / functions) Hit Total Coverage
Test: output.info Lines: 1 6 16.7 %
Date: 2017-07-14 16:53:18 Functions: 1 6 16.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright (C) 2007 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             : #ifndef _LIBS_UTILS_MUTEX_H
      18             : #define _LIBS_UTILS_MUTEX_H
      19             : 
      20             : #include <stdint.h>
      21             : #include <sys/types.h>
      22             : #include <time.h>
      23             : 
      24             : #if defined(HAVE_PTHREADS)
      25             : # include <pthread.h>
      26             : #endif
      27             : 
      28             : #include <utils/Errors.h>
      29             : 
      30             : // ---------------------------------------------------------------------------
      31             : namespace stagefright {
      32             : // ---------------------------------------------------------------------------
      33             : 
      34             : class Condition;
      35             : 
      36             : /*
      37             :  * Simple mutex class.  The implementation is system-dependent.
      38             :  *
      39             :  * The mutex must be unlocked by the thread that locked it.  They are not
      40             :  * recursive, i.e. the same thread can't lock it multiple times.
      41             :  */
      42             : class Mutex {
      43             : public:
      44             :     enum {
      45             :         PRIVATE = 0,
      46             :         SHARED = 1
      47             :     };
      48             :     
      49             :                 Mutex();
      50             :                 Mutex(const char* name);
      51             :                 Mutex(int type, const char* name = NULL);
      52             :                 ~Mutex();
      53             : 
      54             :     // lock or unlock the mutex
      55             :     status_t    lock();
      56             :     void        unlock();
      57             : 
      58             :     // lock if possible; returns 0 on success, error otherwise
      59             :     status_t    tryLock();
      60             : 
      61             :     // Manages the mutex automatically. It'll be locked when Autolock is
      62             :     // constructed and released when Autolock goes out of scope.
      63             :     class Autolock {
      64             :     public:
      65           0 :         inline Autolock(Mutex& mutex) : mLock(mutex)  { mLock.lock(); }
      66             :         inline Autolock(Mutex* mutex) : mLock(*mutex) { mLock.lock(); }
      67           0 :         inline ~Autolock() { mLock.unlock(); }
      68             :     private:
      69             :         Mutex& mLock;
      70             :     };
      71             : 
      72             : private:
      73             :     friend class Condition;
      74             :     
      75             :     // A mutex cannot be copied
      76             :                 Mutex(const Mutex&);
      77             :     Mutex&      operator = (const Mutex&);
      78             :     
      79             : #if defined(HAVE_PTHREADS)
      80             :     pthread_mutex_t mMutex;
      81             : #else
      82             :     void    _init();
      83             :     void*   mState;
      84             : #endif
      85             : };
      86             : 
      87             : // ---------------------------------------------------------------------------
      88             : 
      89             : #if defined(HAVE_PTHREADS)
      90             : 
      91             : inline Mutex::Mutex() {
      92             :     pthread_mutex_init(&mMutex, NULL);
      93             : }
      94             : inline Mutex::Mutex(__attribute__((unused)) const char* name) {
      95             :     pthread_mutex_init(&mMutex, NULL);
      96             : }
      97             : inline Mutex::Mutex(int type, __attribute__((unused)) const char* name) {
      98             :     if (type == SHARED) {
      99             :         pthread_mutexattr_t attr;
     100             :         pthread_mutexattr_init(&attr);
     101             :         pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
     102             :         pthread_mutex_init(&mMutex, &attr);
     103             :         pthread_mutexattr_destroy(&attr);
     104             :     } else {
     105             :         pthread_mutex_init(&mMutex, NULL);
     106             :     }
     107             : }
     108             : inline Mutex::~Mutex() {
     109             :     pthread_mutex_destroy(&mMutex);
     110             : }
     111             : inline status_t Mutex::lock() {
     112             :     return -pthread_mutex_lock(&mMutex);
     113             : }
     114             : inline void Mutex::unlock() {
     115             :     pthread_mutex_unlock(&mMutex);
     116             : }
     117             : inline status_t Mutex::tryLock() {
     118             :     return -pthread_mutex_trylock(&mMutex);
     119             : }
     120             : 
     121             : #else
     122             : 
     123           3 : inline Mutex::Mutex() {}
     124             : inline Mutex::Mutex(const char* name) {}
     125             : inline Mutex::Mutex(int type, const char* name) {}
     126           0 : inline Mutex::~Mutex() {}
     127           0 : inline status_t Mutex::lock() { return OK; }
     128           0 : inline void Mutex::unlock() {}
     129             : inline status_t Mutex::tryLock() { return OK; }
     130             : inline void Mutex::_init() {}
     131             : 
     132             : #endif // HAVE_PTHREADS
     133             : 
     134             : // ---------------------------------------------------------------------------
     135             : 
     136             : /*
     137             :  * Automatic mutex.  Declare one of these at the top of a function.
     138             :  * When the function returns, it will go out of scope, and release the
     139             :  * mutex.
     140             :  */
     141             :  
     142             : typedef Mutex::Autolock AutoMutex;
     143             : 
     144             : // ---------------------------------------------------------------------------
     145             : }; // namespace stagefright
     146             : // ---------------------------------------------------------------------------
     147             : 
     148             : #endif // _LIBS_UTILS_MUTEX_H

Generated by: LCOV version 1.13