Simplified process interface. Private sub class Worker.
[metaproxy-moved-to-github.git] / src / thread_pool_observer.hpp
1 /* $Id: thread_pool_observer.hpp,v 1.2 2005-10-14 10:08:40 adam Exp $
2    Copyright (c) 1998-2005, Index Data.
3
4 This file is part of the yaz-proxy.
5
6 YAZ proxy is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 2, or (at your option) any later
9 version.
10
11 YAZ proxy is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with YAZ proxy; see the file LICENSE.  If not, write to the
18 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19 02111-1307, USA.
20  */
21
22 #ifndef YP2_THREAD_POOL_OBSERVER_HPP
23 #define YP2_THREAD_POOL_OBSERVER_HPP
24
25 #include <boost/thread/thread.hpp>
26 #include <boost/thread/mutex.hpp>
27 #include <boost/thread/condition.hpp>
28
29 #include <unistd.h>
30 #include <ctype.h>
31
32 #include <deque>
33 #include <yaz++/socket-observer.h>
34 #include <yaz/yconfig.h>
35
36 class IThreadPoolMsg {
37 public:
38     virtual IThreadPoolMsg *handle() = 0;
39     virtual void result() = 0;
40     virtual ~IThreadPoolMsg();
41 };
42
43 class ThreadPoolSocketObserver : public yazpp_1::ISocketObserver {
44 private:
45     class Worker {
46     public:
47         Worker(ThreadPoolSocketObserver *s) : m_s(s) {};
48         ThreadPoolSocketObserver *m_s;
49         void operator() (void) {
50             m_s->run(0);
51         }
52     };
53 public:
54     ThreadPoolSocketObserver(yazpp_1::ISocketObservable *obs, int no_threads);
55     virtual ~ThreadPoolSocketObserver();
56     void socketNotify(int event);
57     void put(IThreadPoolMsg *m);
58     IThreadPoolMsg *get();
59     void run(void *p);
60     int m_fd[2];
61 private:
62     yazpp_1::ISocketObservable *m_SocketObservable;
63     int m_no_threads;
64     boost::thread_group m_thrds;
65
66     std::deque<IThreadPoolMsg *> m_input;
67     std::deque<IThreadPoolMsg *> m_output;
68
69     boost::mutex m_mutex_input_data;
70     boost::condition m_cond_input_data;
71     boost::mutex m_mutex_output_data;
72     bool m_stop_flag;
73
74     
75 };
76
77 #endif
78 /*
79  * Local variables:
80  * c-basic-offset: 4
81  * indent-tabs-mode: nil
82  * End:
83  * vim: shiftwidth=4 tabstop=8 expandtab
84  */
85