libzypp  13.10.6
Mutex.cc
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
11 #include "zypp/thread/Mutex.h"
13 #include "zypp/base/Gettext.h"
14 
15 
17 namespace zypp
18 {
19 
21  namespace thread
22  {
23 
24  // -------------------------------------------------------------
26  {
27  pthread_mutexattr_t attr;
28 
29  int ret = pthread_mutexattr_init(&attr);
30  if( ret != 0)
31  {
33  _("Can't initialize mutex attributes"));
34  }
35 
36  ret = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
37  if( ret != 0)
38  {
40  _("Can't set recursive mutex attribute"));
41  }
42 
43  ret = pthread_mutex_init(&m_mutex, &attr);
44  if( ret != 0)
45  {
47  _("Can't initialize recursive mutex"));
48  }
49  }
50 
51  // -------------------------------------------------------------
53  {
54  if( pthread_mutex_destroy(&m_mutex) != 0 && errno == EBUSY)
55  {
56  // try to unlock and to destroy again...
57  if( pthread_mutex_unlock(&m_mutex) == 0)
58  {
59  pthread_mutex_destroy(&m_mutex);
60  }
61  /*
62  else
63  {
64  ZYPP_THROW_ERRNO_MSG(MutexException,
65  _("Can't destroy mutex owned by another thread"));
66  }
67  */
68  }
69  }
70 
71  // -------------------------------------------------------------
72  void Mutex::lock()
73  {
74  if( pthread_mutex_lock(&m_mutex) != 0)
75  {
77  _("Can't acquire the mutex lock"));
78  }
79  }
80 
81  // -------------------------------------------------------------
83  {
84  if( pthread_mutex_unlock(&m_mutex) != 0)
85  {
87  _("Can't release the mutex lock"));
88  }
89  }
90 
91  // -------------------------------------------------------------
93  {
94  return (pthread_mutex_trylock(&m_mutex) == 0);
95  }
96 
97 
99  } // namespace thread
101 
103 } // namespace zypp
105 
106 /*
107 ** vim: set ts=2 sts=2 sw=2 ai et:
108 */
Interface to gettext.
sat::SolvAttr attr
Definition: PoolQuery.cc:303
bool trylock()
Try to acquire ownership of this Mutex object.
Definition: Mutex.cc:92
Exception type thrown on mutex errors.
#define ZYPP_THROW_ERRNO_MSG(EXCPTTYPE, MSG)
Throw Exception built from errno and a message string.
Definition: Exception.h:345
#define _(MSG)
Return translated text.
Definition: Gettext.h:21
void lock()
Acquire ownership of this Mutex object.
Definition: Mutex.cc:72
Mutex()
Create a new recursive Mutex object.
Definition: Mutex.cc:25
void unlock()
Release ownership of this Mutex object.
Definition: Mutex.cc:82
~Mutex()
Destroys this Mutex object.
Definition: Mutex.cc:52
RecursiveMutex_t m_mutex
Definition: Mutex.h:82