From a13045d99b032ef15f274ab4f738976ce52a8d8f Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Tue, 29 Oct 2019 23:28:18 -0400 Subject: [PATCH] implemented telemetry for debugging --- inc/edit.h | 4 ++ src/lib/job.c | 11 ++++++ src/lib/telem.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++ src/tide.c | 13 +++++-- 4 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 src/lib/telem.c diff --git a/inc/edit.h b/inc/edit.h index 41d1447..a8b35bc 100644 --- a/inc/edit.h +++ b/inc/edit.h @@ -1,3 +1,7 @@ +/* Debug Telemetry + *****************************************************************************/ +void telem_send(char* fmt, ...); + /* Buffer management functions *****************************************************************************/ /* undo/redo list item */ diff --git a/src/lib/job.c b/src/lib/job.c index eb84210..89fa953 100644 --- a/src/lib/job.c +++ b/src/lib/job.c @@ -92,12 +92,22 @@ static void job_process(int fd, int events) while (job && job->fd != fd) job = job->next; if (!job || !events) return; + telem_send("JOB(fd: %d, events: 0x%x)\n", fd, events); if (job->readfn && (events & POLLIN)) + { + telem_send("JOB_READ(fd: %d)\n", job->fd); job->readfn(job); + } if (job->writefn && (events & POLLOUT)) + { + telem_send("JOB_WRITE(fd: %d)\n", job->fd); job->writefn(job); + } if ((events & (POLLHUP|POLLERR) && !job->readfn) || (!job->readfn && !job->writefn)) + { + telem_send("JOB_FINISH(fd: %d)\n", job->fd); job_finish(job); + } } static int job_exec(char** cmd, int* p_pid) @@ -159,6 +169,7 @@ bool job_poll(int ms) } /* Poll until a job is ready, call the functions based on events */ long ret = poll(JobFds, njobs, ms); + telem_send("POLL(njobs: %d, ms: %d, ret: %d)\n", njobs, ms, ret); if (ret < 0) { perror("poll() failed: "); diff --git a/src/lib/telem.c b/src/lib/telem.c new file mode 100644 index 0000000..b58c94a --- /dev/null +++ b/src/lib/telem.c @@ -0,0 +1,99 @@ +#include +#include +#include +#include + +static int TelemFd = -1; +static char TelemBuf[16384]; + +static long writefd(int fd, char* data, long towrite) +{ + long nwrite = 0; + while (towrite && ((nwrite = write(fd, data, towrite)) > 0)) + { + data += nwrite; + towrite -= nwrite; + } + return nwrite; +} + +static int open_telem(char* path) +{ + static unsigned long prev = 0; + unsigned long curr = time(NULL); + if ((TelemFd < 0) && ((curr - prev) >= 1)) + { + TelemFd = open(path, O_WRONLY|O_NONBLOCK, 0); + prev = curr; + } + return TelemFd; +} + +static void close_telem(void) +{ + close(TelemFd); + TelemFd = -1; +} + +static char* advance(char* buf, size_t* p_len, long nwrite) +{ + if (nwrite >= 0) + { + *p_len -= nwrite; + buf = (buf + nwrite); + } + return buf; +} + +static char* add_timestamp(char* buf, size_t* p_len) +{ + time_t rawtime; + time(&rawtime); + struct tm* timeinfo = localtime(&rawtime); + long nwrite = strftime(buf, *p_len, "[%F %T] ", timeinfo); + return advance(buf, p_len, nwrite); +} + +static char* add_pid(char* buf, size_t* p_len) +{ + long nwrite = snprintf(buf, *p_len, "%s(%d) ", ARGV0, getpid()); + return advance(buf, p_len, nwrite); +} + +static char* add_message(char* buf, size_t* p_len, char* fmt, va_list args) +{ + long nwrite = vsnprintf(buf, *p_len, fmt, args); + return advance(buf, p_len, nwrite); +} + +static char* get_fifo_path(void) +{ + static char path[1024] = {0}; + if (!path[0]) + { + snprintf(path, sizeof(path)-1,"%s/tide-telem", getpwuid(getuid())->pw_dir); + } + return path; +} + +void telem_send(char* fmt, ...) +{ + char* str = TelemBuf; + size_t nleft = sizeof(TelemBuf); + int fd = open_telem(get_fifo_path()); + if (fd >= 0) + { + void (*sigfn)(int) = signal(SIGPIPE, SIG_IGN); + va_list args; + va_start(args, fmt); + str = add_timestamp(str, &nleft); + str = add_pid(str, &nleft); + str = add_message(str, &nleft, fmt, args); + va_end(args); + if (writefd(fd, TelemBuf, str - TelemBuf) < 0) + { + close_telem(); + } + signal(SIGPIPE, sigfn); + } +} diff --git a/src/tide.c b/src/tide.c index 5a71a2d..69dc868 100644 --- a/src/tide.c +++ b/src/tide.c @@ -16,8 +16,7 @@ static void exec(char* cmd, char* arg); void cut(char* arg); void paste(char* arg); -typedef struct -{ +typedef struct { char* tag; void (*action)(char*); } Tag; @@ -138,6 +137,7 @@ static void xkeypress(XConf* x, XEvent* e) { Focused = (e->xkey.y <= Divider ? TAGS : EDIT); uint32_t key = x11_process_key(x, e, Bindings); + telem_send("KEY(reg: %d, key: 0x%x)\n", Focused, key); if (key != RUNE_ERR) view_insert(win_view(FOCUSED), key); } @@ -148,7 +148,10 @@ static void xmousebtn(XConf* x, XEvent* e) size_t row, col; Focused = (e->xbutton.y <= Divider ? TAGS : EDIT); get_position(Focused, e->xbutton.x, e->xbutton.y, &row, &col); - switch (process_mouse(e->xbutton.button, (e->type == ButtonPress))) + int action = process_mouse(e->xbutton.button, (e->type == ButtonPress)); + telem_send("BTNPRESS(reg: %d, btn: %d, press: %d, act: %d)\n", + Focused, e->xbutton.button, (e->type == ButtonPress), action); + switch (action) { case MouseActNone: break; @@ -215,6 +218,8 @@ static void xbtnmotion(XConf* x, XEvent* e) size_t row, col; int xpos = e->xbutton.x, ypos = e->xbutton.y; get_position(Focused, xpos, ypos, &row, &col); + telem_send("BTNMOVE(reg: %d, btn: 0x%x, x: %d, y: %d, r: %d, c: %d)\n", + Focused, e->xbutton.state, xpos, ypos, row, col); if (PRESSED(e->xbutton.state, MouseLeft)) view_setcursor(win_view(Focused), row, col, true); } @@ -229,6 +234,7 @@ static void xclientmsg(XConf* x, XEvent* e) void xresize(XConf* x, XEvent* e) { + telem_send("RESIZE(w: %d, h: %d)\n", e->xconfigure.width, e->xconfigure.height); if (e->xconfigure.width != x->width || e->xconfigure.height != x->height) view_sync(win_view(EDIT)); x11_resize(x, e); @@ -248,6 +254,7 @@ static void xredraw(XConf* x) size_t tagrows = view_limitrows(win_view(TAGS), maxtagrows); size_t tagregsz = (tagrows * x->tagfont->height) + 7; size_t editrows = (height - tagregsz) / x->font->height ; + telem_send("REDRAW(tagrows: %d, editrows: %d)\n", tagrows, editrows); /* draw the regions to the window */ int olddiv = Divider; -- 2.51.0