Updated ThreadPool code
[fmail.git] / src / threadpool.cpp
bloba1fc857cf63ad9df22fc7202efcf86283f7aa11a
1 /*
2 libfmail: Threaded Load handler with Thread Pool
4 Copyright (C) 2007 Carlos Daniel Ruvalcaba Valenzuela <clsdaniel@gmail.com>
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License along
17 with this program; if not, write to the Free Software Foundation, Inc.,
18 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 #include <libfmail.h>
23 class ThreadLoadHandler : public Thread, public Semaphore{
24 private:
25 int threadStat;
26 Socket *s;
27 ProtocolHandler *ph;
28 public:
29 int onRun;
30 ThreadLoadHandler(ProtocolHandler *pht) : Thread(), Semaphore(){
31 s = NULL;
32 ph = pht;
33 onRun = 1;
34 threadStat = 1;
36 int setSocket(Socket *sock){
37 s = sock;
39 int isReady(){
40 return threadStat;
42 int Run(){
43 while (onRun){
44 printf("Thread Sleeping\n");
45 Wait();
46 if (s){
47 printf("Thread Handling\n");
48 ph->Handle(s);
50 s = NULL;
51 printf("Thread Done\n");
52 Wait();
57 ThreadLoad::ThreadLoad(ProtocolHandler *ph, int tpoolSize){
58 int i;
59 poolSize = tpoolSize;
60 ThreadLoadHandler **tpool;
62 pool = (void**)malloc(sizeof(ThreadLoadHandler*) * poolSize);
63 tpool = (ThreadLoadHandler**)pool;
65 for (i = 0; i < poolSize; i++){
66 tpool[i] = new ThreadLoadHandler(ph);
67 tpool[i]->Start();
71 ThreadLoad::~ThreadLoad(){
72 int unclean, i;
73 ThreadLoadHandler **tpool;
75 tpool = (ThreadLoadHandler**)pool;
77 unclean = 1;
78 while(unclean){
79 unclean = 0;
80 for(i = 0; i < poolSize; i++){
81 if (tpool[i]->onRun){
82 if (tpool[i]->isReady()){
83 tpool[i]->onRun = 0;
84 tpool[i]->Post();
85 }else{
86 unclean = 1;
92 for(i = 0; i < poolSize; i++){
93 delete tpool[i];
95 free(pool);
96 pool = NULL;
99 int ThreadLoad::Dispatch(Socket *sock, ProtocolHandler *ph){
100 int i, dispatched;
101 ThreadLoadHandler **tpool;
103 tpool = (ThreadLoadHandler**)pool;
105 dispatched = 0;
106 i = 0;
108 printf("Dispatching from Thread Pool\n");
109 while (dispatched == 0){
110 if (tpool[i]->getValue() == 0){
111 printf("\t* Using Thread %i\n", i);
112 tpool[i]->setSocket(sock);
113 tpool[i]->Post();
114 tpool[i]->Post();
115 dispatched = 1;
117 i++;
118 if (i == poolSize)
119 i = 0;