qlog_t* qlog_new() { /* seems freelist no effect, so alloc directly */ return qcalloc(sizeof(qlog_t)); qlog_t *log; qmutex_lock(&free_log_list_lock); log = (qlog_t*)qfreelist_new(&free_log_list); qmutex_unlock(&free_log_list_lock); if (log != NULL) { /* del it from freelist alloc list */ qlist_del_init(&log->fentry); } return log; }
static void thread_log_box(int fd, int flags, void *data) { UNUSED(fd); UNUSED(flags); int i, idx; qsignal_t *signal; qlist_t *list, *pos, *next; qlog_t *log; qthread_log_t *thread_log; signal = (qsignal_t*)data; for (i = 0; ; i++) { if (signal == g_log_thread->signals[i]) { idx = i; break; } } thread_log = g_server->thread_log[idx]; qthread_log_fetch(thread_log, &list); /* * -1 means destroy the log thread */ if (flags != -1) { qsignal_recv(signal); qsignal_active(signal, 0); } for (pos = list->next; pos != list; ) { log = qlist_entry(pos, qlog_t, entry); next = pos->next; qlist_del_init(&(log->entry)); log->n += sprintf(log->buff + log->n, " %s:%d ", log->file, log->line); vsprintf(log->buff + log->n, log->format, log->args); printf("%s\n", log->buff); if (flags == -1) { /* do flush I/O work */ } free(log); pos = next; } }