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 
66 namespace tnt
67 {
68  class Tntnet;
69 
72  {
73  unsigned keepAliveCounter;
74 
75  HttpRequest request;
76  HttpRequest::Parser parser;
77  time_t lastAccessTime;
78 
79  public:
80  explicit Job(Tntnet& app_, const SocketIf* socketIf_ = 0);
81  virtual ~Job();
82 
83  virtual std::iostream& getStream() = 0;
84  virtual int getFd() const = 0;
85  virtual void setRead() = 0;
86  virtual void setWrite() = 0;
87 
88  HttpRequest& getRequest() { return request; }
89  HttpRequest::Parser& getParser() { return parser; }
90 
92  { return keepAliveCounter > 0 ? --keepAliveCounter : 0; }
93  void clear();
94  void touch() { time(&lastAccessTime); }
95  int msecToTimeout(time_t currentTime) const;
96  };
97 
99  class Jobqueue
100  {
101  public:
103 
105 
106  private:
107  std::deque<JobPtr> jobs;
108  cxxtools::Mutex mutex;
109  cxxtools::Condition notEmpty;
110  cxxtools::Condition notFull;
111  unsigned waitThreads;
112  unsigned capacity;
113 
114  public:
115  explicit Jobqueue(unsigned capacity_ = 1000)
116  : waitThreads(0),
117  capacity(capacity_)
118  { }
119 
120  void put(JobPtr& j, bool force = false);
121  JobPtr get();
122 
123  void setCapacity(unsigned c)
124  { capacity = c; }
125  unsigned getCapacity() const
126  { return capacity; }
127  unsigned getWaitThreadCount() const
128  { return waitThreads; }
129  bool empty() const
130  { return jobs.empty(); }
131  };
132 }
133 
134 #endif // TNT_JOB_H
135