Arvid Norberg, lead developer of libtorrent, the library FrostWire’s jlibtorrent wraps into has announced today a 1.1 release. In the paragraph’s below Arvid’s words from the BitTorrent developer mailing list.
You can get it here:
Since this major release has been in the works for quite a while, the
changelog is too long to include here. Instead, here are the highlights:
* disk I/O and piece hashing can now be done in multiple threads.
* The internal allocation of alerts is a lot more efficient now, and
requires alerts to be owned by libtorrent. The pop_alerts() function that
returns a container of raw alert pointers are owned by libtorrent and will
be freed by the subsequent call to pop_alerts(). The previous alert popping
functions will still be around when deprecated functions are enabled, but
they will cause more copying and likely have worse performance.
* experimental support for BEP 38 (mutable torrents). Basically this will
attempt to merge torrents that share files.
* there’s a new bdecoder which is a lot quicker than the previous
lazy_bdecode() ( http://blog.libtorrent.org/2015/03/bdecode-parsers )
* improved shutdown delay by canceling unimportant DNS lookups. (stalled
DNS lookups for tracker announces can cause significant delays when
* verbose logging is now done through alerts (which is possible now since
alerts are a lot more efficient). This means a production build can have
logging enabled at compile time, and enabled on demand when trouble
* SSL over uTP connections is now supported.
* settings of various kinds have moved into the session_settings structure
(proxy settings, listen-interface, protocol encryption). A session can now
be constructed from a session_settings object, allowing for single-phase
initialization. (no more setting settings on the session object right after
* support for part-files. This is still a bit rough on the edges. Files
with priority 0, will have their pieces stored away in a single
consolidated file of partial pieces.
* there’s been countless scalability improvements. It’s possible to seed
tens of thousands, if not hundred of thousands torrents in a single
libtorrent instance. (Just make sure to use efficient APIs when interacting
with such instance, to not make yourself the bottleneck).
* A lot of build configuration defines have been removed or moved out of
public headers (to not affect ABI), as ABI incompatibility caused by
configuration options is a common mistake.
I’ve tried hard to keep this release API compatible the the 1.0.x series.
If you find a function that behaves differently in 1.1, please file a
ticket on github or bring it up on the mailing list. There are definitely
cases where using deprecated APIs will have worse performance now (because
they’re implemented on top of a new, higher performance, API).
There are some noteworthy exceptions though, that were hard to keep
* Instead of using boost.intrusive_ptr<> for torrent_info objects,
boost.shared_ptr<> is used. (this is a step in the direction of adopting
* the storage_interface has changed, to support multi-threaded disk I/O.
* the declarations of some functions and classes have been factored out
into their own header files. You may find yourself having to include some
* deprecated adding torrents by URL. This feature introduced a lot of
complexity and does not fit well at the libtorrent layer. It’s often easier
for a client to download a .torrent file anyway, and then add it to
* sparse-regions feature was removed. This was a feature that attempted to
keep the number of extents per file low, to circumvent a bug in early
versions of vista.
* deprecated RSS feeds. The API for RSS feeds was awkward and did not fit
well with libtorrent. It’s likely easier for clients to use a separate RSS
* deprecated lazy_bdecode and lazy_entry, as it’s been replaced by
bdecode() and bdecode_node.
* deprecated time functions in favor of using boost.chrono.
* compact file allocation was removed (it was deprecated in 1.0 iirc)
* deprecated explicit cache feature
* deprecated resolve-countries feature (not in scope of libtorrent, can
easily be done by client)
* deprecated set_tracker_login() (to use basic auth with http trackers).
* deprecated session_status, cache_status and session::status() (use