diff options
Diffstat (limited to 'src/thrd/pool.h')
| -rwxr-xr-x[-rw-r--r--] | src/thrd/pool.h | 98 |
1 files changed, 44 insertions, 54 deletions
diff --git a/src/thrd/pool.h b/src/thrd/pool.h index 87b73c2..c4dcd21 100644..100755 --- a/src/thrd/pool.h +++ b/src/thrd/pool.h @@ -1,27 +1,3 @@ -/*:* - *: File: ./src/thrd/pool.h - *: - *: yChat; Homepage: www.yChat.org; Version 0.8.3-CURRENT - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - #include "../incl.h" #ifndef POOL_H @@ -29,46 +5,60 @@ using namespace std; -struct task -{ - void(*p_func)(void*); - void *p_void; - - task(void(*p_func)(void*), void *p_void) - { - this->p_func = p_func; - this->p_void = p_void; - } -}; - class pool { private: - friend class thro; + static int i_thrd_used; + typedef struct tpool_work { + void (*routine)(void*); /// + void *p_void; + struct tpool_work *next; + } + tpool_work_t; - static pthread_mutex_t mut_threads; - static pthread_mutex_t mut_queue_tasks; - static pthread_mutex_t mut_num_avail_threads; - static pthread_cond_t cond_new_task; + typedef struct tpool + { + // pool characteristics: + int num_threads; + int max_queue_size; - static int i_num_avail_threads; - static int i_num_total_threads; + // pool state + pthread_t *threads; + int cur_queue_size; - static int i_max_queue_size; - static int i_cur_queue_index; - static int i_free_queue_index; - static task** queue_tasks; + tpool_work_t *queue_head; + tpool_work_t *queue_tail; - static int increase_pool(int i_num); - static void* wait_for_task(void *p_void); - static void run_func(void *p_void); + pthread_mutex_t queue_lock; + pthread_cond_t queue_not_empty; + pthread_cond_t queue_not_full; + pthread_cond_t queue_empty; + } + *tpool_t; + + int i_thrd_pool_size; + int i_thrd_pool_queue; + + tpool_t thread_pool; + + void tpool_init( tpool_t *tpoolp, int num_worker_threads, int max_queue_size); + int tpool_add_work( tpool_t tpool, void(*routine)(void*), void* p_void ); + static void* tpool_thread( void *p_void); + static void run_func( void *p_void ); public: - static void init(); - static void destroy(); + pool(); - static void run(void* p_void); - static bool allow_user_login(); + // inline (speed)! + void run( void *p_void ) + { + tpool_add_work( thread_pool, run_func, p_void ); + } + +#ifdef NCURSES + void print_pool_size(); + static void print_threads(int i_thrd_used); +#endif }; #endif |
