Changeset 682


Ignore:
Timestamp:
01/13/09 19:11:40 (11 years ago)
Author:
Eoin
Message:

Implementing the torrent_internal statechart machine.

Location:
trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/halTorrentIntStates.cpp

    r575 r682  
    11 
    2 //         Copyright Eóin O'Callaghan 2008 - 2008. 
     2//         Copyright Eóin O'Callaghan 2008 - 2009. 
    33// Distributed under the Boost Software License, Version 1.0. 
    44//    (See accompanying file LICENSE_1_0.txt or copy at 
     
    1212{ 
    1313 
    14 torrent_internal::in_the_session::in_the_session() 
     14in_the_session::in_the_session() 
    1515{ 
    1616        TORRENT_STATE_LOG(L"Entering in_the_session()"); 
     17        torrent_internal& t_i = state_cast<torrent_internal&>(); 
     18 
     19        assert(!t_i.in_session()); 
     20 
     21        libt::add_torrent_params p; 
     22 
     23        string torrent_file = to_utf8((hal::app().get_working_directory()/L"torrents"/t_i.filename_).string()); 
     24        t_i.info_memory_.reset(new libt::torrent_info(torrent_file.c_str())); 
     25 
     26        std::string resume_file = to_utf8((hal::app().get_working_directory()/L"resume" / (t_i.name_ + L".fastresume")).string()); 
     27 
     28        std::vector<char> buf; 
     29        if (libt::load_file(resume_file.c_str(), buf) == 0) 
     30        { 
     31                HAL_DEV_MSG(L"Using resume data"); 
     32                p.resume_data = &buf; 
     33        } 
     34 
     35        p.ti = t_i.info_memory_; 
     36        p.save_path = path_to_utf8(t_i.save_directory_); 
     37        p.storage_mode = hal_allocation_to_libt(t_i.allocation_); 
     38        p.paused = paused; 
     39        p.duplicate_is_error = false; 
     40        p.auto_managed = t_i.managed_; 
     41 
     42        t_i.handle_ = t_i.the_session_->add_torrent(p);          
     43        assert(t_i.handle_.is_valid()); 
     44        t_i.in_session_ = true; 
     45         
     46//      clear_resume_data(); 
     47//      handle_.force_reannounce(); 
    1748} 
    1849 
    19 torrent_internal::in_the_session::~in_the_session() 
     50in_the_session::~in_the_session() 
    2051{ 
    2152        TORRENT_STATE_LOG(L"Exiting ~in_the_session()"); 
     53 
     54        torrent_internal& t_i = state_cast<torrent_internal&>(); 
     55 
     56        HAL_DEV_MSG(L"removing handle from session"); 
     57        t_i.the_session_->remove_torrent(t_i.handle_); 
     58        t_i.in_session_ = false; 
     59 
     60        assert(!t_i.in_session());       
     61        HAL_DEV_MSG(L"Removed from session!"); 
    2262} 
    2363 
    24 torrent_internal::paused::paused() 
     64out_of_session::out_of_session() 
     65{ 
     66        TORRENT_STATE_LOG(L"Entering out_of_session()"); 
     67} 
     68 
     69out_of_session::~out_of_session() 
     70{ 
     71        TORRENT_STATE_LOG(L"Exiting ~out_of_session()"); 
     72} 
     73 
     74paused::paused() 
    2575{ 
    2676        TORRENT_STATE_LOG(L"Entering paused()"); 
    2777} 
    2878 
    29 torrent_internal::paused::~paused() 
     79paused::~paused() 
    3080{ 
    3181        TORRENT_STATE_LOG(L"Exiting ~paused()"); 
    3282} 
    3383 
    34 torrent_internal::active::active() 
     84active::active() 
    3585{ 
    3686        TORRENT_STATE_LOG(L"Entering active()"); 
    3787} 
    3888 
    39 torrent_internal::active::~active() 
     89active::~active() 
    4090{ 
    4191        TORRENT_STATE_LOG(L"Exiting ~active()"); 
  • trunk/src/halTorrentInternal.hpp

    r681 r682  
    4646#include <boost/statechart/state_machine.hpp> 
    4747#include <boost/statechart/simple_state.hpp> 
     48#include <boost/statechart/transition.hpp> 
     49#include <boost/mpl/list.hpp> 
    4850 
    4951#include "halIni.hpp" 
     
    6567namespace libt = libtorrent; 
    6668namespace sc = boost::statechart; 
     69namespace mpl = boost::mpl; 
    6770 
    6871inline libt::entry haldecode(const wpath &file)  
     
    281284}; 
    282285 
     286 
     287struct out_of_session; 
     288struct in_the_session; 
     289 
     290struct ev_add_to_session : sc::event< ev_add_to_session > {}; 
     291struct ev_remove_from_session : sc::event< ev_remove_from_session > {}; 
     292 
     293struct ev_pause : sc::event< ev_pause > {}; 
     294struct ev_stop : sc::event< ev_stop > {}; 
     295 
     296 
    283297class torrent_internal : 
    284298        public boost::enable_shared_from_this<torrent_internal>, 
    285         private boost::noncopyable 
     299        public sc::state_machine<torrent_internal, out_of_session> 
    286300{ 
    287301        friend class bit_impl;   
    288302        friend class bit::torrent::exec_around_ptr::proxy; 
     303        friend struct out_of_session;    
     304        friend struct in_the_session; 
    289305 
    290306private: 
    291         struct out_of_session; 
    292         struct in_the_session; 
    293  
    294         struct torrent_state_machine : sc::state_machine<torrent_state_machine, out_of_session> {}; 
    295  
    296         struct out_of_session : sc::simple_state<out_of_session, torrent_state_machine> {}; 
    297  
    298         struct paused; 
    299         struct active; 
    300  
    301         struct in_the_session : sc::simple_state<in_the_session, torrent_state_machine, paused>  
    302         { 
    303                 in_the_session(); 
    304                 ~in_the_session(); 
    305         }; 
    306  
    307         struct paused : sc::simple_state<paused, in_the_session> 
    308         { 
    309                 paused(); 
    310                 ~paused(); 
    311         }; 
    312  
    313         struct active : sc::simple_state<active, in_the_session> 
    314         { 
    315                 active(); 
    316                 ~active(); 
    317         }; 
     307//      struct torrent_state_machine : sc::state_machine<torrent_state_machine, out_of_session> {}; 
    318308 
    319309public: 
     
    339329                state(torrent_details::torrent_stopped); 
    340330                TORRENT_STATE_LOG(L"Torrent state machine initiate"); 
    341                 machine_.initiate(); 
     331                initiate(); 
    342332        } 
    343333         
     
    352342                 
    353343                TORRENT_STATE_LOG(L"Torrent state machine initiate"); 
    354                 machine_.initiate(); 
     344                initiate(); 
    355345 
    356346                prepare(filename); 
     
    588578                try 
    589579                { 
     580                HAL_DEV_MSG(hal::wform(L"add_to_session() paused=%1%") % paused); 
    590581 
    591582                mutex_t::scoped_lock l(mutex_);  
    592583                assert(the_session_ != 0); 
    593584 
    594                 HAL_DEV_MSG(hal::wform(L"add_to_session() paused=%1%") % paused); 
    595                  
    596                 if (!in_session())  
    597                 {        
    598                         libt::add_torrent_params p; 
    599  
    600                         string torrent_file = to_utf8((hal::app().get_working_directory()/L"torrents"/filename_).string()); 
    601                         info_memory_.reset(new libt::torrent_info(torrent_file.c_str())); 
    602  
    603                         std::string resume_file = to_utf8((hal::app().get_working_directory()/L"resume" / (name_ + L".fastresume")).string()); 
    604  
    605                         std::vector<char> buf; 
    606                         if (libt::load_file(resume_file.c_str(), buf) == 0) 
    607                         { 
    608                                 HAL_DEV_MSG(L"Using resume data"); 
    609                                 p.resume_data = &buf; 
    610                         } 
    611  
    612                         p.ti = info_memory_; 
    613                         p.save_path = path_to_utf8(save_directory_); 
    614                         p.storage_mode = hal_allocation_to_libt(allocation_); 
    615                         p.paused = paused; 
    616                         p.duplicate_is_error = false; 
    617                         p.auto_managed = managed_; 
    618  
    619                         handle_ = the_session_->add_torrent(p);          
    620                         assert(handle_.is_valid()); 
    621                         in_session_ = true; 
    622                          
    623                 //      clear_resume_data(); 
    624                 //      handle_.force_reannounce(); 
    625                 }        
    626  
     585                process_event( ev_add_to_session() ); 
     586                 
    627587                assert(in_session()); 
    628588                HAL_DEV_MSG(L"Added to session"); 
     
    646606 
    647607                mutex_t::scoped_lock l(mutex_); 
     608 
    648609                if (!in_session()) 
    649610                { 
     
    666627                } 
    667628                else 
    668                 {                
    669                         HAL_DEV_MSG(L"removing handle from session"); 
    670                         the_session_->remove_torrent(handle_); 
    671                         in_session_ = false; 
    672  
    673                         assert(!in_session());   
    674                         HAL_DEV_MSG(L"Removed from session!"); 
     629                {                                
     630                        process_event( ev_remove_from_session() ); 
    675631 
    676632                        return true; 
     
    14491405        mutable mutex_t mutex_; 
    14501406 
    1451         torrent_state_machine machine_; 
     1407//      torrent_state_machine machine_; 
    14521408         
    14531409        std::pair<float, float> transfer_limit_; 
     
    16381594}; 
    16391595 
     1596struct out_of_session : sc::simple_state<out_of_session, torrent_internal>  
     1597{ 
     1598        typedef mpl::list< 
     1599                sc::transition< ev_add_to_session, in_the_session >, 
     1600                sc::transition< ev_remove_from_session, out_of_session > 
     1601        > reactions; 
     1602 
     1603        out_of_session(); 
     1604        ~out_of_session();       
     1605}; 
     1606 
     1607struct paused; 
     1608struct active; 
     1609 
     1610struct in_the_session : sc::simple_state<in_the_session, torrent_internal, paused>  
     1611{ 
     1612        typedef mpl::list< 
     1613                sc::transition< ev_add_to_session, in_the_session >, 
     1614                sc::transition< ev_remove_from_session, out_of_session > 
     1615        > reactions; 
     1616 
     1617        in_the_session(); 
     1618        ~in_the_session(); 
     1619}; 
     1620 
     1621struct paused : sc::simple_state<paused, in_the_session> 
     1622{ 
     1623        paused(); 
     1624        ~paused(); 
     1625}; 
     1626 
     1627struct active : sc::simple_state<active, in_the_session> 
     1628{ 
     1629        typedef sc::transition< ev_pause, paused > reactions; 
     1630 
     1631        active(); 
     1632        ~active(); 
     1633}; 
     1634 
    16401635} // namespace hal 
    16411636 
  • trunk/src/stdAfx.hpp

    r659 r682  
    2121#define HALITE_SENDING_CMD 68816889 
    2222 
    23 //#define HAL_TORRENT_STATE_LOGGING 
     23#define HAL_TORRENT_STATE_LOGGING 
    2424//#define HAL_SORT_LOGGING 
    2525//#define TXML_ARCHIVE_LOGGING 
Note: See TracChangeset for help on using the changeset viewer.