]> git.stg.codes - stg.git/commitdiff
Fixed mutex locking.
authorMaxim Mamontov <faust.madf@gmail.com>
Sat, 12 Sep 2015 12:14:09 +0000 (15:14 +0300)
committerMaxim Mamontov <faust.madf@gmail.com>
Sat, 12 Sep 2015 12:14:09 +0000 (15:14 +0300)
projects/rlm_stg/conn.cpp
projects/rlm_stg/stg_client.cpp

index 625245189efe4f837b74ab39c97992d82473ff37..ed0b7a61a16d4c7ae590d351213d47cdc6594b4c 100644 (file)
@@ -312,6 +312,30 @@ ChannelConfig::ChannelConfig(std::string addr)
         throw Error("Invalid port value.");
 }
 
+Conn::Conn(const std::string& address, Callback callback, void* data)
+    : m_impl(new Impl(address, callback, data))
+{
+}
+
+Conn::~Conn()
+{
+}
+
+bool Conn::stop()
+{
+    return m_impl->stop();
+}
+
+bool Conn::connected() const
+{
+    return m_impl->connected();
+}
+
+bool Conn::request(REQUEST_TYPE type, const std::string& userName, const std::string& password, const PAIRS& pairs)
+{
+    return m_impl->request(type, userName, password, pairs);
+}
+
 Conn::Impl::Impl(const std::string& address, Callback callback, void* data)
     : m_config(address),
       m_sock(connect()),
index 96d54afd9341fdc8597acf5723fd4df29e503a75..75109511c507b6822c9b3156985d187be227ae29 100644 (file)
@@ -23,6 +23,7 @@
 #include "conn.h"
 #include "radlog.h"
 
+#include "stg/locker.h"
 #include "stg/common.h"
 
 #include <map>
@@ -44,7 +45,7 @@ class Client::Impl
         Impl(const std::string& address);
         ~Impl();
 
-        bool stop() { return m_conn->stop(); }
+        bool stop() { return m_conn ? m_conn->stop() : true; }
 
         RESULT request(REQUEST_TYPE type, const std::string& userName, const std::string& password, const PAIRS& pairs);
 
@@ -61,20 +62,26 @@ class Client::Impl
         static bool callback(void* data, const RESULT& result, bool status)
         {
             Impl& impl = *static_cast<Impl*>(data);
-            pthread_mutex_lock(&impl.m_mutex);
+            STG_LOCKER lock(impl.m_mutex);
             impl.m_result = result;
             impl.m_status = status;
             impl.m_done = true;
             pthread_cond_signal(&impl.m_cond);
-            pthread_mutex_unlock(&impl.m_mutex);
             return true;
         }
 };
 
 Client::Impl::Impl(const std::string& address)
-    : m_address(address),
-      m_conn(new Conn(m_address, &Impl::callback, this))
+    : m_address(address)
 {
+    try
+    {
+        m_conn.reset(new Conn(m_address, &Impl::callback, this));
+    }
+    catch (const std::runtime_error& ex)
+    {
+        RadLog("Connection error: %s.", ex.what());
+    }
     pthread_mutex_init(&m_mutex, NULL);
     pthread_cond_init(&m_cond, NULL);
     m_done = false;
@@ -88,8 +95,8 @@ Client::Impl::~Impl()
 
 RESULT Client::Impl::request(REQUEST_TYPE type, const std::string& userName, const std::string& password, const PAIRS& pairs)
 {
-    pthread_mutex_lock(&m_mutex);
-    if (!m_conn->connected())
+    STG_LOCKER lock(m_mutex);
+    if (!m_conn || !m_conn->connected())
         m_conn.reset(new Conn(m_address, &Impl::callback, this));
     if (!m_conn->connected())
         throw Conn::Error("Failed to create connection to '" + m_address + "'.");
@@ -102,7 +109,6 @@ RESULT Client::Impl::request(REQUEST_TYPE type, const std::string& userName, con
     int res = 0;
     while (!m_done && res == 0)
         res = pthread_cond_timedwait(&m_cond, &m_mutex, &ts);
-    pthread_mutex_unlock(&m_mutex);
     if (res != 0 || !m_status)
         throw Conn::Error("Request failed.");
     return m_result;