diff --git a/include/libtorrent/aux_/session_impl.hpp b/include/libtorrent/aux_/session_impl.hpp index b829cbe3c..b6c1d9781 100644 --- a/include/libtorrent/aux_/session_impl.hpp +++ b/include/libtorrent/aux_/session_impl.hpp @@ -784,6 +784,11 @@ namespace libtorrent // we might need more than one listen socket std::list m_listen_sockets; +#if TORRENT_USE_I2P + i2p_connection m_i2p_conn; + boost::shared_ptr m_i2p_listen_socket; +#endif + #ifdef TORRENT_USE_OPENSSL void ssl_handshake(error_code const& ec, boost::shared_ptr s); #endif @@ -795,11 +800,6 @@ namespace libtorrent void open_new_incoming_socks_connection(); -#if TORRENT_USE_I2P - i2p_connection m_i2p_conn; - boost::shared_ptr m_i2p_listen_socket; -#endif - void setup_listener(listen_socket_t* s, tcp::endpoint ep, int& retries , bool v6_only, int flags, error_code& ec); @@ -809,13 +809,6 @@ namespace libtorrent #ifndef TORRENT_DISABLE_DHT entry m_dht_state; #endif - // set to true when the session object - // is being destructed and the thread - // should exit - bool m_abort; - - // is true if the session is paused - bool m_paused; // the number of unchoked peers as set by the auto-unchoker // this should always be >= m_max_uploads @@ -867,12 +860,6 @@ namespace libtorrent int m_peak_up_rate; int m_peak_down_rate; - // is false by default and set to true when - // the first incoming connection is established - // this is used to know if the client is behind - // NAT or not. - bool m_incoming_connection; - void on_disk_queue(); void on_tick(error_code const& e); @@ -1206,6 +1193,19 @@ namespace libtorrent // no longer needs to execute the auto-management. bool m_need_auto_manage; + // set to true when the session object + // is being destructed and the thread + // should exit + bool m_abort; + + // is true if the session is paused + bool m_paused; + // is false by default and set to true when + // the first incoming connection is established + // this is used to know if the client is behind + // NAT or not. + bool m_incoming_connection; + // redundant bytes per category size_type m_redundant_bytes[7]; diff --git a/include/libtorrent/connection_queue.hpp b/include/libtorrent/connection_queue.hpp index 084010bbb..dbc77f61b 100644 --- a/include/libtorrent/connection_queue.hpp +++ b/include/libtorrent/connection_queue.hpp @@ -98,7 +98,12 @@ private: struct entry { - entry(): connecting(false), ticket(0), expires(max_time()), priority(0) {} + entry() + : expires(max_time()) + , ticket(0) + , connecting(false) + , priority(0) + {} // called when the connection is initiated // this is when the timeout countdown starts boost::function on_connect; @@ -109,11 +114,11 @@ private: // 2. on_connect, on_timeout // 3. on_timeout boost::function on_timeout; - bool connecting; - int ticket; ptime expires; time_duration timeout; - int priority; + boost::uint32_t ticket; + bool connecting; + boost::uint8_t priority; }; std::list m_queue; diff --git a/include/libtorrent/disk_io_thread.hpp b/include/libtorrent/disk_io_thread.hpp index 4f5f6d15c..9bc3a7785 100644 --- a/include/libtorrent/disk_io_thread.hpp +++ b/include/libtorrent/disk_io_thread.hpp @@ -89,13 +89,13 @@ namespace libtorrent struct disk_io_job { disk_io_job() - : action(read) - , buffer(0) + : buffer(0) , buffer_size(0) , piece(0) , offset(0) , max_cache_line(0) , cache_min_time(0) + , action(read) {} enum action_t @@ -121,14 +121,23 @@ namespace libtorrent #endif }; - action_t action; char* buffer; - int buffer_size; + + // this is called when operation completes + boost::function callback; + boost::intrusive_ptr storage; - // arguments used for read and write - // piece is used as flags for move_storage - int piece, offset; + + boost::shared_ptr resume_data; + + // the error code from the file operation + error_code error; + + // the time when this job was issued. This is used to + // keep track of disk I/O congestion + ptime start_time; + // used for move_storage and rename_file. On errors, this is set // to the error message std::string str; @@ -137,6 +146,12 @@ namespace libtorrent // file the disk operation failed on std::string error_file; + int buffer_size; + + // arguments used for read and write + // piece is used as flags for move_storage + int piece, offset; + // if this is > 0, it specifies the max number of blocks to read // ahead in the read cache for this access. This is only valid // for 'read' actions @@ -146,17 +161,7 @@ namespace libtorrent // line caused by this operation stays in the cache int cache_min_time; - boost::shared_ptr resume_data; - - // the error code from the file operation - error_code error; - - // this is called when operation completes - boost::function callback; - - // the time when this job was issued. This is used to - // keep track of disk I/O congestion - ptime start_time; + action_t action:5; }; // returns true if the fundamental operation diff --git a/include/libtorrent/policy.hpp b/include/libtorrent/policy.hpp index 003af2f9d..b6500373b 100644 --- a/include/libtorrent/policy.hpp +++ b/include/libtorrent/policy.hpp @@ -154,24 +154,6 @@ namespace libtorrent void check_invariant() const; #endif -// intended struct layout (on 32 bit architectures) -// offset size alignment field -// 0 8 4 prev_amount_upload, prev_amount_download -// 8 4 4 connection -// 12 2 2 last_optimistically_unchoked -// 14 2 2 last_connected -// 16 16 1 addr -// 32 2 2 port -// 34 2 2 upload_rate_limit -// 36 2 2 download_rate_limit -// 38 1 1 hashfails -// 39 1 1 failcount, connectable, optimistically_unchoked, seed -// 40 1 1 fast_reconnects, trust_points -// 41 1 1 source, pe_support, is_v6_addr -// 42 1 1 on_parole, banned, added_to_dht, supports_utp, -// supports_holepunch, web_seed -// 43 1 1 -// 44 struct TORRENT_EXTRA_EXPORT peer { peer(boost::uint16_t port, bool connectable, int src); @@ -206,11 +188,6 @@ namespace libtorrent // will refer to a valid peer_connection peer_connection* connection; - // as computed by hashing our IP with the remote - // IP of this peer - // calculated lazily - mutable boost::uint32_t peer_rank; - #ifndef TORRENT_DISABLE_GEO_IP #ifdef TORRENT_DEBUG // only used in debug mode to assert that @@ -221,6 +198,11 @@ namespace libtorrent std::pair* inet_as; #endif + // as computed by hashing our IP with the remote + // IP of this peer + // calculated lazily + mutable boost::uint32_t peer_rank; + // the time when this peer was optimistically unchoked // the last time. in seconds since session was created // 16 bits is enough to last for 18.2 hours diff --git a/include/libtorrent/stat.hpp b/include/libtorrent/stat.hpp index cadbeaf1d..726a734e2 100644 --- a/include/libtorrent/stat.hpp +++ b/include/libtorrent/stat.hpp @@ -114,6 +114,8 @@ namespace libtorrent int m_5_sec_average; int m_30_sec_average; + // TODO: this is 4 bytes of padding! + // total counters size_type m_total_counter; }; diff --git a/src/connection_queue.cpp b/src/connection_queue.cpp index c71535b92..551dde3fb 100644 --- a/src/connection_queue.cpp +++ b/src/connection_queue.cpp @@ -98,6 +98,9 @@ namespace libtorrent e->timeout = timeout; ++m_next_ticket; + if (m_next_ticket >= (1 << 29)) + m_next_ticket = 0; + if (m_num_connecting < m_half_open_limit || m_half_open_limit == 0) m_timer.get_io_service().post(boost::bind( diff --git a/src/session_impl.cpp b/src/session_impl.cpp index 54ef32b0b..5f3b8f940 100644 --- a/src/session_impl.cpp +++ b/src/session_impl.cpp @@ -637,8 +637,6 @@ namespace aux { #if TORRENT_USE_I2P , m_i2p_conn(m_io_service) #endif - , m_abort(false) - , m_paused(false) , m_allowed_upload_slots(8) , m_num_unchoked(0) , m_unchoke_time_scaler(0) @@ -650,7 +648,6 @@ namespace aux { , m_cache_rotation_timer(0) , m_peak_up_rate(0) , m_peak_down_rate(0) - , m_incoming_connection(false) , m_created(time_now_hires()) , m_last_tick(m_created) , m_last_second_tick(m_created - milliseconds(900)) @@ -689,6 +686,9 @@ namespace aux { , m_total_redundant_bytes(0) , m_pending_auto_manage(false) , m_need_auto_manage(false) + , m_abort(false) + , m_paused(false) + , m_incoming_connection(false) #if (defined TORRENT_DEBUG || TORRENT_RELEASE_ASSERTS) && defined BOOST_HAS_PTHREADS , m_network_thread(0) #endif