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

Commit 3ef17d3e authored by Bill Schilit's avatar Bill Schilit
Browse files

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

Prevents "FATAL   | assertion 'HasHandle(handle)' failed - Unknown handle 47"

Tag: #compatibility
Test: ninja and nimble
Bug: 265583200

Change-Id: Ic4622ff5a17d21e86f4e3aea92e9a6007633fb49
parent 12573401
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_