int qlog_thread_new(qmem_pool_t *pool, int thread_num) { int i; int result, fd; g_log_thread = qalloc(pool, sizeof(qlog_thread_t)); if (g_log_thread == NULL) { return -1; } if (pthread_key_create(&g_thread_log_key, log_key_destroy) < 0) { return -1; } g_log_thread->engine = qengine_new(pool); if (g_log_thread->engine == NULL) { qfree(pool, g_log_thread, sizeof(qlog_thread_t)); g_log_thread = NULL; return -1; } g_log_thread->thread_num = thread_num; g_log_thread->signals = qalloc(pool, thread_num * sizeof(qsignal_t*)); if (g_log_thread->signals == NULL) { qengine_destroy(g_log_thread->engine); qfree(pool, g_log_thread, sizeof(qlog_thread_t)); g_log_thread = NULL; return -1; } for (i = 0; i < thread_num; ++i) { g_log_thread->signals[i] = qsignal_new(pool); fd = qsignal_get_fd(g_log_thread->signals[i]); qengine_add_event(g_log_thread->engine, fd, QEVENT_READ, thread_log_box, g_log_thread->signals[i]); } g_log_thread->started = 0; result = pthread_create(&g_log_thread->id, NULL, main_loop, g_log_thread); qassert(result == 0); /* ugly, but works */ while (g_log_thread->started == 0) { usleep(100); } return 0; }
int qlogger_new(int thread_num, qthread_start_pt done) { qlog_init_free_list(); logger = qcalloc(sizeof(qlogger_t)); if (logger == NULL) { return QERROR; } if (pthread_key_create(&thread_log_key, log_key_destroy) < 0) { return QERROR; } logger->fd = -1; logger->log_size = 0; if (config.daemon) { qlogger_open_file(); } logger->engine = qengine_new(); if (logger->engine == NULL) { return QERROR; } qmailbox_init(&(logger->box), logger_msg_handler, logger->engine, logger); logger->box.done = logger_handle_msglist_done; logger->thread_num = thread_num; qlist_entry_init(&(logger->free_list)); log_time_handler(NULL); qtimer_add(logger->engine, 1000, log_time_handler, NULL, 1000, NULL); logger->running = 0; logger->done = done; pthread_create(&logger->id, NULL, logger_main, logger); return QOK; }