blob: 0c51f690d85c9798e746a06ae6a3f2de7250676d [file] [log] [blame]
// 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_