blob: 10993e85079378c9049cd0ca466bed4fa910455d [file] [log] [blame]
#ifndef AOS_LOGGING_CONTEXT_H_
#define AOS_LOGGING_CONTEXT_H_
#include <sys/types.h>
#include <cinttypes>
#include <memory>
#include <string_view>
namespace aos {
namespace logging {
#define LOG_MESSAGE_LEN 512
#define LOG_MESSAGE_NAME_LEN 100
class LogImplementation;
// This is where all of the code that is only used by actual LogImplementations
// goes.
namespace internal {
// An separate instance of this class is accessible from each task/thread.
// NOTE: It will get deleted in the child of a fork.
//
// Get() and Delete() are implemented in the platform-specific interface.cc
// file.
struct Context {
Context();
// Gets the Context object for this task/thread. Will create one the first
// time it is called.
//
// The implementation for each platform will lazily instantiate a new instance
// and then initialize name the first time.
// IMPORTANT: The implementation of this can not use logging.
static Context *Get();
// Deletes the Context object for this task/thread so that the next Get() is
// called it will create a new one.
// It is valid to call this when Get() has never been called.
// This also gets called after a fork(2) in the new process, where it should
// still work to clean up any state.
static void Delete();
static void DeleteNow();
// Which one to log to right now.
// Will be NULL if there is no logging implementation to use right now and we
// should use stderr instead.
std::shared_ptr<LogImplementation> implementation;
// A name representing this task/(process and thread).
std::string_view MyName();
// Clears the cached name so MyName re-checks the thread's actual name.
void ClearName();
// What to assign LogMessage::source to in this task/thread.
pid_t source;
// The sequence value to send out with the next message.
uint16_t sequence;
private:
size_t name_size;
char name[LOG_MESSAGE_NAME_LEN];
};
} // namespace internal
} // namespace logging
} // namespace aos
#endif // AOS_LOGGING_CONTEXT_H_