Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c1353c4a authored by Bill Schilit's avatar Bill Schilit Committed by Gerrit Code Review
Browse files

Merge "Synchronize rootcanal periodic tasks to avoid a race with packet delivery."

parents 1643edea 3ef17d3e
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -303,6 +303,11 @@ class AsyncManager::AsyncTaskManager {
    return true;
  }

  void Synchronize(const CriticalCallback& critical) {
    std::unique_lock<std::mutex> guard(synchronization_mutex_);
    critical();
  }

  AsyncTaskManager() = default;
  AsyncTaskManager(const AsyncTaskManager&) = delete;
  AsyncTaskManager& operator=(const AsyncTaskManager&) = delete;
@@ -476,7 +481,7 @@ class AsyncManager::AsyncTaskManager {
      }
      if (run_it) {
        const std::lock_guard<std::mutex> lock(task_p->in_callback);
        callback();
        Synchronize(callback);
      }
      {
        std::unique_lock<std::mutex> guard(internal_mutex_);
@@ -502,6 +507,7 @@ class AsyncManager::AsyncTaskManager {
  bool running_ = false;
  std::thread thread_;
  std::mutex internal_mutex_;
  std::mutex synchronization_mutex_;
  std::condition_variable internal_cond_var_;

  AsyncTaskId lastTaskId_ = kInvalidTaskId;
@@ -562,8 +568,7 @@ bool AsyncManager::CancelAsyncTasksFromUser(rootcanal::AsyncUserId user_id) {
  return taskManager_p_->CancelAsyncTasksFromUser(user_id);
}

void AsyncManager::Synchronize(const CriticalCallback& critical_callback) {
  std::unique_lock<std::mutex> guard(synchronization_mutex_);
  critical_callback();
void AsyncManager::Synchronize(const CriticalCallback& critical) {
  taskManager_p_->Synchronize(critical);
}
}  // namespace rootcanal
+0 −2
Original line number Diff line number Diff line
@@ -119,8 +119,6 @@ class AsyncManager {
  // destroying the other one
  std::unique_ptr<AsyncFdWatcher> fdWatcher_p_;
  std::unique_ptr<AsyncTaskManager> taskManager_p_;

  std::mutex synchronization_mutex_;
};
}  // namespace rootcanal
#endif  // TEST_VENDOR_LIB_ASYNC_MANAGER_H_