Add a task save lock

main
Simon Quigley 2 weeks ago
parent ee8d6ffcc7
commit 12cf91e4b2

@ -882,12 +882,12 @@ void PackageConf::sync() {
{ {
std::lock_guard<std::mutex> lock(*task_mutex_); std::lock_guard<std::mutex> lock(*task_mutex_);
for (auto [job_status, task] : jobstatus_task_map_) { for (auto [job_status, task] : jobstatus_task_map_) {
if (task) { if (!task) continue;
auto sync_func = [this, task]() mutable {
if (task->jobstatus != nullptr) task->save(id); auto sync_func = [this, task]() mutable {
}; if (task->jobstatus != nullptr) task->save(id);
sync_func(); };
} sync_func();
} }
} }
} }
@ -1148,6 +1148,7 @@ JobStatus::JobStatus(int id) : id(id) {
Task::Task(std::shared_ptr<JobStatus> jobstatus, std::int64_t time, std::shared_ptr<PackageConf> packageconf) Task::Task(std::shared_ptr<JobStatus> jobstatus, std::int64_t time, std::shared_ptr<PackageConf> packageconf)
: jobstatus(jobstatus), queue_time(time), is_running(false), log(std::make_shared<Log>()), parent_packageconf(packageconf) : jobstatus(jobstatus), queue_time(time), is_running(false), log(std::make_shared<Log>()), parent_packageconf(packageconf)
{ {
std::lock_guard<std::mutex> sync_lock(*sync_mutex_);
assert(log != nullptr && "Log pointer should never be null"); assert(log != nullptr && "Log pointer should never be null");
QSqlQuery insert_query(get_thread_connection()); QSqlQuery insert_query(get_thread_connection());
insert_query.prepare("INSERT INTO task (packageconf_id, jobstatus_id, queue_time) VALUES (?, ?, ?)"); insert_query.prepare("INSERT INTO task (packageconf_id, jobstatus_id, queue_time) VALUES (?, ?, ?)");
@ -1207,6 +1208,7 @@ bool Task::compare(const std::shared_ptr<Task>& lhs, const std::shared_ptr<Task>
} }
std::set<std::shared_ptr<Task>> Task::get_completed_tasks(std::vector<std::shared_ptr<PackageConf>> packageconfs, std::shared_ptr<std::map<std::string, std::shared_ptr<JobStatus>>> job_statuses, int page, int per_page) { std::set<std::shared_ptr<Task>> Task::get_completed_tasks(std::vector<std::shared_ptr<PackageConf>> packageconfs, std::shared_ptr<std::map<std::string, std::shared_ptr<JobStatus>>> job_statuses, int page, int per_page) {
std::lock_guard<std::mutex> sync_lock(*sync_mutex_);
std::set<std::shared_ptr<Task>> result; std::set<std::shared_ptr<Task>> result;
if (per_page < 1) { per_page = 1; } if (per_page < 1) { per_page = 1; }
@ -1251,6 +1253,7 @@ std::set<std::shared_ptr<Task>> Task::get_completed_tasks(std::vector<std::share
} }
void Task::save(int _packageconf_id) { void Task::save(int _packageconf_id) {
std::lock_guard<std::mutex> sync_lock(*sync_mutex_);
QSqlQuery query(get_thread_connection()); QSqlQuery query(get_thread_connection());
query.prepare("UPDATE task SET jobstatus_id = ?, queue_time = ?, start_time = ?, finish_time = ?, successful = ?, log = ? WHERE id = ?"); query.prepare("UPDATE task SET jobstatus_id = ?, queue_time = ?, start_time = ?, finish_time = ?, successful = ?, log = ? WHERE id = ?");
query.addBindValue(jobstatus->id); query.addBindValue(jobstatus->id);

@ -255,6 +255,9 @@ public:
} }
static bool compare(const std::shared_ptr<Task>& lhs, const std::shared_ptr<Task>& rhs); static bool compare(const std::shared_ptr<Task>& lhs, const std::shared_ptr<Task>& rhs);
private:
std::shared_ptr<std::mutex> sync_mutex_ = std::make_shared<std::mutex>();
}; };
inline size_t qHash(const PackageConf::PackageConfPlain& key, size_t seed = 0) { inline size_t qHash(const PackageConf::PackageConfPlain& key, size_t seed = 0) {

Loading…
Cancel
Save