+yf::SRUtoZ3950::Frontend::Frontend() : m_level(1), m_is_closed(false)
+{
+}
+
+yf::SRUtoZ3950::Frontend::~Frontend()
+{
+}
+
+
+yf::SRUtoZ3950::FrontendPtr yf::SRUtoZ3950::Impl::get_frontend(
+ mp::Package &package, int &level)
+{
+ boost::mutex::scoped_lock lock(m_mutex_session);
+
+ std::map<mp::Session,yf::SRUtoZ3950::FrontendPtr>::iterator it;
+
+ it = m_clients.find(package.session());
+ if (it != m_clients.end())
+ {
+ level = ++it->second->m_level;
+ if (package.session().is_closed())
+ it->second->m_is_closed = true;
+ return it->second;
+ }
+ FrontendPtr f(new Frontend);
+ m_clients[package.session()] = f;
+ level = f->m_level;
+ if (package.session().is_closed())
+ f->m_is_closed = true;
+ return f;
+}
+
+
+void yf::SRUtoZ3950::Impl::release_frontend(FrontendPtr f, int &level)
+{
+ boost::mutex::scoped_lock lock(m_mutex_session);
+
+ while (level != f->m_level)
+ f->m_cond_session_ready.wait(lock);
+ f->m_level--;
+ f->m_cond_session_ready.notify_all();
+}
+