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