Advertisement
Guest User

Untitled

a guest
May 25th, 2014
299
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.30 KB | None | 0 0
  1. #include "io_service_pool.hpp"
  2.  
  3. #include <boost/thread/thread.hpp>
  4. #include <algorithm>
  5.  
  6. namespace conn
  7. {
  8.     IoServicePool::IoServicePool(std::size_t size)
  9.     {
  10.         for (std::size_t i = 0; i < size; ++i)
  11.         {
  12.             std::shared_ptr<IoServiceInfo> info(new IoServiceInfo());
  13.            
  14.             info->m_connections = 0;
  15.             info->m_io_service = std::make_shared<boost::asio::io_service>();
  16.             std::shared_ptr<boost::asio::io_service::work> work(new boost::asio::io_service::work(*info->m_io_service));
  17.  
  18.             m_io_services.push_back(info);
  19.             m_work.push_back(work);
  20.         }
  21.  
  22.         m_worker_service = std::make_shared<boost::asio::io_service>();
  23.         std::shared_ptr<boost::asio::io_service::work> work(new boost::asio::io_service::work(*m_worker_service));
  24.         m_work.push_back(work);
  25.     }
  26.  
  27.     void IoServicePool::Run()
  28.     {
  29.         for (std::size_t i = 0; i < m_io_services.size(); ++i)
  30.         {
  31.             std::shared_ptr<std::thread> thread(new std::thread(
  32.                 boost::bind(&boost::asio::io_service::run, m_io_services[i]->m_io_service)));
  33.  
  34.             m_io_services[i]->m_id = thread->get_id();
  35.             m_threads.push_back(thread);
  36.         }
  37.  
  38.         std::shared_ptr<std::thread> thread(new std::thread(
  39.             boost::bind(&boost::asio::io_service::run, m_worker_service)));
  40.         m_threads.push_back(thread);
  41.     }
  42.  
  43.     void IoServicePool::Stop()
  44.     {
  45.         for (std::size_t i = 0; i < m_io_services.size(); ++i)
  46.             m_io_services[i]->m_io_service->stop();
  47.  
  48.         m_worker_service->stop();
  49.  
  50.         for (std::size_t i = 0; i < m_threads.size(); i++)
  51.             m_threads[i]->join();
  52.     }
  53.  
  54.     void IoServicePool::ConnectionClosed(std::thread::id &id)
  55.     {
  56.         m_mutex.lock();
  57.        
  58.         for (dword i = 0; i < m_io_services.size(); i++)
  59.         {
  60.             if (m_io_services[i]->m_id == id)
  61.                 m_io_services[i]->m_connections -= 1;
  62.         }
  63.  
  64.         m_mutex.unlock();
  65.     }
  66.  
  67.     std::shared_ptr<IoServiceInfo> IoServicePool::get_io_service()
  68.     {
  69.         m_mutex.lock();
  70.        
  71.         dword pool = 0;
  72.         dword lowest = m_io_services[0]->m_connections;
  73.  
  74.         for (dword i = 1; i < m_io_services.size(); i++)
  75.         {
  76.             if (m_io_services[i]->m_connections < lowest)
  77.             {
  78.                 lowest = m_io_services[i]->m_connections;
  79.                 pool = i;
  80.             }
  81.         }
  82.  
  83.         m_io_services[pool]->m_connections += 1;
  84.  
  85.         m_mutex.unlock();
  86.  
  87.         return m_io_services[pool];
  88.     }
  89.  
  90.     std::shared_ptr<boost::asio::io_service> IoServicePool::get_io_worker_service()
  91.     {
  92.         return m_worker_service;
  93.     }
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement