+
+// 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";
+ }
+ }
+};
+
+void yf::LoadBalance::Impl::add_session(unsigned long session_id,
+ std::string target){
+
+ // finding and adding session
+ std::map<unsigned long, std::string>::iterator isess;
+ isess = m_session_target.find(session_id);
+ if (isess == m_session_target.end()){
+ m_session_target.insert(std::make_pair(session_id, target));
+ }
+
+ // finding and adding target statistics
+ std::map<std::string, TargetStat>::iterator itarg;
+ itarg = m_target_stat.find(target);
+ if (itarg == m_target_stat.end()){
+ TargetStat stat;
+ stat.sessions = 1;
+ stat.packages = 0; // no idea why the defaut constructor TargetStat()
+ stat.deads = 0; // is not initializig this correctly to zero ??
+ m_target_stat.insert(std::make_pair(target, stat));
+ // std:.cout << "add_session " << session_id << " " << target
+ // << " s:1\n";
+ }
+ else if (itarg->second.sessions < std::numeric_limits<unsigned int>::max())
+ {
+ itarg->second.sessions += 1;
+ // std:.cout << "add_session " << session_id << " " << target
+ // << " s:" << itarg->second.sessions << "\n";
+ }
+};
+
+void yf::LoadBalance::Impl::remove_session(unsigned long session_id){
+
+ std::string target;
+
+ // finding session
+ std::map<unsigned long, std::string>::iterator isess;
+ isess = m_session_target.find(session_id);
+ if (isess == m_session_target.end())
+ return;
+ else
+ target = isess->second;
+
+ // finding target statistics
+ std::map<std::string, TargetStat>::iterator itarg;
+ itarg = m_target_stat.find(target);
+ if (itarg == m_target_stat.end()){
+ m_session_target.erase(isess);
+ return;
+ }
+
+ // counting session down
+ if (itarg->second.sessions > 0)
+ itarg->second.sessions -= 1;
+
+ // std:.cout << "remove_session " << session_id << " " << target
+ // << " s:" << itarg->second.sessions << "\n";
+
+ // clearing empty sessions and targets
+ if (itarg->second.sessions == 0 && itarg->second.deads == 0 ){
+ m_target_stat.erase(itarg);
+ m_session_target.erase(isess);
+ }
+};
+
+std::string
+yf::LoadBalance::Impl::find_session_target(unsigned long session_id){
+
+ std::string target;
+ std::map<unsigned long, std::string>::iterator isess;
+ isess = m_session_target.find(session_id);
+ if (isess != m_session_target.end())
+ target = isess->second;
+ return target;
+}
+
+
+// cost functions
+unsigned int yf::LoadBalance::Impl::cost(std::string target){
+
+ unsigned int cost;
+
+ if (target.size() != 0){
+ std::map<std::string, TargetStat>::iterator itarg;
+ itarg = m_target_stat.find(target);
+ if (itarg != m_target_stat.end()){
+ cost = itarg->second.cost();
+ }
+ }
+
+ //std::cout << "cost " << target << " c:" << cost << "\n";
+ return cost;
+};
+
+unsigned int yf::LoadBalance::Impl::dead(std::string target){
+
+ unsigned int dead;
+
+ if (target.size() != 0){
+ std::map<std::string, TargetStat>::iterator itarg;
+ itarg = m_target_stat.find(target);
+ if (itarg != m_target_stat.end()){
+ dead = itarg->second.deads;
+ }
+ }
+
+ //std::cout << "dead " << target << " d:" << dead << "\n";
+ return dead;
+};
+
+