Free memory, check queues are empty on exit.
[buftee] / buftee.c
index 7ab731b..ae74b08 100644 (file)
--- a/buftee.c
+++ b/buftee.c
@@ -188,7 +188,7 @@ static void _nblog_helper(int want_errno,
                           const char* format,
                           ...);  // Forward.
 
-#define nblog(fmt...) _nblog_helper(1, __LINE__, __FUNCTION__, fmt)
+//#define nblog(fmt...) _nblog_helper(1, __LINE__, __FUNCTION__, fmt)
 #define nblogx(fmt...) _nblog_helper(0, __LINE__, __FUNCTION__, fmt)
 
 static void warn_time(const char* desc,
@@ -338,7 +338,9 @@ static void* writer_routine(void *arg) {
     unref_buf(buf);
     buf = NULL;
   }
-  nblogx("thread exiting cleanly");
+  if (arg != logger) {
+    nblogx("thread exiting cleanly");
+  }
   return NULL;
 }
 
@@ -383,10 +385,7 @@ static void _nblog_helper(int want_errno,
                           const char* func,
                           const char* format,
                           ...) {
-  int saved_errno;
-  if (want_errno)
-    saved_errno = errno;
-
+  int saved_errno = errno;
   va_list va;
   va_start(va, format);
 
@@ -398,7 +397,7 @@ static void _nblog_helper(int want_errno,
 
   // Prefix.
   char buf[512];
-  size_t len;
+  int len;
   extern char *__progname;  // This is where glibc stashes argv[0].
   len = snprintf(buf, sizeof(buf), "%s:%d:%s(): tid %d at %d.%09d: ",
                  __progname, line, func, gettid(),
@@ -512,7 +511,9 @@ int main(int argc, char **argv) {
   while (!STAILQ_EMPTY(&writers)) {
     struct writer_thread* writer = STAILQ_FIRST(&writers);
     STAILQ_REMOVE_HEAD(&writers, entries);
-    // FIXME: free its queue?
+    if (!STAILQ_EMPTY(&writer->queue)) {
+      nblogx("queue for fd %d is not empty", writer->fd);
+    }
     free(writer);
   }
 
@@ -523,6 +524,10 @@ int main(int argc, char **argv) {
   xpthread_cond_broadcast(logger->cond);
   unlock(logger->mutex);
   xpthread_join(logger->thread);
+  pthread_mutex_destroy(logger->mutex);
+  free(logger->mutex);
+  pthread_cond_destroy(logger->cond);
+  free(logger->cond);
   free(logger);
 
   warnx("exiting cleanly");