X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_session_shared.cpp;h=099b47fd21b0b9baa2aa1bef69e285a0aebeeb83;hb=586d78659d671683f33ec55f4a7d32b28e345ccd;hp=d14dc1b140c728275524659b244cdc27e5310989;hpb=c4e649b6b0210d9c714cf166f246a3f2d66c12c8;p=metaproxy-moved-to-github.git diff --git a/src/filter_session_shared.cpp b/src/filter_session_shared.cpp index d14dc1b..099b47f 100644 --- a/src/filter_session_shared.cpp +++ b/src/filter_session_shared.cpp @@ -305,27 +305,29 @@ void yf::SessionShared::BackendClass::release_backend(BackendInstancePtr b) void yf::SessionShared::BackendClass::remove_backend(BackendInstancePtr b) { - BackendInstanceList::iterator it = m_backend_list.begin(); - - while (it != m_backend_list.end()) { - if (*it == b) + boost::mutex::scoped_lock lock(m_mutex_backend_class); + BackendInstanceList::iterator it = m_backend_list.begin(); + for (;;) { - mp::odr odr; - (*it)->m_close_package->response() = odr.create_close( - 0, Z_Close_lackOfActivity, 0); - (*it)->m_close_package->session().close(); - (*it)->m_close_package->move(); - - it = m_backend_list.erase(it); - } - else + if (it == m_backend_list.end()) + return; + if (*it == b) + { + it = m_backend_list.erase(it); + break; + } it++; + } } + mp::odr odr; + b->m_close_package->response() = odr.create_close( + 0, Z_Close_lackOfActivity, 0); + b->m_close_package->session().close(); + b->m_close_package->move(); } - yf::SessionShared::BackendInstancePtr yf::SessionShared::BackendClass::get_backend( const mp::Package &frontend_package) @@ -369,6 +371,14 @@ void yf::SessionShared::BackendInstance::timestamp() yf::SessionShared::BackendInstance::~BackendInstance() { + if (m_close_package) + { + mp::odr odr; + m_close_package->response() = odr.create_close( + 0, Z_Close_lackOfActivity, 0); + m_close_package->session().close(); + m_close_package->move(); + } delete m_close_package; } @@ -1214,12 +1224,6 @@ bool yf::SessionShared::BackendClass::expire_instances() } else if (now < last_use || now - last_use > m_backend_expiry_ttl) { - mp::odr odr; - (*bit)->m_close_package->response() = odr.create_close( - 0, Z_Close_lackOfActivity, 0); - (*bit)->m_close_package->session().close(); - (*bit)->m_close_package->move(); - bit = m_backend_list.erase(bit); } else