// Copyright 2021 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_ALLOCATOR_PARTITION_ALLOCATOR_STARSCAN_LOGGING_H_ #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_STARSCAN_LOGGING_H_ #include "base/allocator/partition_allocator/allocation_guard.h" #include "base/allocator/partition_allocator/partition_alloc_base/logging.h" namespace partition_alloc::internal { // Logging requires allocations. This logger allows reentrant allocations to // happen within the allocator context. struct LoggerWithAllowedAllocations : ScopedAllowAllocations, logging::LogMessage { using logging::LogMessage::LogMessage; }; #define PA_PCSCAN_VLOG_STREAM(verbose_level) \ ::partition_alloc::internal::LoggerWithAllowedAllocations( \ __FILE__, __LINE__, -(verbose_level)) \ .stream() // Logging macro that is meant to be used inside *Scan. Generally, reentrancy // may be an issue if the macro is called from malloc()/free(). Currently, it's // only called at the end of *Scan and when scheduling a new *Scan task. // Allocating from these paths should not be an issue, since we make sure that // no infinite recursion can occur (e.g. we can't schedule two *Scan tasks and // the inner free() call must be non-reentrant). However, these sorts of things // are tricky to enforce and easy to mess up with. Since verbose *Scan logging // is essential for debugging, we choose to provide support for it inside *Scan. #define PA_PCSCAN_VLOG(verbose_level) \ PA_LAZY_STREAM(PA_PCSCAN_VLOG_STREAM(verbose_level), \ PA_VLOG_IS_ON(verbose_level)) } // namespace partition_alloc::internal #endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_STARSCAN_LOGGING_H_