+ // checking for closed back end packages
+ if (package.session().is_closed())
+ is_closed_back = true;
+
+ Z_GDU *gdu_res = package.response().get();
+
+ // passing anything but z3950 packages
+ if (gdu_res && gdu_res->which == Z_GDU_Z3950){
+
+ // session closing only on Z39.50 close response
+ if (gdu_res->u.z3950->which == Z_APDU_close){
+ is_closed_back = true;
+ boost::mutex::scoped_lock scoped_lock(m_mutex);
+ remove_package(package.session().id());
+ }
+ // any other Z39.50 package is removed from statistics
+ else {
+ boost::mutex::scoped_lock scoped_lock(m_mutex);
+ remove_package(package.session().id());
+ }
+ }
+
+ // finally removing sessions and marking deads
+ if (is_closed_back || is_closed_front){
+ boost::mutex::scoped_lock scoped_lock(m_mutex);
+
+ // marking backend dead if backend closed without fronted close
+ if (is_closed_front == false)
+ add_dead(package.session().id());
+
+ remove_session(package.session().id());
+
+ // making sure that package is closed
+ package.session().close();
+ }
+}
+
+// statistic manipulating functions,
+void yf::LoadBalance::Impl::add_dead(unsigned long session_id){
+
+
+ std::string target = find_session_target(session_id);
+
+ if (target.size() != 0){
+ std::map<std::string, TargetStat>::iterator itarg;
+ itarg = m_target_stat.find(target);
+ if (itarg != m_target_stat.end()
+ && itarg->second.deads < std::numeric_limits<unsigned int>::max()){
+ itarg->second.deads += 1;
+ // std:.cout << "add_dead " << session_id << " " << target
+ // << " d:" << itarg->second.deads << "\n";
+ }
+ }
+};
+
+//void yf::LoadBalance::Impl::clear_dead(unsigned long session_id){
+// std::cout << "clear_dead " << session_id << "\n";
+//};
+
+void yf::LoadBalance::Impl::add_package(unsigned long session_id){
+
+ std::string target = find_session_target(session_id);
+
+ if (target.size() != 0){
+ std::map<std::string, TargetStat>::iterator itarg;
+ itarg = m_target_stat.find(target);
+ if (itarg != m_target_stat.end()
+ && itarg->second.packages
+ < std::numeric_limits<unsigned int>::max()){
+ itarg->second.packages += 1;
+ // std:.cout << "add_package " << session_id << " " << target
+ // << " p:" << itarg->second.packages << "\n";
+ }
+ }
+};
+
+void yf::LoadBalance::Impl::remove_package(unsigned long session_id){
+ std::string target = find_session_target(session_id);
+
+ if (target.size() != 0){
+ std::map<std::string, TargetStat>::iterator itarg;
+ itarg = m_target_stat.find(target);
+ if (itarg != m_target_stat.end()
+ && itarg->second.packages > 0){
+ itarg->second.packages -= 1;
+ // std:.cout << "remove_package " << session_id << " " << target
+ // << " p:" << itarg->second.packages << "\n";
+ }
+ }
+};