Implemented a more general Thread Worker pattern
[fmail.git] / src / worker.cpp
blob3709c7f72eca1833f8404ccdcd0332690a853bd3
1 /*
2 libfmail: Thread Worker Pattern Implementation
4 Copyright (C) 2008 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 Worker::Worker() : Thread(), Lock(){
24 cJob = NULL;
25 mtx = new Lock();
26 mtx->Acquire();
29 Worker::~Worker(){
32 int Worker::setJob(Job *job){
33 cJob = job;
34 return 0;
36 int Worker::wakeup(){
37 return mtx->Release();
40 int Worker::Run(){
41 onRun = 1;
42 while (onRun){
43 mtx->Acquire();
44 if (cJob){
45 cJob->Run();
47 cJob = NULL;
48 Release();
50 return 0;
53 Boss::Boss(int n){
54 int i;
55 workers = (Worker**)malloc(sizeof(Worker*) * n);
56 for (i = 0; i < n; i++){
57 workers[i] = new Worker();
58 workers[i]->Start();
60 nworkers = n;
63 int Boss::Dispatch(Job *jb){
64 int i = 0;
65 int onRun = 1;
67 while(onRun){
68 if (workers[i]->TryAcquire() == 0){
69 workers[i]->setJob(jb);
70 workers[i]->wakeup();
71 onRun = 0;
73 i++;
74 if (i == nworkers)
75 i = 0;
77 return 1;