diff --git a/ChangeLog b/ChangeLog index 41bf86bae..fa66593a4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,8 @@ Deluge 0.5.6.2 (31 October 2007) * Set default piece size to 256-KiB in TorrentCreator plugin and add 2048KiB as a size option. + * Fix a bug in Debian package that caused the UI to completely freeze when a + torrent finished * Find and fix another shutdown bug that mostly Gutsy users were incountering * Fix a couple of WebUI bugs, including the "index" page erroring out diff --git a/libtorrent/include/libtorrent/aux_/session_impl.hpp b/libtorrent/include/libtorrent/aux_/session_impl.hpp index 3f3607191..bff8e3387 100644 --- a/libtorrent/include/libtorrent/aux_/session_impl.hpp +++ b/libtorrent/include/libtorrent/aux_/session_impl.hpp @@ -375,6 +375,12 @@ namespace libtorrent // buffers from. boost::pool<> m_send_buffers; + // this is where all active sockets are stored. + // the selector can sleep while there's no activity on + // them + io_service m_io_service; + asio::strand m_strand; + // the file pool that all storages in this session's // torrents uses. It sets a limit on the number of // open files by this session. @@ -389,12 +395,6 @@ namespace libtorrent // object. disk_io_thread m_disk_thread; - // this is where all active sockets are stored. - // the selector can sleep while there's no activity on - // them - io_service m_io_service; - asio::strand m_strand; - // this is a list of half-open tcp connections // (only outgoing connections) // this has to be one of the last @@ -646,7 +646,7 @@ namespace libtorrent void debug_log(const std::string& line) { - (*m_ses.m_logger) << time_now_string() << " " << line << "\n"; + (*m_ses.m_logger) << line << "\n"; } session_impl& m_ses; }; diff --git a/libtorrent/include/libtorrent/connection_queue.hpp b/libtorrent/include/libtorrent/connection_queue.hpp index c229ec217..b3b7cde86 100644 --- a/libtorrent/include/libtorrent/connection_queue.hpp +++ b/libtorrent/include/libtorrent/connection_queue.hpp @@ -56,7 +56,6 @@ public: void done(int ticket); void limit(int limit); int limit() const; - void close(); #ifndef NDEBUG diff --git a/libtorrent/include/libtorrent/http_tracker_connection.hpp b/libtorrent/include/libtorrent/http_tracker_connection.hpp index c0057dfa1..5b618c876 100755 --- a/libtorrent/include/libtorrent/http_tracker_connection.hpp +++ b/libtorrent/include/libtorrent/http_tracker_connection.hpp @@ -130,8 +130,6 @@ namespace libtorrent , proxy_settings const& ps , std::string const& password = ""); - void close(); - private: boost::intrusive_ptr self() diff --git a/libtorrent/include/libtorrent/storage.hpp b/libtorrent/include/libtorrent/storage.hpp index a3f97b589..8686f2afc 100755 --- a/libtorrent/include/libtorrent/storage.hpp +++ b/libtorrent/include/libtorrent/storage.hpp @@ -345,7 +345,7 @@ namespace libtorrent // used to move pieces while expanding // the storage from compact allocation // to full allocation - buffer m_scratch_buffer; + buffer m_scratch_buffer; buffer m_scratch_buffer2; // the piece that is in the scratch buffer int m_scratch_piece; diff --git a/libtorrent/include/libtorrent/tracker_manager.hpp b/libtorrent/include/libtorrent/tracker_manager.hpp index 2c9ceeaef..07c377a0f 100755 --- a/libtorrent/include/libtorrent/tracker_manager.hpp +++ b/libtorrent/include/libtorrent/tracker_manager.hpp @@ -202,7 +202,7 @@ namespace libtorrent void fail(int code, char const* msg); void fail_timeout(); - virtual void close(); + void close(); address const& bind_interface() const { return m_bind_interface; } protected: diff --git a/libtorrent/include/libtorrent/udp_tracker_connection.hpp b/libtorrent/include/libtorrent/udp_tracker_connection.hpp index 4fba505a4..e5eadc144 100755 --- a/libtorrent/include/libtorrent/udp_tracker_connection.hpp +++ b/libtorrent/include/libtorrent/udp_tracker_connection.hpp @@ -74,8 +74,6 @@ namespace libtorrent , boost::weak_ptr c , session_settings const& stn); - void close(); - private: enum action_t diff --git a/libtorrent/src/broadcast_socket.cpp b/libtorrent/src/broadcast_socket.cpp index a9d27eff4..01c6dd1c5 100644 --- a/libtorrent/src/broadcast_socket.cpp +++ b/libtorrent/src/broadcast_socket.cpp @@ -190,7 +190,7 @@ namespace libtorrent void broadcast_socket::close() { - m_on_receive.clear(); + m_on_receive.clear(); for (std::list::iterator i = m_sockets.begin() , end(m_sockets.end()); i != end; ++i) diff --git a/libtorrent/src/connection_queue.cpp b/libtorrent/src/connection_queue.cpp index c204b5a34..1caeb99fc 100644 --- a/libtorrent/src/connection_queue.cpp +++ b/libtorrent/src/connection_queue.cpp @@ -86,11 +86,6 @@ namespace libtorrent try_connect(); } - void connection_queue::close() - { - m_timer.cancel(); - } - void connection_queue::limit(int limit) { m_half_open_limit = limit; } diff --git a/libtorrent/src/http_tracker_connection.cpp b/libtorrent/src/http_tracker_connection.cpp index a5c542b44..ccca58226 100755 --- a/libtorrent/src/http_tracker_connection.cpp +++ b/libtorrent/src/http_tracker_connection.cpp @@ -489,9 +489,7 @@ namespace libtorrent , boost::lexical_cast(m_port)); m_name_lookup.async_resolve(q, m_strand.wrap( boost::bind(&http_tracker_connection::name_lookup, self(), _1, _2))); - set_timeout(req.event == tracker_request::stopped - ? m_settings.stop_tracker_timeout - : m_settings.tracker_completion_timeout + set_timeout(m_settings.tracker_completion_timeout , m_settings.tracker_receive_timeout); } @@ -505,17 +503,6 @@ namespace libtorrent fail_timeout(); } - void http_tracker_connection::close() - { - asio::error_code ec; - m_socket.close(ec); - m_name_lookup.cancel(); - if (m_connection_ticket > -1) m_cc.done(m_connection_ticket); - m_connection_ticket = -1; - m_timed_out = true; - tracker_connection::close(); - } - void http_tracker_connection::name_lookup(asio::error_code const& error , tcp::resolver::iterator i) try { @@ -772,6 +759,7 @@ namespace libtorrent if (m_parser.status_code() != 200) { fail(m_parser.status_code(), m_parser.message().c_str()); + close(); return; } @@ -833,7 +821,6 @@ namespace libtorrent TORRENT_ASSERT(false); } #endif - close(); } peer_entry http_tracker_connection::extract_peer_info(const entry& info) diff --git a/libtorrent/src/session_impl.cpp b/libtorrent/src/session_impl.cpp index 5fcaac51b..31403e083 100755 --- a/libtorrent/src/session_impl.cpp +++ b/libtorrent/src/session_impl.cpp @@ -547,8 +547,8 @@ namespace detail , fingerprint const& cl_fprint , char const* listen_interface) : m_send_buffers(send_buffer_size) - , m_files(40) , m_strand(m_io_service) + , m_files(40) , m_half_open(m_io_service) , m_download_channel(m_io_service, peer_connection::download_channel) , m_upload_channel(m_io_service, peer_connection::upload_channel) @@ -675,17 +675,6 @@ namespace detail if (m_dht) m_dht->stop(); #endif m_timer.cancel(); - - // close the listen sockets - for (std::list::iterator i = m_listen_sockets.begin() - , end(m_listen_sockets.end()); i != end; ++i) - { - i->sock->close(); - } - -#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) - (*m_logger) << time_now_string() << " aborting all torrents\n"; -#endif // abort all torrents for (torrent_map::iterator i = m_torrents.begin() , end(m_torrents.end()); i != end; ++i) @@ -693,25 +682,7 @@ namespace detail i->second->abort(); } -#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) - (*m_logger) << time_now_string() << " aborting all connections\n"; -#endif - // abort all connections - for (connection_map::iterator i = m_connections.begin() - , end(m_connections.end()); i != end; ++i) - { - i->second->disconnect(); - } - -#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) - (*m_logger) << time_now_string() << " aborting all tracker requests\n"; -#endif - m_tracker_manager.abort_all_requests(); - -#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) - (*m_logger) << time_now_string() << " shutting down connection queue\n"; -#endif - m_half_open.close(); + m_io_service.stop(); mutex::scoped_lock l2(m_checker_impl.m_mutex); // abort the checker thread @@ -1003,16 +974,16 @@ namespace detail m_alerts.post_alert(peer_blocked_alert(endp.address() , "incoming connection blocked by IP filter")); } - return; - } - - // don't allow more connections than the max setting - if (m_connections.size() > max_connections()) - { -#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) - (*m_logger) << "number of connections limit exceeded (conns: " - << num_connections() << ", limit: " << max_connections() - << "), connection rejected\n"; + return; + } + + // don't allow more connections than the max setting + if (m_connections.size() > max_connections()) + { +#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) + (*m_logger) << "number of connections limit exceeded (conns: " + << num_connections() << ", limit: " << max_connections() + << "), connection rejected\n"; #endif return; } @@ -1514,12 +1485,20 @@ namespace detail while (!m_abort); deadline_timer tracker_timer(m_io_service); + // this will remove the port mappings + if (m_natpmp.get()) + m_natpmp->close(); + if (m_upnp.get()) + m_upnp->close(); #if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) (*m_logger) << time_now_string() << " locking mutex\n"; #endif session_impl::mutex_t::scoped_lock l(m_mutex); +#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) + (*m_logger) << time_now_string() << " aborting all tracker requests\n"; +#endif m_tracker_manager.abort_all_requests(); #if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) (*m_logger) << time_now_string() << " sending stopped to all torrent's trackers\n"; @@ -2122,8 +2101,8 @@ namespace detail entry session_impl::dht_state() const { + TORRENT_ASSERT(m_dht); mutex_t::scoped_lock l(m_mutex); - if (!m_dht) return entry(); return m_dht->state(); } @@ -2159,10 +2138,16 @@ namespace detail session_impl::~session_impl() { + abort(); + #if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) (*m_logger) << time_now_string() << "\n\n *** shutting down session *** \n\n"; #endif - abort(); + // lock the main thread and abort it + mutex_t::scoped_lock l(m_mutex); + m_abort = true; + m_io_service.stop(); + l.unlock(); #if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) (*m_logger) << time_now_string() << " waiting for main thread\n"; diff --git a/libtorrent/src/storage.cpp b/libtorrent/src/storage.cpp index 0468684f3..47fc6d408 100755 --- a/libtorrent/src/storage.cpp +++ b/libtorrent/src/storage.cpp @@ -1624,8 +1624,8 @@ namespace libtorrent if (m_current_slot == m_info->num_pieces()) { m_state = state_create_files; - buffer().swap(m_scratch_buffer); - buffer().swap(m_scratch_buffer2); + buffer().swap(m_scratch_buffer); + buffer().swap(m_scratch_buffer2); if (m_storage_mode != storage_mode_compact) { std::vector().swap(m_piece_to_slot); diff --git a/libtorrent/src/torrent.cpp b/libtorrent/src/torrent.cpp index 6f764ed64..719f56853 100755 --- a/libtorrent/src/torrent.cpp +++ b/libtorrent/src/torrent.cpp @@ -3055,7 +3055,7 @@ namespace libtorrent #if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) void torrent::debug_log(const std::string& line) { - (*m_ses.m_logger) << time_now_string() << " " << line << "\n"; + (*m_ses.m_logger) << line << "\n"; } #endif diff --git a/libtorrent/src/tracker_manager.cpp b/libtorrent/src/tracker_manager.cpp index 5ce539d9e..a9c0e2c2b 100755 --- a/libtorrent/src/tracker_manager.cpp +++ b/libtorrent/src/tracker_manager.cpp @@ -302,12 +302,12 @@ namespace libtorrent { m_completion_timeout = completion_timeout; m_read_timeout = read_timeout; - m_start_time = m_read_time = time_now(); + m_start_time = time_now(); + m_read_time = time_now(); m_timeout.expires_at((std::min)( m_read_time + seconds(m_read_timeout) - , m_start_time + seconds((std::min)(m_completion_timeout - , m_read_timeout)))); + , m_start_time + seconds(m_completion_timeout))); m_timeout.async_wait(m_strand.wrap(bind( &timeout_handler::timeout_callback, self(), _1))); } @@ -343,8 +343,7 @@ namespace libtorrent m_timeout.expires_at((std::min)( m_read_time + seconds(m_read_timeout) - , m_start_time + seconds((std::min)(m_completion_timeout - , m_read_timeout)))); + , m_start_time + seconds(m_completion_timeout))); m_timeout.async_wait(m_strand.wrap( bind(&timeout_handler::timeout_callback, self(), _1))); } @@ -568,24 +567,24 @@ namespace libtorrent m_abort = true; tracker_connections_t keep_connections; - while (!m_connections.empty()) - { - boost::intrusive_ptr& c = m_connections.back(); - if (!c) - { - m_connections.pop_back(); - continue; - } + while (!m_connections.empty()) + { + boost::intrusive_ptr& c = m_connections.back(); + if (!c) + { + m_connections.pop_back(); + continue; + } tracker_request const& req = c->tracker_req(); if (req.event == tracker_request::stopped) - { - keep_connections.push_back(c); - m_connections.pop_back(); - continue; - } - // close will remove the entry from m_connections - // so no need to pop - c->close(); + { + keep_connections.push_back(c); + m_connections.pop_back(); + continue; + } + // close will remove the entry from m_connections + // so no need to pop + c->close(); } std::swap(m_connections, keep_connections); diff --git a/libtorrent/src/udp_tracker_connection.cpp b/libtorrent/src/udp_tracker_connection.cpp index 6d76988d3..dd2ff10a1 100755 --- a/libtorrent/src/udp_tracker_connection.cpp +++ b/libtorrent/src/udp_tracker_connection.cpp @@ -96,9 +96,7 @@ namespace libtorrent m_name_lookup.async_resolve(q , m_strand.wrap(boost::bind( &udp_tracker_connection::name_lookup, self(), _1, _2))); - set_timeout(req.event == tracker_request::stopped - ? m_settings.stop_tracker_timeout - : m_settings.tracker_completion_timeout + set_timeout(m_settings.tracker_completion_timeout , m_settings.tracker_receive_timeout); } @@ -158,20 +156,11 @@ namespace libtorrent void udp_tracker_connection::on_timeout() { - asio::error_code ec; - m_socket.close(ec); + m_socket.close(); m_name_lookup.cancel(); fail_timeout(); } - void udp_tracker_connection::close() - { - asio::error_code ec; - m_socket.close(ec); - m_name_lookup.cancel(); - tracker_connection::close(); - } - void udp_tracker_connection::send_udp_connect() { #if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) @@ -479,7 +468,6 @@ namespace libtorrent , complete, incomplete); m_man.remove_request(this); - close(); return; } catch (std::exception& e) @@ -555,7 +543,6 @@ namespace libtorrent if (!cb) { m_man.remove_request(this); - close(); return; } @@ -564,7 +551,6 @@ namespace libtorrent , complete, incomplete); m_man.remove_request(this); - close(); } catch (std::exception& e) { diff --git a/setup.py b/setup.py index 4e0c8de73..7dea25363 100644 --- a/setup.py +++ b/setup.py @@ -28,7 +28,7 @@ NAME = "deluge" FULLNAME = "Deluge BitTorrent Client" -VERSION = "0.5.6.15" +VERSION = "0.5.6.25" AUTHOR = "Zach Tibbitts, Alon Zakai, Marcos Pinto, Andrew Resch, Alex Dedul" EMAIL = "zach@collegegeek.org, kripkensteiner@gmail.com, marcospinto@dipconsultants.com, alonzakai@gmail.com, rotmer@gmail.com" DESCRIPTION = "A bittorrent client written in PyGTK" diff --git a/src/common.py b/src/common.py index 30a969e1f..9e5e30d5e 100644 --- a/src/common.py +++ b/src/common.py @@ -32,7 +32,7 @@ import os import xdg.BaseDirectory PROGRAM_NAME = "Deluge" -PROGRAM_VERSION = "0.5.6.15" +PROGRAM_VERSION = "0.5.6.25" CLIENT_CODE = "DE" CLIENT_VERSION = "".join(PROGRAM_VERSION.split('.'))+"0"*(4 - len(PROGRAM_VERSION.split('.')))