예제 #1
0
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;
}
예제 #2
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;
}