+ 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 += 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 -= 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;
+ m_target_stat.insert(std::make_pair(target, stat));
+ std::cout << "add_session " << session_id << " " << target
+ << " s:1\n";
+ } else {
+ 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
+ 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){
+ 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;