12003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol/* 22003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol * Copyright (C) 2017 The Android Open Source Project 32003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol * 42003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol * Licensed under the Apache License, Version 2.0 (the "License"); 52003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol * you may not use this file except in compliance with the License. 62003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol * You may obtain a copy of the License at 72003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol * 82003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol * http://www.apache.org/licenses/LICENSE-2.0 92003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol * 102003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol * Unless required by applicable law or agreed to in writing, software 112003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol * distributed under the License is distributed on an "AS IS" BASIS, 122003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol * See the License for the specific language governing permissions and 142003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol * limitations under the License. 152003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol */ 162003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol 172003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol#ifndef CHRE_PLATFORM_PLATFORM_LOG_BASE_H_ 182003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol#define CHRE_PLATFORM_PLATFORM_LOG_BASE_H_ 192003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol 20589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol#include <cstddef> 21589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol#include <cstdint> 22589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol 23589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol#include "chre/platform/mutex.h" 24589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol 252003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignolnamespace chre { 262003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol 272003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol/** 282003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol * Storage for the SLPI implementation of PlatformLog. 292003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol */ 302003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignolclass PlatformLogBase { 31589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol public: 32589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol typedef void (FlushLogBufferCallback)(const char *buffer, size_t bufferSize, 33589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol void *context); 34589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol 35589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol /** 36589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol * Flushes the log buffer by invoking a provided callback, passing in the log 37589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol * buffer and size, then resetting the log buffer. The callback is invoked 38589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol * within the context of the logging lock which guarantees exclusive access to 39589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol * the buffer. The callback should not attempt to use the PlatformLog::log() 40589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol * method or else a deadlock will occur. 41589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol * 42589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol * @param callback the callback to invoke within the context of a lock on the 43589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol * log buffer. 44589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol * @param context a context pointer to provide to the callback. 45589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol */ 46589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol void flushLogBuffer(FlushLogBufferCallback callback, void *context); 47589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol 482003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol protected: 49589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol //! The maximum size of a formatted log message. 50589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol static constexpr size_t kMaxLogMessageSize = 160; 51589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol 52589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol //! The size of the logging buffer, in bytes. Assuming an average log message 53589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol //! has a length of 60, this allows for ~70 log messages. Some messages may 54589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol //! be longer, some may be shorter. YMMV but this should be a good balance 55589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol //! between AP wakeups and memory usage. 56589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol static constexpr size_t kLogBufferSize = (1 * 1024); 57589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol 58589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol //! The watermark point at which log buffers should be sent to the host. This 59589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol //! cannot be zero or else an infinite loop may be caused. It must be large 60589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol //! enough to hold a few messages. 61589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol static constexpr size_t kLogBufferWatermarkSize = (kLogBufferSize * 20) / 100; 62589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol 63589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol //! A mutex for acquiring exclusive control over the log buffer and other 64589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol //! internal state. 65589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol Mutex mMutex; 66589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol 67589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol //! The buffer to log messages into. 68589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol char mLogBuffer[kLogBufferSize]; 69589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol 70589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol //! The current size of messages logged in the buffer. 71589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol size_t mLogBufferSize = 0; 72589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol 73589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol //! Set to true when a log flush is pending. Do not request another log flush 74589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol //! if this is set to true. 75589e0f01fa3fb1512b52da3a52f6e41e7a765bcaAndrew Rossignol bool mLogFlushPending = false; 762003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol}; 772003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol 782003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol} // namespace chre 792003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol 802003cdc07c3ad198d58ba26524d215c9a1b3bdd9Andrew Rossignol#endif // CHRE_PLATFORM_PLATFORM_LOG_BASE_H_ 81