// Copyright 2020 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_THREADING_SCOPED_BLOCKING_CALL_INTERNAL_H_ #define BASE_THREADING_SCOPED_BLOCKING_CALL_INTERNAL_H_ #include <optional> #include "base/auto_reset.h" #include "base/base_export.h" #include "base/functional/callback_forward.h" #include "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" #include "base/synchronization/lock.h" #include "base/thread_annotations.h" #include "base/time/time.h" #include "base/types/strong_alias.h" namespace base { // Forward-declare types from scoped_blocking_call.h to break cyclic dependency. enum class BlockingType; IOJankReportingCallback; OnlyObservedThreadsForTest; void BASE_EXPORT EnableIOJankMonitoringForProcess(IOJankReportingCallback, OnlyObservedThreadsForTest); // Implementation details of types in scoped_blocking_call.h and classes for a // few key //base types to observe and react to blocking calls. namespace internal { // Interface for an observer to be informed when a thread enters or exits // the scope of ScopedBlockingCall objects. class BASE_EXPORT BlockingObserver { … }; // Registers |new_blocking_observer| on the current thread. It is invalid to // call this on a thread where there is an active ScopedBlockingCall. BASE_EXPORT void SetBlockingObserverForCurrentThread( BlockingObserver* new_blocking_observer); BASE_EXPORT void ClearBlockingObserverForCurrentThread(); // An IOJankMonitoringWindow instruments 1-minute of runtime. Any I/O jank > 1 // second happening during that period will be reported to it. It will then // report via the IOJankReportingCallback in |reporting_callback_storage()| if // it's non-null. https://bit.ly/chrome-io-jank-metric. class BASE_EXPORT [[maybe_unused, nodiscard]] IOJankMonitoringWindow : public RefCountedThreadSafe<IOJankMonitoringWindow> { … }; // Common implementation class for both ScopedBlockingCall and // ScopedBlockingCallWithBaseSyncPrimitives without assertions. class BASE_EXPORT [[maybe_unused, nodiscard]] UncheckedScopedBlockingCall { … }; } // namespace internal } // namespace base #endif // BASE_THREADING_SCOPED_BLOCKING_CALL_INTERNAL_H_