iochan_man_t iochan_man_create(int no_threads) { iochan_man_t man = xmalloc(sizeof(*man)); man->channel_list = 0; man->sel_thread = 0; /* can't create sel_thread yet because we may fork */ man->sel_fd = -1; man->no_threads = no_threads; man->log_level = yaz_log_module_level("iochan"); man->iochan_mutex = 0; yaz_mutex_create(&man->iochan_mutex); return man; }
sel_thread_t sel_thread_create(void (*work_handler)(void *work_data), void (*work_destroy)(void *work_data), int *read_fd, int no_of_threads) { int i; NMEM nmem = nmem_create(); sel_thread_t p = nmem_malloc(nmem, sizeof(*p)); assert(work_handler); /* work_destroy may be NULL */ assert(read_fd); assert(no_of_threads >= 1); p->nmem = nmem; #ifdef WIN32 /* use port 12119 temporarily on Windos and hope for the best */ p->spipe = yaz_spipe_create(12119, 0); #else p->spipe = yaz_spipe_create(0, 0); #endif if (!p->spipe) { nmem_destroy(nmem); return 0; } *read_fd = p->read_fd = yaz_spipe_get_read_fd(p->spipe); p->write_fd = yaz_spipe_get_write_fd(p->spipe); p->input_queue = 0; p->output_queue = 0; p->free_queue = 0; p->work_handler = work_handler; p->work_destroy = work_destroy; p->no_threads = 0; /* we if need to destroy */ p->stop_flag = 0; p->mutex = 0; yaz_mutex_create(&p->mutex); yaz_cond_create(&p->input_data); if (p->input_data == 0) /* condition variable could not be created? */ { sel_thread_destroy(p); return 0; } p->no_threads = no_of_threads; p->thread_id = nmem_malloc(nmem, sizeof(*p->thread_id) * p->no_threads); for (i = 0; i < p->no_threads; i++) p->thread_id[i] = yaz_thread_create(sel_thread_handler, p); return p; }
int http_session_use(int delta) { int sessions; if (!g_http_session_mutex) yaz_mutex_create(&g_http_session_mutex); yaz_mutex_enter(g_http_session_mutex); g_http_sessions += delta; sessions = g_http_sessions; yaz_mutex_leave(g_http_session_mutex); yaz_log(YLOG_DEBUG, "%s sessions=%d", delta == 0 ? "" : (delta > 0 ? "INC" : "DEC"), sessions); return sessions; }
static int iochan_use(int delta) { int iochans; if (!g_mutex) yaz_mutex_create(&g_mutex); yaz_mutex_enter(g_mutex); no_iochans += delta; if (delta > 0) no_iochans_total += delta; iochans = no_iochans; yaz_mutex_leave(g_mutex); yaz_log(YLOG_DEBUG, "%s iochans=%d", delta == 0 ? "" : (delta > 0 ? "INC" : "DEC"), iochans); return iochans; }
static int connection_use(int delta) { int result; if (!g_mutex) yaz_mutex_create(&g_mutex); yaz_mutex_enter(g_mutex); no_connections += delta; result = no_connections; if (delta > 0) total_no_connections += delta; yaz_mutex_leave(g_mutex); if (delta == 0) return result; yaz_log(YLOG_LOG, "%s connections=%d", delta > 0 ? "INC" : "DEC", no_connections); return result; }