blob: 5bc6537c7dd68a0c000a6ee0480a7d31f98b008d [file]
// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef NET_DISK_CACHE_SQL_SQL_ASYNC_TASK_MANAGER_H_
#define NET_DISK_CACHE_SQL_SQL_ASYNC_TASK_MANAGER_H_
#include <memory>
#include "base/functional/callback.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "base/types/pass_key.h"
#include "net/base/net_export.h"
namespace disk_cache {
class SqlAsyncTaskToken;
// Manages the tracking of asynchronous tasks in the SQL backend.
// It issues SqlAsyncTaskToken objects and keeps track of how many are currently
// alive. This allows tests to wait for all asynchronous operations to finish.
//
// This class is not thread-safe and must be used on a single sequence.
class NET_EXPORT_PRIVATE SqlAsyncTaskManager {
public:
SqlAsyncTaskManager();
~SqlAsyncTaskManager();
SqlAsyncTaskManager(const SqlAsyncTaskManager&) = delete;
SqlAsyncTaskManager& operator=(const SqlAsyncTaskManager&) = delete;
// Starts a new tracked task and returns a token. The task is considered
// pending until the returned token is destroyed.
std::unique_ptr<SqlAsyncTaskToken> StartTask();
// Runs the message loop until all tracked tasks are complete.
void RunUntilAllTasksCompleteForTest();
// Called by ~SqlAsyncTaskToken when a task completes.
void OnTaskComplete(base::PassKey<SqlAsyncTaskToken>);
private:
friend class SqlAsyncTaskManagerTest;
// Registers a callback to be run when all outstanding tasks have completed.
// If there are currently no pending tasks, the callback is run immediately.
void RunOnAllTasksCompleteForTest(base::OnceClosure callback);
void CheckAndRunCallback();
int pending_task_count_ = 0;
base::OnceClosure on_all_tasks_complete_callback_;
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<SqlAsyncTaskManager> weak_factory_{this};
};
} // namespace disk_cache
#endif // NET_DISK_CACHE_SQL_SQL_ASYNC_TASK_MANAGER_H_