Sat, 31 Dec 2016 18:05:40 +0100
fixes cgi fd leak
/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2013 Olaf Wintermann. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include <stdio.h> #include <stdlib.h> #include <ucx/map.h> #include "threadpools.h" UcxMap *thread_pool_map = NULL; int numthrpools = 0; threadpool_t *default_thread_pool = NULL; threadpool_t *last_thrpool_c = NULL; int create_threadpool(sstr_t name, ThreadPoolConfig *cfg) { if(thread_pool_map == NULL) { thread_pool_map = ucx_map_new(16); } threadpool_t *pool = ucx_map_sstr_get(thread_pool_map, name); if(pool) { if(pool->min_threads > cfg->max_threads) { pool->min_threads = cfg->min_threads; pool->max_threads = cfg->max_threads; } else { pool->max_threads = cfg->max_threads; pool->min_threads = cfg->min_threads; } return 0; } else { threadpool_t *tp = threadpool_new(cfg->min_threads, cfg->max_threads); int ret = ucx_map_sstr_put(thread_pool_map, name, tp); if(ret == 0) { numthrpools++; last_thrpool_c = tp; } return ret; } } int check_thread_pool_cfg() { if(numthrpools > 0 ) { if(default_thread_pool) { return 0; } else { default_thread_pool = last_thrpool_c; return 0; } } ThreadPoolConfig cfg; cfg.min_threads = 4; cfg.max_threads = 8; cfg.queue_size = 64; cfg.stack_size = 262144; return create_threadpool(sstr("default"), &cfg); } threadpool_t* get_default_threadpool() { return default_thread_pool; } threadpool_t* get_threadpool(sstr_t name) { return ucx_map_sstr_get(thread_pool_map, name); }