diff --git a/libtransmission/resume.cc b/libtransmission/resume.cc index 7a42e289e..fa37d29b3 100644 --- a/libtransmission/resume.cc +++ b/libtransmission/resume.cc @@ -752,13 +752,13 @@ static auto loadFromFile(tr_torrent* tor, tr_resume::fields_t fields_to_load, bo if ((fields_to_load & tr_resume::TimeSeeding) != 0 && tr_variantDictFindInt(&top, TR_KEY_seeding_time_seconds, &i)) { - tor->secondsSeeding = i; + tor->seconds_seeding_before_current_start_ = i; fields_loaded |= tr_resume::TimeSeeding; } if ((fields_to_load & tr_resume::TimeDownloading) != 0 && tr_variantDictFindInt(&top, TR_KEY_downloading_time_seconds, &i)) { - tor->secondsDownloading = i; + tor->seconds_downloading_before_current_start_ = i; fields_loaded |= tr_resume::TimeDownloading; } @@ -906,9 +906,10 @@ void save(tr_torrent* tor) } auto top = tr_variant{}; + auto const now = tr_time(); tr_variantInitDict(&top, 50); /* arbitrary "big enough" number */ - tr_variantDictAddInt(&top, TR_KEY_seeding_time_seconds, tor->secondsSeeding); - tr_variantDictAddInt(&top, TR_KEY_downloading_time_seconds, tor->secondsDownloading); + tr_variantDictAddInt(&top, TR_KEY_seeding_time_seconds, tor->secondsSeeding(now)); + tr_variantDictAddInt(&top, TR_KEY_downloading_time_seconds, tor->secondsDownloading(now)); tr_variantDictAddInt(&top, TR_KEY_activity_date, tor->activityDate); tr_variantDictAddInt(&top, TR_KEY_added_date, tor->addedDate); tr_variantDictAddInt(&top, TR_KEY_corrupt, tor->corruptPrev + tor->corruptCur); diff --git a/libtransmission/session.cc b/libtransmission/session.cc index d9b3bd758..7de1bc1ef 100644 --- a/libtransmission/session.cc +++ b/libtransmission/session.cc @@ -508,24 +508,6 @@ void tr_session::onNowTimer() tr_timeUpdate(time(nullptr)); alt_speeds_.checkScheduler(); - // TODO: this seems a little silly. Why do we increment this - // every second instead of computing the value as needed by - // subtracting the current time from a start time? - for (auto* const tor : torrents()) - { - if (tor->isRunning) - { - if (tor->isDone()) - { - ++tor->secondsSeeding; - } - else - { - ++tor->secondsDownloading; - } - } - } - // set the timer to kick again right after (10ms after) the next second auto const now = std::chrono::system_clock::now(); auto const target_time = std::chrono::time_point_cast(now) + 1s + 10ms; diff --git a/libtransmission/torrent.cc b/libtransmission/torrent.cc index 2cff1c047..38fb08d98 100644 --- a/libtransmission/torrent.cc +++ b/libtransmission/torrent.cc @@ -925,11 +925,12 @@ tr_stat const* tr_torrentStat(tr_torrent* tor) { TR_ASSERT(tr_isTorrent(tor)); - uint64_t const now = tr_time_msec(); + auto const now = tr_time_msec(); + auto const now_sec = tr_time(); auto swarm_stats = tr_swarm_stats{}; - tor->lastStatTime = tr_time(); + tor->lastStatTime = now_sec; if (tor->swarm != nullptr) { @@ -974,8 +975,8 @@ tr_stat const* tr_torrentStat(tr_torrent* tor) s->doneDate = tor->doneDate; s->editDate = tor->editDate; s->startDate = tor->startDate; - s->secondsSeeding = tor->secondsSeeding; - s->secondsDownloading = tor->secondsDownloading; + s->secondsSeeding = tor->secondsSeeding(now_sec); + s->secondsDownloading = tor->secondsDownloading(now_sec); s->corruptEver = tor->corruptCur + tor->corruptPrev; s->downloadedEver = tor->downloadedCur + tor->downloadedPrev; diff --git a/libtransmission/torrent.h b/libtransmission/torrent.h index 46acae633..91cea3955 100644 --- a/libtransmission/torrent.h +++ b/libtransmission/torrent.h @@ -731,6 +731,44 @@ public: } } + [[nodiscard]] constexpr auto secondsDownloading(time_t now) const noexcept + { + auto n_secs = seconds_downloading_before_current_start_; + + if (isRunning) + { + if (doneDate > startDate) + { + n_secs += doneDate - startDate; + } + else if (doneDate == 0) + { + n_secs += now - startDate; + } + } + + return n_secs; + } + + [[nodiscard]] constexpr auto secondsSeeding(time_t now) const noexcept + { + auto n_secs = seconds_seeding_before_current_start_; + + if (isRunning) + { + if (doneDate > startDate) + { + n_secs += now - doneDate; + } + else if (doneDate != 0) + { + n_secs += now - startDate; + } + } + + return n_secs; + } + tr_torrent_metainfo metainfo_; tr_bandwidth bandwidth_; @@ -792,6 +830,9 @@ public: time_t lastStatTime = 0; + time_t seconds_downloading_before_current_start_ = 0; + time_t seconds_seeding_before_current_start_ = 0; + uint64_t downloadedCur = 0; uint64_t downloadedPrev = 0; uint64_t uploadedCur = 0; @@ -818,9 +859,6 @@ public: tr_bytes_per_second_t etaSpeed_Bps = 0; - time_t secondsDownloading = 0; - time_t secondsSeeding = 0; - size_t queuePosition = 0; tr_torrent_id_t unique_id_ = 0;