/* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef SRC_BASE_LOG_RING_BUFFER_H_ #define SRC_BASE_LOG_RING_BUFFER_H_ #include <stddef.h> #include <stdio.h> #include <array> #include <atomic> #include "perfetto/ext/base/string_view.h" #include "perfetto/ext/base/thread_annotations.h" namespace perfetto { namespace base { // Defined out of line because a static constexpr requires static storage if // ODR-used, not worth adding a .cc file just for tests. constexpr size_t kLogRingBufEntries = …; constexpr size_t kLogRingBufMsgLen = …; // A static non-allocating ring-buffer to hold the most recent log events. // This class is really an implementation detail of logging.cc. The only reason // why is fully defined in a dedicated header is for allowing unittesting, // without leaking extra headers into logging.h (which is a high-fanout header). // This is used to report the last logs in a crash report when a CHECK/FATAL // is encountered. // This class has just an Append() method to insert events into the buffer and // a Read() to read the events in FIFO order. Read() is non-destructive. // // Thread safety considerations: // - The Append() method can be called concurrently by several threads, unless // there are > kLogRingBufEntries concurrent threads. Even if that happens, // case some events will contain a mix of strings but the behavior of // futher Append() and Read() is still defined. // - The Read() method is not thread safe but it's fine in practice. Even if // it's called concurrently with other Append(), it only causes some partial // events to be emitted in output. // In both cases, we never rely purely on \0, all operations are size-bound. // // See logging_unittest.cc for tests. class LogRingBuffer { … }; } // namespace base } // namespace perfetto #endif // SRC_BASE_LOG_RING_BUFFER_H_