blob: 10993e85079378c9049cd0ca466bed4fa910455d [file] [log] [blame]
John Park33858a32018-09-28 23:05:48 -07001#ifndef AOS_LOGGING_CONTEXT_H_
2#define AOS_LOGGING_CONTEXT_H_
Austin Schuh044e18b2015-10-21 20:17:09 -07003
Austin Schuh044e18b2015-10-21 20:17:09 -07004#include <sys/types.h>
Austin Schuh044e18b2015-10-21 20:17:09 -07005
Tyler Chatowbf0609c2021-07-31 16:13:27 -07006#include <cinttypes>
Tyler Chatowbf0609c2021-07-31 16:13:27 -07007#include <memory>
Austin Schuhad9e5eb2021-11-19 20:33:55 -08008#include <string_view>
Austin Schuh044e18b2015-10-21 20:17:09 -07009
Austin Schuh044e18b2015-10-21 20:17:09 -070010namespace aos {
11namespace logging {
12
Austin Schuh7bb558e2023-08-30 20:50:51 -070013#define LOG_MESSAGE_LEN 512
14#define LOG_MESSAGE_NAME_LEN 100
15
Austin Schuh044e18b2015-10-21 20:17:09 -070016class LogImplementation;
17
18// This is where all of the code that is only used by actual LogImplementations
19// goes.
20namespace internal {
21
Austin Schuh044e18b2015-10-21 20:17:09 -070022// An separate instance of this class is accessible from each task/thread.
23// NOTE: It will get deleted in the child of a fork.
24//
25// Get() and Delete() are implemented in the platform-specific interface.cc
26// file.
27struct Context {
28 Context();
29
30 // Gets the Context object for this task/thread. Will create one the first
31 // time it is called.
32 //
33 // The implementation for each platform will lazily instantiate a new instance
34 // and then initialize name the first time.
35 // IMPORTANT: The implementation of this can not use logging.
36 static Context *Get();
37 // Deletes the Context object for this task/thread so that the next Get() is
38 // called it will create a new one.
39 // It is valid to call this when Get() has never been called.
40 // This also gets called after a fork(2) in the new process, where it should
41 // still work to clean up any state.
42 static void Delete();
43
Austin Schuha0c41ba2020-09-10 22:59:14 -070044 static void DeleteNow();
45
Austin Schuh044e18b2015-10-21 20:17:09 -070046 // Which one to log to right now.
Austin Schuh56196432020-10-24 20:15:21 -070047 // Will be NULL if there is no logging implementation to use right now and we
48 // should use stderr instead.
Austin Schuha0c41ba2020-09-10 22:59:14 -070049 std::shared_ptr<LogImplementation> implementation;
Austin Schuh044e18b2015-10-21 20:17:09 -070050
51 // A name representing this task/(process and thread).
Austin Schuhad9e5eb2021-11-19 20:33:55 -080052 std::string_view MyName();
53 // Clears the cached name so MyName re-checks the thread's actual name.
54 void ClearName();
Austin Schuh044e18b2015-10-21 20:17:09 -070055
56 // What to assign LogMessage::source to in this task/thread.
57 pid_t source;
58
59 // The sequence value to send out with the next message.
60 uint16_t sequence;
Austin Schuhad9e5eb2021-11-19 20:33:55 -080061
62 private:
63 size_t name_size;
64 char name[LOG_MESSAGE_NAME_LEN];
Austin Schuh044e18b2015-10-21 20:17:09 -070065};
66
67} // namespace internal
68} // namespace logging
69} // namespace aos
70
John Park33858a32018-09-28 23:05:48 -070071#endif // AOS_LOGGING_CONTEXT_H_