e8871d08759fbc27259b9241f77b4548f3f28405
[platform/upstream/libzypp.git] / zypp / thread / MutexLock.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/thread/MutexLock.h
10  *
11 */
12 #ifndef   ZYPP_THREAD_MUTEXLOCK_H
13 #define   ZYPP_THREAD_MUTEXLOCK_H
14
15 #include "zypp/thread/Mutex.h"
16 #include <cassert>
17
18
19 //////////////////////////////////////////////////////////////////////
20 namespace zypp
21 { ////////////////////////////////////////////////////////////////////
22   ////////////////////////////////////////////////////////////////////
23   namespace thread
24   { //////////////////////////////////////////////////////////////////
25
26
27     // -------------------------------------------------------------
28     class MutexLock
29     {
30     public:
31       explicit MutexLock(Mutex &mutex, bool init_locked=true)
32         : m_mutex(&mutex)
33         , m_locked(false)
34       {
35         if(init_locked)
36           lock();
37       }
38
39       MutexLock(const MutexLock &ref)
40         : m_mutex( ref.m_mutex)
41         , m_locked(ref.m_locked)
42       {
43         ref.m_locked = false;
44       }
45
46       ~MutexLock()
47       {
48         try
49         {
50           if( m_locked)
51             unlock();
52         }
53         catch( ... )
54         {
55           // don't let exceptions escape
56         }
57       }
58
59       void lock()
60       {
61         assert(m_locked == false);
62         m_mutex->lock();
63         m_locked = true;
64       }
65
66       void unlock()
67       {
68         assert(m_locked == true);
69         m_mutex->unlock();
70         m_locked = false;
71       }
72
73       bool trylock()
74       {
75         assert(m_locked == false);
76         m_locked = m_mutex->trylock();
77         return m_locked;
78       }
79
80       bool locked()
81       {
82         return m_locked;
83       }
84
85     private:
86       Mutex        *m_mutex;
87       mutable bool  m_locked;
88       //friend class Condition;
89     };
90
91
92     //////////////////////////////////////////////////////////////////
93   } // namespace thread
94   ////////////////////////////////////////////////////////////////////
95   ////////////////////////////////////////////////////////////////////
96 } // namespace zypp
97 //////////////////////////////////////////////////////////////////////
98
99 #endif // ZYPP_THREAD_MUTEXLOCK_H
100 /*
101 ** vim: set ts=2 sts=2 sw=2 ai et:
102 */