cosmopolitan/libc/log/log.h

239 lines
10 KiB
C
Raw Normal View History

2020-06-15 14:18:57 +00:00
#ifndef COSMOPOLITAN_LIBC_LOG_LOG_H_
#define COSMOPOLITAN_LIBC_LOG_LOG_H_
#include "libc/calls/struct/rusage.h"
#include "libc/calls/struct/sigset.h"
#include "libc/calls/struct/winsize.h"
2022-07-09 12:49:19 +00:00
#include "libc/dce.h"
#include "libc/errno.h"
#include "libc/intrin/likely.h"
#include "libc/nexgen32e/stackframe.h"
#include "libc/runtime/runtime.h"
#include "libc/stdio/stdio.h"
2020-06-15 14:18:57 +00:00
#define kLogFatal 0
#define kLogError 1
#define kLogWarn 2
#define kLogInfo 3
#define kLogVerbose 4
#define kLogDebug 5
#define kLogNoise 6
2020-06-15 14:18:57 +00:00
/**
* Log level for compile-time DCE.
*/
#ifndef LOGGABLELEVEL
#ifndef TINY
#define LOGGABLELEVEL kLogNoise
/* #elif IsTiny() */
/* #define LOGGABLELEVEL kLogInfo */
2020-06-15 14:18:57 +00:00
#else
#define LOGGABLELEVEL kLogVerbose
2020-06-15 14:18:57 +00:00
#endif
#endif
#if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_
extern FILE *__log_file;
2020-06-15 14:18:57 +00:00
int __watch(void *, size_t);
void __die(void) relegated wontreturn; /* print backtrace and abort() */
void meminfo(int); /* shows malloc statistics &c. */
void memsummary(int); /* light version of same thing */
2020-06-15 14:18:57 +00:00
uint16_t getttycols(uint16_t);
int getttysize(int, struct winsize *) paramsnonnull();
bool IsTerminalInarticulate(void) nosideeffect;
const char *commandvenv(const char *, const char *);
const char *GetAddr2linePath(void);
const char *GetGdbPath(void);
const char *GetCallerName(const struct StackFrame *);
2020-06-15 14:18:57 +00:00
void ShowCrashReports(void);
2020-06-15 14:18:57 +00:00
void callexitontermination(struct sigset *);
bool32 IsDebuggerPresent(bool);
bool IsRunningUnderMake(void);
const char *GetSiCodeName(int, int);
void AppendResourceReport(char **, struct rusage *, const char *);
char *__get_symbol_by_addr(int64_t);
void PrintGarbage(void);
2021-08-19 15:30:00 +00:00
void PrintGarbageNumeric(FILE *);
void CheckForMemoryLeaks(void);
2020-06-15 14:18:57 +00:00
#define showcrashreports() ShowCrashReports()
2020-12-01 11:43:40 +00:00
#ifndef __STRICT_ANSI__
2020-06-15 14:18:57 +00:00
extern unsigned __log_level; /* log level for runtime check */
2020-06-15 14:18:57 +00:00
2020-12-24 07:42:56 +00:00
#define LOGGABLE(LEVEL) \
((!__builtin_constant_p(LEVEL) || (LEVEL) <= LOGGABLELEVEL) && \
(LEVEL) <= __log_level)
2020-06-15 14:18:57 +00:00
// log a message with the specified log level (not checking if LOGGABLE)
#define LOGF(LEVEL, FMT, ...) \
do { \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) --__ftrace; \
flogf(LEVEL, __FILE__, __LINE__, NULL, FMT, ##__VA_ARGS__); \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) ++__ftrace; \
} while (0)
// report an error without backtrace and debugger invocation
#define FATALF(FMT, ...) \
do { \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) --__ftrace; \
flogf(kLogError, __FILE__, __LINE__, NULL, FMT, ##__VA_ARGS__); \
2022-05-22 15:13:13 +00:00
__restorewintty(); \
_Exit(1); \
unreachable; \
} while (0)
#define DIEF(FMT, ...) \
do { \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) --__ftrace; \
ffatalf(kLogFatal, __FILE__, __LINE__, NULL, FMT, ##__VA_ARGS__); \
unreachable; \
} while (0)
2022-07-09 12:49:19 +00:00
#define ERRORF(FMT, ...) \
do { \
if (LOGGABLE(kLogError)) { \
LOGF(kLogError, FMT, ##__VA_ARGS__); \
} \
} while (0)
2022-07-09 12:49:19 +00:00
#define WARNF(FMT, ...) \
do { \
if (LOGGABLE(kLogWarn)) { \
LOGF(kLogWarn, FMT, ##__VA_ARGS__); \
} \
} while (0)
2022-07-09 12:49:19 +00:00
#define INFOF(FMT, ...) \
do { \
if (LOGGABLE(kLogInfo)) { \
LOGF(kLogInfo, FMT, ##__VA_ARGS__); \
} \
2020-06-15 14:18:57 +00:00
} while (0)
#define VERBOSEF(FMT, ...) \
do { \
if (LOGGABLE(kLogVerbose)) { \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) --__ftrace; \
fverbosef(kLogVerbose, __FILE__, __LINE__, NULL, FMT, ##__VA_ARGS__); \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) ++__ftrace; \
} \
} while (0)
#define DEBUGF(FMT, ...) \
do { \
if (UNLIKELY(LOGGABLE(kLogDebug))) { \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) --__ftrace; \
fdebugf(kLogDebug, __FILE__, __LINE__, NULL, FMT, ##__VA_ARGS__); \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) ++__ftrace; \
} \
} while (0)
#define NOISEF(FMT, ...) \
do { \
if (UNLIKELY(LOGGABLE(kLogNoise))) { \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) --__ftrace; \
fnoisef(kLogNoise, __FILE__, __LINE__, NULL, FMT, ##__VA_ARGS__); \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) ++__ftrace; \
} \
} while (0)
2020-06-15 14:18:57 +00:00
#define FLOGF(F, FMT, ...) \
do { \
if (LOGGABLE(kLogInfo)) { \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) --__ftrace; \
flogf(kLogInfo, __FILE__, __LINE__, F, FMT, ##__VA_ARGS__); \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) ++__ftrace; \
2020-06-15 14:18:57 +00:00
} \
} while (0)
#define FWARNF(F, FMT, ...) \
do { \
if (LOGGABLE(kLogWarn)) { \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) --__ftrace; \
flogf(kLogWarn, __FILE__, __LINE__, F, FMT, ##__VA_ARGS__); \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) ++__ftrace; \
2020-06-15 14:18:57 +00:00
} \
} while (0)
2022-07-09 12:49:19 +00:00
#define FFATALF(F, FMT, ...) \
do { \
if (!IsTiny()) --__ftrace; \
flogf(kLogError, __FILE__, __LINE__, F, FMT, ##__VA_ARGS__); \
__restorewintty(); \
_Exit(1); \
unreachable; \
2020-06-15 14:18:57 +00:00
} while (0)
#define FDEBUGF(F, FMT, ...) \
do { \
if (UNLIKELY(LOGGABLE(kLogDebug))) { \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) --__ftrace; \
fdebugf(kLogDebug, __FILE__, __LINE__, F, FMT, ##__VA_ARGS__); \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) ++__ftrace; \
2020-06-15 14:18:57 +00:00
} \
} while (0)
#define FNOISEF(F, FMT, ...) \
do { \
if (UNLIKELY(LOGGABLE(kLogNoise))) { \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) --__ftrace; \
fnoisef(kLogNoise, __FILE__, __LINE__, F, FMT, ##__VA_ARGS__); \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) ++__ftrace; \
} \
} while (0)
#define LOGIFNEG1(FORM) \
({ \
int e = errno; \
autotype(FORM) Ax = (FORM); \
if (UNLIKELY(Ax == (typeof(Ax))(-1)) && LOGGABLE(kLogWarn)) { \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) --__ftrace; \
__logerrno(__FILE__, __LINE__, #FORM); \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) ++__ftrace; \
errno = e; \
} \
Ax; \
2020-06-15 14:18:57 +00:00
})
#define LOGIFNULL(FORM) \
({ \
int e = errno; \
autotype(FORM) Ax = (FORM); \
if (Ax == NULL && LOGGABLE(kLogWarn)) { \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) --__ftrace; \
__logerrno(__FILE__, __LINE__, #FORM); \
2022-07-09 12:49:19 +00:00
if (!IsTiny()) ++__ftrace; \
errno = e; \
} \
Ax; \
2020-06-15 14:18:57 +00:00
})
void __logerrno(const char *, int, const char *) relegated;
#define ARGS unsigned, const char *, int, FILE *, const char *
#define ATTR paramsnonnull((5)) printfesque(5)
#define ATTRV paramsnonnull((5, 6))
void flogf(ARGS, ...) ATTR libcesque;
void vflogf(ARGS, va_list) ATTRV libcesque;
void fverbosef(ARGS, ...) asm("flogf") ATTR relegated libcesque;
void vfverbosef(ARGS, va_list) asm("vflogf") ATTRV relegated libcesque;
2020-06-15 14:18:57 +00:00
void fdebugf(ARGS, ...) asm("flogf") ATTR relegated libcesque;
void vfdebugf(ARGS, va_list) asm("vflogf") ATTRV relegated libcesque;
void fnoisef(ARGS, ...) asm("flogf") ATTR relegated libcesque;
void vfnoisef(ARGS, va_list) asm("vflogf") ATTRV relegated libcesque;
void ffatalf(ARGS, ...) asm("flogf") ATTR relegated wontreturn libcesque;
void vffatalf(ARGS, va_list) asm("vflogf") ATTRV relegated wontreturn libcesque;
2020-06-15 14:18:57 +00:00
#undef ARGS
#undef ATTR
#undef ATTRV
2020-12-01 11:43:40 +00:00
#endif /* __STRICT_ANSI__ */
2020-06-15 14:18:57 +00:00
COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_LIBC_LOG_LOG_H_ */