Ignore:
Timestamp:
05/16/09 13:20:26 (10 years ago)
Author:
Eoin
Message:

Adding an asio based threadpool instead of manually try to approximate the behaviour.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/halSession.cpp

    r746 r759  
    3232 
    3333bit_impl::bit_impl() : 
    34         keepChecking_(false), 
     34        keep_checking_(false), 
    3535        bittorrent_ini_(L"BitTorrent.xml"), 
    3636        the_torrents_(bittorrent_ini_), 
     
    117117        } 
    118118         
     119        acquire_work_object(); 
     120 
     121        service_threads_.push_back(shared_thread_ptr(new  
     122                thread_t(bind(&bit_impl::service_thread, this, service_threads_.size())))); 
     123 
    119124        start_alert_handler(); 
    120125 
     
    128133        HAL_DEV_MSG(L"Commence ~BitTorrent_impl");  
    129134 
    130         stop_alert_handler();    
     135        discard_work_object(); 
     136 
     137        stop_alert_handler(); 
     138 
     139        for (std::vector<shared_thread_ptr>::iterator i=service_threads_.begin(), e=service_threads_.end(); i != e; ++i) 
     140                (*i)->join(); 
     141 
    131142        //save_torrent_data(); 
    132143         
     
    365376        mutex_t::scoped_lock l(mutex_); 
    366377 
    367         if (alert_checker_ == boost::none) 
     378        if (!keep_checking_) 
     379        { 
     380                keep_checking_ = true; 
     381 
     382                boost::asio::deadline_timer t(io_service_, pt::milliseconds(100)); 
     383                io_service_.post(bind(&bit_impl::alert_handler, this)); 
     384        } 
     385        else 
     386        { 
     387                HAL_DEV_MSG(hal::wform(L"Alert handler already active")); 
     388        } 
     389 
     390/*      if (alert_checker_ == boost::none) 
    368391        {        
    369392                HAL_DEV_MSG(hal::wform(L"start_alert_handler")); 
     
    373396                keepChecking_ = true; 
    374397                alert_checker_ = boost::in_place<boost::function<void (void)> >(bind(&bit_impl::alert_handler, this)); 
    375         } 
     398        }       */ 
    376399} 
    377400         
     
    380403        mutex_t::scoped_lock l(mutex_); 
    381404 
    382         keepChecking_ = false; 
    383  
    384         if (alert_checker_) 
    385         { 
    386                 HAL_DEV_MSG(hal::wform(L"Interrupting alert handler")); 
    387  
    388                 alert_checker_->interrupt(); 
    389                 alert_checker_->join(); 
    390                 alert_checker_ = boost::none; 
     405        if (keep_checking_) 
     406        { 
     407                HAL_DEV_MSG(hal::wform(L"Stopping alert handler..."));           
     408 
     409                keep_checking_ = false; 
    391410        } 
    392411        else 
     
    396415} 
    397416         
     417void bit_impl::service_thread(size_t id) 
     418{ 
     419        win32_exception::install_handler(); 
     420 
     421        HAL_DEV_MSG(hal::wform(L"Begining a service thread, id %1%") % id); 
     422 
     423        for ( ; ; ) 
     424        { 
     425                try 
     426                { 
     427                        io_service_.run(); 
     428 
     429                        // run exited normally 
     430                        break;  
     431 
     432                }  
     433                HAL_GENERIC_FN_EXCEPTION_CATCH(L"bit_impl::service_thread()") 
     434        } 
     435 
     436        HAL_DEV_MSG(hal::wform(L"Service thread id %1% exiting normally") % id); 
     437} 
     438 
     439void bit_impl::alert_handler_wait(const boost::system::error_code& /*e*/) 
     440{ 
     441        if (keep_checking_) 
     442                alert_handler(); 
     443} 
     444 
    398445void bit_impl::alert_handler() 
    399446{ 
    400         win32_exception::install_handler(); 
    401  
    402447        try 
    403         { 
    404  
    405         while (keepChecking_) 
    406448        { 
    407449         
     
    733775                try 
    734776                { 
    735                 mutex_t::scoped_lock l(mutex_); 
     777                //mutex_t::scoped_lock l(mutex_); 
    736778                 
    737779                libt::handle_alert< 
     
    785827                boost::this_thread::interruption_point(); 
    786828        }        
    787                  
    788         boost::this_thread::sleep(pt::milliseconds(100)); 
    789          
    790         } 
    791          
    792         boost::this_thread::interruption_point(); 
    793  
     829         
     830        boost::asio::deadline_timer t(io_service_, pt::milliseconds(100)); 
     831        t.async_wait(bind(&bit_impl::alert_handler_wait, this, _1)); 
     832         
    794833        }  
    795         catch(boost::thread_interrupted&) 
     834/*      catch(boost::thread_interrupted&) 
    796835        { 
    797836                // Not an error! 
     
    801840 
    802841                return; 
    803         } 
     842        }*/ 
    804843        HAL_GENERIC_FN_EXCEPTION_CATCH(L"bit_impl::alert_handler()") 
    805844} 
Note: See TracChangeset for help on using the changeset viewer.