core: use std::unique_ptr<> to make ownership transfer more clear

The decostate was generated in the main thread and passed down to
a worker thread. To make that explicit, use an std::unique_ptr<>
and std::move().

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2024-06-13 23:32:49 +02:00 committed by bstoeger
parent d594cc72f0
commit 541abf7ae4
2 changed files with 8 additions and 10 deletions

View file

@ -1081,12 +1081,9 @@ void DivePlannerPointsModel::updateDiveProfile()
#ifdef VARIATIONS_IN_BACKGROUND #ifdef VARIATIONS_IN_BACKGROUND
// Since we're calling computeVariations asynchronously and plan_deco_state is allocated // Since we're calling computeVariations asynchronously and plan_deco_state is allocated
// on the stack, it must be copied and freed by the worker-thread. // on the stack, it must be copied and freed by the worker-thread.
struct deco_state *plan_deco_state_copy = new deco_state(plan_deco_state); auto plan_deco_state_copy = std::make_unique<deco_state>(plan_deco_state);
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) QtConcurrent::run([this, plan_copy, &plan_deco_state_copy] ()
QtConcurrent::run(&DivePlannerPointsModel::computeVariationsFreeDeco, this, plan_copy, plan_deco_state_copy); { this->computeVariationsFreeDeco(plan_copy, std::move(plan_deco_state_copy)); });
#else
QtConcurrent::run(this, &DivePlannerPointsModel::computeVariationsFreeDeco, plan_copy, plan_deco_state_copy);
#endif
#else #else
computeVariations(plan_copy, &plan_deco_state); computeVariations(plan_copy, &plan_deco_state);
#endif #endif
@ -1171,10 +1168,10 @@ int DivePlannerPointsModel::analyzeVariations(struct decostop *min, struct decos
return (leftsum + rightsum) / 2; return (leftsum + rightsum) / 2;
} }
void DivePlannerPointsModel::computeVariationsFreeDeco(struct diveplan *original_plan, struct deco_state *previous_ds) void DivePlannerPointsModel::computeVariationsFreeDeco(struct diveplan *original_plan, std::unique_ptr<struct deco_state> previous_ds)
{ {
computeVariations(original_plan, previous_ds); computeVariations(original_plan, previous_ds.get());
delete previous_ds; // Note: previous ds automatically free()d by virtue of being a unique_ptr.
} }
void DivePlannerPointsModel::computeVariations(struct diveplan *original_plan, const struct deco_state *previous_ds) void DivePlannerPointsModel::computeVariations(struct diveplan *original_plan, const struct deco_state *previous_ds)

View file

@ -4,6 +4,7 @@
#include <QAbstractTableModel> #include <QAbstractTableModel>
#include <QDateTime> #include <QDateTime>
#include <memory>
#include <vector> #include <vector>
#include "core/deco.h" #include "core/deco.h"
@ -132,7 +133,7 @@ private:
struct divedatapoint *cloneDiveplan(struct diveplan *plan_src, struct diveplan *plan_copy); struct divedatapoint *cloneDiveplan(struct diveplan *plan_src, struct diveplan *plan_copy);
void computeVariationsDone(QString text); void computeVariationsDone(QString text);
void computeVariations(struct diveplan *diveplan, const struct deco_state *ds); void computeVariations(struct diveplan *diveplan, const struct deco_state *ds);
void computeVariationsFreeDeco(struct diveplan *diveplan, struct deco_state *ds); void computeVariationsFreeDeco(struct diveplan *diveplan, std::unique_ptr<struct deco_state> ds);
int analyzeVariations(struct decostop *min, struct decostop *mid, struct decostop *max, const char *unit); int analyzeVariations(struct decostop *min, struct decostop *mid, struct decostop *max, const char *unit);
struct dive *d; struct dive *d;
int dcNr; int dcNr;