mirror of
https://github.com/mauiaaron/apple2.git
synced 2024-11-17 13:10:38 +00:00
94 lines
2.2 KiB
C
94 lines
2.2 KiB
C
/*
|
|
* Apple // emulator for *nix
|
|
*
|
|
* This software package is subject to the GNU General Public License
|
|
* version 2 or later (your choice) as published by the Free Software
|
|
* Foundation.
|
|
*
|
|
* THERE ARE NO WARRANTIES WHATSOEVER.
|
|
*
|
|
*/
|
|
|
|
#if !defined(__linux__) || defined(NDEBUG)
|
|
// Linux tracing should not be enabled for release builds
|
|
#else
|
|
|
|
#include "common.h"
|
|
#include "trace.h"
|
|
|
|
#define MAX_MSG_LEN 1024
|
|
#define MAX_ARG_LEN 768
|
|
|
|
#define TRACING_FILE "/sys/kernel/debug/tracing/trace_marker"
|
|
|
|
#define FMT_TRACE_BEGIN "B|%d|%s"
|
|
#define FMT_TRACE_COUNT_BEGIN "C|%d|%s|%d"
|
|
|
|
static int trace_fd = -1;
|
|
static int trace_pid = -1;
|
|
|
|
__attribute__((constructor(CTOR_PRIORITY_LATE)))
|
|
static void _trace_init(void) {
|
|
TEMP_FAILURE_RETRY(trace_fd = open(TRACING_FILE, O_WRONLY));
|
|
if (trace_fd == -1) {
|
|
ERRLOG("Could not open kernel trace file");
|
|
} else {
|
|
LOG("Initialized Linux tracing facility");
|
|
}
|
|
trace_pid = getpid();
|
|
}
|
|
|
|
__attribute__((destructor(255)))
|
|
static void _trace_shutdown(void) {
|
|
if (trace_fd != -1) {
|
|
TEMP_FAILURE_RETRY(close(trace_fd));
|
|
trace_fd = -1;
|
|
}
|
|
}
|
|
|
|
void trace_begin(const char *fmt, ...) {
|
|
if (trace_fd == -1) {
|
|
return;
|
|
}
|
|
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
char args_buf[MAX_ARG_LEN] = { 0 };
|
|
vsnprintf(args_buf, MAX_ARG_LEN, fmt, args);
|
|
va_end(args);
|
|
|
|
char buf[MAX_MSG_LEN] = { 0 };
|
|
size_t length = snprintf(buf, MAX_MSG_LEN, FMT_TRACE_BEGIN, trace_pid, args_buf);
|
|
TEMP_FAILURE_RETRY(write(trace_fd, buf, length));
|
|
}
|
|
|
|
void trace_begin_count(uint32_t count, const char *fmt, ...) {
|
|
if (trace_fd == -1) {
|
|
return;
|
|
}
|
|
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
char args_buf[MAX_ARG_LEN] = { 0 };
|
|
vsnprintf(args_buf, MAX_ARG_LEN, fmt, args);
|
|
va_end(args);
|
|
|
|
char buf[MAX_MSG_LEN] = { 0 };
|
|
size_t length = snprintf(buf, MAX_MSG_LEN, FMT_TRACE_COUNT_BEGIN, trace_pid, args_buf, count);
|
|
TEMP_FAILURE_RETRY(write(trace_fd, buf, length));
|
|
}
|
|
|
|
void trace_end(void) {
|
|
if (trace_fd == -1) {
|
|
return;
|
|
}
|
|
TEMP_FAILURE_RETRY(write(trace_fd, "E", 1));
|
|
}
|
|
|
|
void _trace_cleanup(void *token) {
|
|
trace_end();
|
|
}
|
|
|
|
#endif // whole file
|
|
|