job.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2003-2005 Tommi Maekitalo
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * As a special exception, you may use this file as part of a free
10  * software library without restriction. Specifically, if other files
11  * instantiate templates or use macros or inline functions from this
12  * file, or you compile this file and link it with other files to
13  * produce an executable, this file does not by itself cause the
14  * resulting executable to be covered by the GNU General Public
15  * License. This exception does not however invalidate any other
16  * reasons why the executable file might be covered by the GNU Library
17  * General Public License.
18  *
19  * This library is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22  * Lesser General Public License for more details.
23  *
24  * You should have received a copy of the GNU Lesser General Public
25  * License along with this library; if not, write to the Free Software
26  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27  */
28 
29 
30 #ifndef TNT_JOB_H
31 #define TNT_JOB_H
32 
33 #include <deque>
34 #include <tnt/httprequest.h>
35 #include <tnt/httpparser.h>
36 #include <cxxtools/mutex.h>
37 #include <cxxtools/condition.h>
38 #include <cxxtools/refcounted.h>
39 #include <cxxtools/smartptr.h>
40 
42 
43 namespace tnt
44 {
45  class Tntnet;
46 
47  class Job : public cxxtools::RefCounted
48  {
49  unsigned _keepAliveCounter;
50 
51  HttpRequest _request;
52  HttpRequest::Parser _parser;
53  time_t _lastAccessTime;
54 
55  public:
56  explicit Job(Tntnet& app, const SocketIf* socketIf = 0);
57  virtual ~Job();
58 
59  virtual std::iostream& getStream() = 0;
60  virtual int getFd() const = 0;
61  virtual void setRead() = 0;
62  virtual void setWrite() = 0;
63 
64  HttpRequest& getRequest() { return _request; }
65  HttpRequest::Parser& getParser() { return _parser; }
66 
67  unsigned decrementKeepAliveCounter()
68  { return _keepAliveCounter > 0 ? --_keepAliveCounter : 0; }
69  void clear();
70  void touch() { time(&_lastAccessTime); }
71  cxxtools::Milliseconds msecToTimeout(time_t currentTime) const;
72  };
73 
74  class Jobqueue
75  {
76  public:
77  typedef cxxtools::SmartPtr<Job> JobPtr;
78 
79  cxxtools::Condition noWaitThreads;
80 
81  private:
82  std::deque<JobPtr> _jobs;
83  cxxtools::Mutex _mutex;
84  cxxtools::Condition _notEmpty;
85  cxxtools::Condition _notFull;
86  unsigned _waitThreads;
87  unsigned _capacity;
88 
89  public:
90  explicit Jobqueue(unsigned capacity = 1000)
91  : _waitThreads(0),
92  _capacity(capacity)
93  { }
94 
95  void put(JobPtr& j, bool force = false);
96  JobPtr get();
97 
98  void setCapacity(unsigned c)
99  { _capacity = c; }
100  unsigned getCapacity() const
101  { return _capacity; }
102  unsigned getWaitThreadCount() const
103  { return _waitThreads; }
104  bool empty() const
105  { return _jobs.empty(); }
106  };
107 
108 }
109 
110 #endif // TNT_JOB_H
111