static void logbuf_flush (struct thread_state1 *self, logbuf_t lb) { if (lb->pos > BUF_OFFSET) { if (lb->pos < (int) sizeof (lb->buf)) lb->buf[lb->pos++] = '\n'; else lb->buf[sizeof (lb->buf) - 1] = '\n'; logbuf_flush_real (self, lb); } }
static void nn_vlogb (struct thread_state1 *self, const char *fmt, va_list ap) { int n, trunc = 0; size_t nrem; logbuf_t lb; if (*fmt == 0) return; if (self && self->lb) lb = self->lb; else { lb = &gv.static_logbuf; if (gv.static_logbuf_lock_inited) { /* not supposed to be multi-threaded when mutex not initialized */ os_mutexLock (&gv.static_logbuf_lock); } } nrem = lb->bufsz - lb->pos; if (nrem > 0) { n = os_vsnprintf (lb->buf + lb->pos, nrem, fmt, ap); if (n >= 0 && (size_t) n < nrem) lb->pos += (size_t) n; else { lb->pos += nrem; trunc = 1; } if (trunc) { static const char msg[] = "(trunc)\n"; const size_t msglen = sizeof (msg) - 1; assert (lb->pos <= lb->bufsz); assert (lb->pos >= msglen); memcpy (lb->buf + lb->pos - msglen, msg, msglen); } } if (fmt[strlen (fmt) - 1] == '\n') { logbuf_flush_real (self, lb); } if (lb == &gv.static_logbuf && gv.static_logbuf_lock_inited) { os_mutexUnlock (&gv.static_logbuf_lock); } }