blob: f35855e71373209b3e4d35c2efd102f1357efca7 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_WEB_APPLICATIONS_LOCKS_PARTITIONED_LOCK_HOLDER_H_
#define CHROME_BROWSER_WEB_APPLICATIONS_LOCKS_PARTITIONED_LOCK_HOLDER_H_
#include <vector>
#include "base/memory/weak_ptr.h"
#include "chrome/browser/web_applications/locks/partitioned_lock.h"
namespace web_app {
// Used to receive and hold locks from a PartitionedLockManager. This class
// enables the PartitionedLock objects to always live in the destination of the
// caller's choosing (as opposed to having the locks be an argument in the
// callback, where they could be owned by the task scheduler).
//
// This class must be used and destructed on the same sequence as the
// PartitionedLockManager.
class PartitionedLockHolder {
public:
PartitionedLockHolder();
PartitionedLockHolder(const PartitionedLockHolder&) = delete;
PartitionedLockHolder& operator=(const PartitionedLockHolder&) = delete;
~PartitionedLockHolder();
base::WeakPtr<PartitionedLockHolder> AsWeakPtr();
// Returns if all locks have been granted for this holder.
bool is_locked() const;
// Releases all locks held by this holder, also invalidating any pending lock
// requests. All WeakPtrs are invalidated.
void Release();
private:
friend class PartitionedLockManager;
std::vector<PartitionedLock> locks_;
bool is_locked_ = false;
base::WeakPtrFactory<PartitionedLockHolder> weak_factory_{this};
};
} // namespace web_app
#endif // CHROME_BROWSER_WEB_APPLICATIONS_LOCKS_PARTITIONED_LOCK_HOLDER_H_