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,
unref_buf(buf);
buf = NULL;
}
- nblogx("thread exiting cleanly");
+ if (arg != logger) {
+ nblogx("thread exiting cleanly");
+ }
return NULL;
}
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);
// 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(),
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);
}
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");