libzypp
11.13.5
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
Mutex.cc
Go to the documentation of this file.
1
/*---------------------------------------------------------------------\
2
| ____ _ __ __ ___ |
3
| |__ / \ / / . \ . \ |
4
| / / \ V /| _/ _/ |
5
| / /__ | | | | | | |
6
| /_____||_| |_| |_| |
7
| |
8
\---------------------------------------------------------------------*/
11
#include "
zypp/thread/Mutex.h
"
12
#include "
zypp/thread/MutexException.h
"
13
#include "
zypp/base/Gettext.h
"
14
15
17
namespace
zypp
18
{
19
21
namespace
thread
22
{
23
24
// -------------------------------------------------------------
25
Mutex::Mutex
()
26
{
27
pthread_mutexattr_t
attr
;
28
29
int
ret = pthread_mutexattr_init(&attr);
30
if
( ret != 0)
31
{
32
ZYPP_THROW_ERRNO_MSG
(
zypp::thread::MutexException
,
33
_
(
"Can't initialize mutex attributes"
));
34
}
35
36
ret = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
37
if
( ret != 0)
38
{
39
ZYPP_THROW_ERRNO_MSG
(
MutexException
,
40
_
(
"Can't set recursive mutex attribute"
));
41
}
42
43
ret = pthread_mutex_init(&
m_mutex
, &attr);
44
if
( ret != 0)
45
{
46
ZYPP_THROW_ERRNO_MSG
(
MutexException
,
47
_
(
"Can't initialize recursive mutex"
));
48
}
49
}
50
51
// -------------------------------------------------------------
52
Mutex::~Mutex
()
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
{
76
ZYPP_THROW_ERRNO_MSG
(
MutexException
,
77
_
(
"Can't acquire the mutex lock"
));
78
}
79
}
80
81
// -------------------------------------------------------------
82
void
Mutex::unlock
()
83
{
84
if
( pthread_mutex_unlock(&
m_mutex
) != 0)
85
{
86
ZYPP_THROW_ERRNO_MSG
(
MutexException
,
87
_
(
"Can't release the mutex lock"
));
88
}
89
}
90
91
// -------------------------------------------------------------
92
bool
Mutex::trylock
()
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
*/
zypp
thread
Mutex.cc
Generated by
1.8.1