blob: d1e6062b44419fdcb2f0fa357f63c11701141495 [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 EXTENSIONS_RENDERER_EXTENSION_THROTTLE_MANAGER_ACCESS_H_
#define EXTENSIONS_RENDERER_EXTENSION_THROTTLE_MANAGER_ACCESS_H_
#include <tuple>
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/synchronization/lock.h"
namespace extensions {
class ExtensionThrottleManager;
// A thread-safe helper to access an ExtensionThrottleManager.
//
// ExtensionURLLoaderThrottle instances can be used and destroyed on threads
// other than where ExtensionThrottleManager lives. They may outlive the
// ExtensionThrottleManager that created them. This class provides a safe way
// for throttles to access the manager, checking for its validity before
// access it.
class ExtensionThrottleManagerAccess
: public base::RefCountedThreadSafe<ExtensionThrottleManagerAccess> {
public:
explicit ExtensionThrottleManagerAccess(ExtensionThrottleManager* manager);
// Invoked when the manager is destroyed.
void SetDestroyed();
// Locks manager access and returns an AutoLock and a pointer. If the
// manager is already gone, the return pointer is nullptr. Otherwise, hold
// on to the AutoLock to keep the manager pointer valid.
std::tuple<base::MovableAutoLock, ExtensionThrottleManager*> Get();
private:
friend class base::RefCountedThreadSafe<ExtensionThrottleManagerAccess>;
~ExtensionThrottleManagerAccess();
base::Lock lock_;
raw_ptr<ExtensionThrottleManager> manager_ = nullptr;
};
} // namespace extensions
#endif // EXTENSIONS_RENDERER_EXTENSION_THROTTLE_MANAGER_ACCESS_H_