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
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to