]> git.mdlowis.com Git - projs/tide.git/commitdiff
implemented telemetry for debugging
authorMichael D. Lowis <mike@mdlowis.com>
Wed, 30 Oct 2019 03:28:18 +0000 (23:28 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Wed, 30 Oct 2019 03:28:18 +0000 (23:28 -0400)
inc/edit.h
src/lib/job.c
src/lib/telem.c [new file with mode: 0644]
src/tide.c

index 41d1447fea743ec73651a86351b13ee1f2fbe0c1..a8b35bc7f384a20dda53b936d58bb5cd37c500a0 100644 (file)
@@ -1,3 +1,7 @@
+/* Debug Telemetry
+ *****************************************************************************/
+void telem_send(char* fmt, ...);
+
 /* Buffer management functions
  *****************************************************************************/
 /* undo/redo list item */
index eb84210cc50a516b4f47e757791090ceb374de71..89fa95387a2fe22da32b05d05ec7252a1510909b 100644 (file)
@@ -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 (file)
index 0000000..b58c94a
--- /dev/null
@@ -0,0 +1,99 @@
+#include <stdc.h>
+#include <time.h>
+#include <sys/types.h>
+#include <pwd.h>
+
+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);
+    }
+}
index 5a71a2dc22edddf958d28fd6bf068fad502395c5..69dc86830c224387de0e82ed55513c05ed091202 100644 (file)
@@ -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;