c++: fix C++11 compatibility
[awesomized/libmemcached] / libtest / thread.hpp
index 05f7fad4522220c4734d56c9fd43568c398b86b6..640cb66a06e2f3aac0c6e4ed750ab8b8e21fb356 100644 (file)
 
 #include <pthread.h>
 
+#if __cplusplus < 201103L
+# define noexcept(a)
+#endif
+
 namespace libtest
 {
 namespace thread
@@ -46,30 +50,32 @@ namespace thread
 class Mutex
 {
 public:
-  Mutex()
+  Mutex() :
+    _err(0)
   {
-    int err;
-    if ((err= pthread_mutex_init(&_mutex, NULL)))
-    {
-      throw libtest::fatal(LIBYATL_DEFAULT_PARAM, "pthread_mutex_init: %s", strerror(err));
-    }
+    _err= pthread_mutex_init(&_mutex, NULL);
   }
 
-  ~Mutex()
+  ~Mutex() noexcept(false)
   {
-    int err;
-    if ((err= pthread_mutex_destroy(&_mutex)))
+    if ((_err= pthread_mutex_destroy(&_mutex)))
     {
-      throw libtest::fatal(LIBYATL_DEFAULT_PARAM, "pthread_cond_destroy: %s", strerror(err));
+      throw libtest::fatal(LIBYATL_DEFAULT_PARAM, "pthread_cond_destroy: %s", strerror(_err));
     }
   }
 
   pthread_mutex_t* handle()
   {
+    if (_err != 0)
+    {
+      throw libtest::fatal(LIBYATL_DEFAULT_PARAM, "pthread_mutex_init: %s", strerror(_err));
+    }
+
     return &_mutex;
   }
 
 private:
+  int _err;
   pthread_mutex_t _mutex;
 };
 
@@ -82,7 +88,7 @@ public:
     init();
   }
 
-  ~ScopedLock()
+  ~ScopedLock() noexcept(false)
   {
     int err;
     if ((err= pthread_mutex_unlock(_mutex.handle())))
@@ -122,7 +128,7 @@ public:
     }
   }
 
-  ~Condition()
+  ~Condition() noexcept(false)
   {
     int err;
     if ((err= pthread_cond_destroy(&_cond)))
@@ -165,7 +171,7 @@ private:
 class Barrier
 {
 public:
-  Barrier(uint32_t count): 
+  explicit Barrier(uint32_t count): 
     _threshold(count),
     _count(count),
     _generation(0)