Change Mutex class to make it possible for caller to decide if abort
---
src/base/logtrace_client.cc | 5 ++++-
src/base/mutex.cc | 2 +-
src/base/mutex.h | 22 +++++++++++++---------
3 files changed, 18 insertions(+), 11 deletions(-)
diff --git a/src/base/logtrace_client.cc b/src/base/logtrace_client.cc
index 0dac6d389..f597c1ae3 100644
--- a/src/base/logtrace_client.cc
+++ b/src/base/logtrace_client.cc
@@ -76,7 +76,7 @@ bool TraceLog::Init(const char *msg_id, WriteMode mode) {
msg_id_ = base::LogMessage::MsgId{msg_id};
log_socket_ = new base::UnixClientSocket{Osaflog::kServerSocketPath,
static_cast<base::UnixSocket::Mode>(mode)};
- mutex_ = new base::Mutex{};
+ mutex_ = new base::Mutex{false};
return true;
}
@@ -91,6 +91,9 @@ void TraceLog::Log(base::LogMessage::Severity severity, const
char *fmt,
void TraceLog::LogInternal(base::LogMessage::Severity severity, const char
*fmt,
va_list ap) {
base::Lock lock(*mutex_);
+
+ if (!mutex_->good()) return;
+
uint32_t id = sequence_id_;
sequence_id_ = id < kMaxSequenceId ? id + 1 : 1;
buffer_.clear();
diff --git a/src/base/mutex.cc b/src/base/mutex.cc
index 5fa6ac55a..1627ac20b 100644
--- a/src/base/mutex.cc
+++ b/src/base/mutex.cc
@@ -20,7 +20,7 @@
namespace base {
-Mutex::Mutex() : mutex_{} {
+Mutex::Mutex(bool abort) : abort_{abort}, mutex_{}, result_{0} {
pthread_mutexattr_t attr;
int result = pthread_mutexattr_init(&attr);
if (result != 0) osaf_abort(result);
diff --git a/src/base/mutex.h b/src/base/mutex.h
index 7b3cee187..e3c54a711 100644
--- a/src/base/mutex.h
+++ b/src/base/mutex.h
@@ -31,30 +31,34 @@ namespace base {
class Mutex {
public:
using NativeHandleType = pthread_mutex_t*;
- Mutex();
+ Mutex(bool abort = true);
~Mutex();
void Lock() {
- int result = pthread_mutex_lock(&mutex_);
- if (result != 0) osaf_abort(result);
+ result_ = pthread_mutex_lock(&mutex_);
+ if (abort_ && result_ != 0) osaf_abort(result_);
}
bool TryLock() {
- int result = pthread_mutex_trylock(&mutex_);
- if (result == 0) {
+ result_ = pthread_mutex_trylock(&mutex_);
+ if (result_ == 0) {
return true;
- } else if (result == EBUSY) {
+ } else if (result_ == EBUSY) {
return false;
} else {
- osaf_abort(result);
+ if (abort_) osaf_abort(result_);
+ return false;
}
}
void Unlock() {
- int result = pthread_mutex_unlock(&mutex_);
- if (result != 0) osaf_abort(result);
+ result_ = pthread_mutex_unlock(&mutex_);
+ if (abort_ && result_ != 0) osaf_abort(result_);
}
NativeHandleType native_handle() { return &mutex_; }
+ bool good() const {return result_ == 0;};
private:
+ bool abort_;
pthread_mutex_t mutex_;
+ int result_;
DELETE_COPY_AND_MOVE_OPERATORS(Mutex);
};
--
2.17.0
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel