diff --git a/libtransmission/peer-mgr.cc b/libtransmission/peer-mgr.cc index 878ae7e8f..69f118f71 100644 --- a/libtransmission/peer-mgr.cc +++ b/libtransmission/peer-mgr.cc @@ -2540,7 +2540,7 @@ void queuePulse(tr_session* session, tr_direction dir) TR_ASSERT(tr_isSession(session)); TR_ASSERT(tr_isDirection(dir)); - if (tr_sessionGetQueueEnabled(session, dir)) + if (session->queueEnabled(dir)) { auto const n = tr_sessionCountQueueFreeSlots(session, dir); diff --git a/libtransmission/rpcimpl.cc b/libtransmission/rpcimpl.cc index e8f14ae96..40001c940 100644 --- a/libtransmission/rpcimpl.cc +++ b/libtransmission/rpcimpl.cc @@ -2178,11 +2178,11 @@ static void addSessionField(tr_session const* s, tr_variant* d, tr_quark key) break; case TR_KEY_download_queue_enabled: - tr_variantDictAddBool(d, key, tr_sessionGetQueueEnabled(s, TR_DOWN)); + tr_variantDictAddBool(d, key, s->queueEnabled(TR_DOWN)); break; case TR_KEY_download_queue_size: - tr_variantDictAddInt(d, key, tr_sessionGetQueueSize(s, TR_DOWN)); + tr_variantDictAddInt(d, key, s->queueSize(TR_DOWN)); break; case TR_KEY_peer_limit_global: @@ -2262,11 +2262,11 @@ static void addSessionField(tr_session const* s, tr_variant* d, tr_quark key) break; case TR_KEY_seed_queue_enabled: - tr_variantDictAddBool(d, key, tr_sessionGetQueueEnabled(s, TR_UP)); + tr_variantDictAddBool(d, key, s->queueEnabled(TR_UP)); break; case TR_KEY_seed_queue_size: - tr_variantDictAddInt(d, key, tr_sessionGetQueueSize(s, TR_UP)); + tr_variantDictAddInt(d, key, s->queueSize(TR_UP)); break; case TR_KEY_start_added_torrents: @@ -2318,11 +2318,11 @@ static void addSessionField(tr_session const* s, tr_variant* d, tr_quark key) break; case TR_KEY_queue_stalled_enabled: - tr_variantDictAddBool(d, key, tr_sessionGetQueueStalledEnabled(s)); + tr_variantDictAddBool(d, key, s->queueStalledEnabled()); break; case TR_KEY_queue_stalled_minutes: - tr_variantDictAddInt(d, key, tr_sessionGetQueueStalledMinutes(s)); + tr_variantDictAddInt(d, key, s->queueStalledMinutes()); break; case TR_KEY_anti_brute_force_enabled: diff --git a/libtransmission/session.cc b/libtransmission/session.cc index 9e139a412..a5a8075ff 100644 --- a/libtransmission/session.cc +++ b/libtransmission/session.cc @@ -407,8 +407,8 @@ void tr_sessionGetSettings(tr_session const* s, tr_variant* setme_dictionary) tr_variantDictAddBool(d, TR_KEY_lpd_enabled, s->isLPDEnabled); tr_variantDictAddStr(d, TR_KEY_download_dir, tr_sessionGetDownloadDir(s)); tr_variantDictAddStr(d, TR_KEY_default_trackers, s->defaultTrackersStr()); - tr_variantDictAddInt(d, TR_KEY_download_queue_size, tr_sessionGetQueueSize(s, TR_DOWN)); - tr_variantDictAddBool(d, TR_KEY_download_queue_enabled, tr_sessionGetQueueEnabled(s, TR_DOWN)); + tr_variantDictAddInt(d, TR_KEY_download_queue_size, s->queueSize(TR_DOWN)); + tr_variantDictAddBool(d, TR_KEY_download_queue_enabled, s->queueEnabled(TR_DOWN)); tr_variantDictAddInt(d, TR_KEY_speed_limit_down, tr_sessionGetSpeedLimit_KBps(s, TR_DOWN)); tr_variantDictAddBool(d, TR_KEY_speed_limit_down_enabled, tr_sessionIsSpeedLimited(s, TR_DOWN)); tr_variantDictAddInt(d, TR_KEY_encryption, s->encryptionMode); @@ -430,8 +430,8 @@ void tr_sessionGetSettings(tr_session const* s, tr_variant* setme_dictionary) tr_variantDictAddInt(d, TR_KEY_preallocation, s->preallocationMode); tr_variantDictAddBool(d, TR_KEY_prefetch_enabled, s->isPrefetchEnabled); tr_variantDictAddInt(d, TR_KEY_peer_id_ttl_hours, s->peer_id_ttl_hours); - tr_variantDictAddBool(d, TR_KEY_queue_stalled_enabled, tr_sessionGetQueueStalledEnabled(s)); - tr_variantDictAddInt(d, TR_KEY_queue_stalled_minutes, tr_sessionGetQueueStalledMinutes(s)); + tr_variantDictAddBool(d, TR_KEY_queue_stalled_enabled, s->queueStalledEnabled()); + tr_variantDictAddInt(d, TR_KEY_queue_stalled_minutes, s->queueStalledMinutes()); tr_variantDictAddReal(d, TR_KEY_ratio_limit, s->desiredRatio); tr_variantDictAddBool(d, TR_KEY_ratio_limit_enabled, s->isRatioLimited); tr_variantDictAddBool(d, TR_KEY_rename_partial_files, tr_sessionIsIncompleteFileNamingEnabled(s)); @@ -446,8 +446,8 @@ void tr_sessionGetSettings(tr_session const* s, tr_variant* setme_dictionary) tr_variantDictAddStr(d, TR_KEY_rpc_whitelist, tr_sessionGetRPCWhitelist(s)); tr_variantDictAddBool(d, TR_KEY_rpc_whitelist_enabled, tr_sessionGetRPCWhitelistEnabled(s)); tr_variantDictAddBool(d, TR_KEY_scrape_paused_torrents_enabled, s->scrapePausedTorrents); - tr_variantDictAddInt(d, TR_KEY_seed_queue_size, tr_sessionGetQueueSize(s, TR_UP)); - tr_variantDictAddBool(d, TR_KEY_seed_queue_enabled, tr_sessionGetQueueEnabled(s, TR_UP)); + tr_variantDictAddInt(d, TR_KEY_seed_queue_size, s->queueSize(TR_UP)); + tr_variantDictAddBool(d, TR_KEY_seed_queue_enabled, s->queueEnabled(TR_UP)); tr_variantDictAddBool(d, TR_KEY_alt_speed_enabled, tr_sessionUsesAltSpeed(s)); tr_variantDictAddInt(d, TR_KEY_alt_speed_up, tr_sessionGetAltSpeed_KBps(s, TR_UP)); tr_variantDictAddInt(d, TR_KEY_alt_speed_down, tr_sessionGetAltSpeed_KBps(s, TR_DOWN)); @@ -2621,7 +2621,7 @@ void tr_sessionSetQueueSize(tr_session* session, tr_direction dir, int max_simul TR_ASSERT(tr_isSession(session)); TR_ASSERT(tr_isDirection(dir)); - session->queueSize[dir] = max_simultaneous_seed_torrents; + session->queue_size_[dir] = max_simultaneous_seed_torrents; } int tr_sessionGetQueueSize(tr_session const* session, tr_direction dir) @@ -2629,7 +2629,7 @@ int tr_sessionGetQueueSize(tr_session const* session, tr_direction dir) TR_ASSERT(tr_isSession(session)); TR_ASSERT(tr_isDirection(dir)); - return session->queueSize[dir]; + return session->queueSize(dir); } void tr_sessionSetQueueEnabled(tr_session* session, tr_direction dir, bool do_limit_simultaneous_seed_torrents) @@ -2637,7 +2637,7 @@ void tr_sessionSetQueueEnabled(tr_session* session, tr_direction dir, bool do_li TR_ASSERT(tr_isSession(session)); TR_ASSERT(tr_isDirection(dir)); - session->queueEnabled[dir] = do_limit_simultaneous_seed_torrents; + session->queue_enabled_[dir] = do_limit_simultaneous_seed_torrents; } bool tr_sessionGetQueueEnabled(tr_session const* session, tr_direction dir) @@ -2645,7 +2645,7 @@ bool tr_sessionGetQueueEnabled(tr_session const* session, tr_direction dir) TR_ASSERT(tr_isSession(session)); TR_ASSERT(tr_isDirection(dir)); - return session->queueEnabled[dir]; + return session->queueEnabled(dir); } void tr_sessionSetQueueStalledMinutes(tr_session* session, int minutes) @@ -2653,28 +2653,28 @@ void tr_sessionSetQueueStalledMinutes(tr_session* session, int minutes) TR_ASSERT(tr_isSession(session)); TR_ASSERT(minutes > 0); - session->queueStalledMinutes = minutes; + session->queue_stalled_minutes_ = minutes; } void tr_sessionSetQueueStalledEnabled(tr_session* session, bool is_enabled) { TR_ASSERT(tr_isSession(session)); - session->stalledEnabled = is_enabled; + session->queue_stalled_enabled_ = is_enabled; } bool tr_sessionGetQueueStalledEnabled(tr_session const* session) { TR_ASSERT(tr_isSession(session)); - return session->stalledEnabled; + return session->queueStalledEnabled(); } int tr_sessionGetQueueStalledMinutes(tr_session const* session) { TR_ASSERT(tr_isSession(session)); - return session->queueStalledMinutes; + return session->queueStalledMinutes(); } void tr_sessionSetAntiBruteForceThreshold(tr_session* session, int max_bad_requests) @@ -2739,18 +2739,18 @@ std::vector tr_sessionGetNextQueuedTorrents(tr_session* session, tr int tr_sessionCountQueueFreeSlots(tr_session* session, tr_direction dir) { - int const max = tr_sessionGetQueueSize(session, dir); + auto const max = session->queueSize(dir); tr_torrent_activity const activity = dir == TR_UP ? TR_STATUS_SEED : TR_STATUS_DOWNLOAD; - if (!tr_sessionGetQueueEnabled(session, dir)) + if (!session->queueEnabled(dir)) { return INT_MAX; } /* count how many torrents are active */ int active_count = 0; - bool const stalled_enabled = tr_sessionGetQueueStalledEnabled(session); - int const stalled_if_idle_for_n_seconds = tr_sessionGetQueueStalledMinutes(session) * 60; + bool const stalled_enabled = session->queueStalledEnabled(); + int const stalled_if_idle_for_n_seconds = session->queueStalledMinutes() * 60; time_t const now = tr_time(); for (auto const* const tor : session->torrents()) { diff --git a/libtransmission/session.h b/libtransmission/session.h index 37afa004e..95564bef3 100644 --- a/libtransmission/session.h +++ b/libtransmission/session.h @@ -482,11 +482,6 @@ public: uint8_t peer_id_ttl_hours = 0; - bool stalledEnabled = false; - bool queueEnabled[2] = { false, false }; - int queueSize[2] = { 0, 0 }; - int queueStalledMinutes = 0; - int umask = 0; unsigned int speedLimit_Bps[2] = { 0, 0 }; @@ -602,10 +597,34 @@ public: // Only session.cc should use this. int peer_socket_tos_ = *tr_netTosFromName(TR_DEFAULT_PEER_SOCKET_TOS_STR); + [[nodiscard]] auto constexpr queueEnabled(tr_direction dir) const noexcept + { + return queue_enabled_[dir]; + } + + [[nodiscard]] auto constexpr queueSize(tr_direction dir) const noexcept + { + return queue_size_[dir]; + } + + [[nodiscard]] auto constexpr queueStalledEnabled() const noexcept + { + return queue_stalled_enabled_; + } + + [[nodiscard]] auto constexpr queueStalledMinutes() const noexcept + { + return queue_stalled_minutes_; + } + private: friend tr_session* tr_sessionInit(char const* config_dir, bool message_queueing_enabled, tr_variant* client_settings); - friend void tr_sessionSet(tr_session* session, tr_variant* settings); friend void tr_sessionClose(tr_session* session); + friend void tr_sessionSet(tr_session* session, tr_variant* settings); + friend void tr_sessionSetQueueEnabled(tr_session* session, tr_direction dir, bool do_limit_simultaneous_seed_torrents); + friend void tr_sessionSetQueueSize(tr_session* session, tr_direction dir, int max_simultaneous_seed_torrents); + friend void tr_sessionSetQueueStalledEnabled(tr_session* session, bool is_enabled); + friend void tr_sessionSetQueueStalledMinutes(tr_session* session, int minutes); struct init_data; void initImpl(init_data&); @@ -614,6 +633,11 @@ private: void closeImplWaitForIdleUdp(); void closeImplFinish(); + std::array queue_enabled_ = { false, false }; + std::array queue_size_ = { 0, 0 }; + int queue_stalled_minutes_ = 0; + bool queue_stalled_enabled_ = false; + static std::recursive_mutex session_mutex_; WebMediator web_mediator_{ this }; diff --git a/libtransmission/torrent.cc b/libtransmission/torrent.cc index 576aa78c4..df6d14399 100644 --- a/libtransmission/torrent.cc +++ b/libtransmission/torrent.cc @@ -985,11 +985,11 @@ tr_torrent_activity tr_torrentGetActivity(tr_torrent const* tor) } else if (tor->isQueued()) { - if (is_seed && tr_sessionGetQueueEnabled(tor->session, TR_UP)) + if (is_seed && tor->session->queueEnabled(TR_UP)) { ret = TR_STATUS_SEED_WAIT; } - else if (!is_seed && tr_sessionGetQueueEnabled(tor->session, TR_DOWN)) + else if (!is_seed && tor->session->queueEnabled(TR_DOWN)) { ret = TR_STATUS_DOWNLOAD_WAIT; } @@ -1007,7 +1007,7 @@ static int torrentGetIdleSecs(tr_torrent const* tor, tr_torrent_activity activit static inline bool tr_torrentIsStalled(tr_torrent const* tor, int idle_secs) { - return tr_sessionGetQueueStalledEnabled(tor->session) && idle_secs > tr_sessionGetQueueStalledMinutes(tor->session) * 60; + return tor->session->queueStalledEnabled() && idle_secs > tor->session->queueStalledMinutes() * 60; } tr_stat const* tr_torrentStat(tr_torrent* tor)