blob: 2db3facff4acd00025fba96cb261b90d444654ea [file] [log] [blame]
David Reissea2cba82009-03-30 21:35:00 +00001/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
Mark Slee9f0c6512007-02-28 23:58:26 +000019
Mark Sleeb3cb6292007-02-01 22:55:00 +000020#ifndef _THRIFT_SERVER_TTHREADEDSERVER_H_
21#define _THRIFT_SERVER_TTHREADEDSERVER_H_ 1
22
23#include <server/TServer.h>
24#include <transport/TServerTransport.h>
Mark Slee1d4ce802007-03-07 05:16:16 +000025#include <concurrency/Monitor.h>
Mark Sleeb3cb6292007-02-01 22:55:00 +000026#include <concurrency/Thread.h>
27
28#include <boost/shared_ptr.hpp>
29
T Jake Lucianib5e62212009-01-31 22:36:20 +000030namespace apache { namespace thrift { namespace server {
Mark Sleeb3cb6292007-02-01 22:55:00 +000031
T Jake Lucianib5e62212009-01-31 22:36:20 +000032using apache::thrift::TProcessor;
33using apache::thrift::transport::TServerTransport;
34using apache::thrift::transport::TTransportFactory;
35using apache::thrift::concurrency::Monitor;
36using apache::thrift::concurrency::ThreadFactory;
Mark Sleeb3cb6292007-02-01 22:55:00 +000037
38class TThreadedServer : public TServer {
39
40 public:
41 class Task;
Mark Sleeb4d3e7b2007-11-28 01:51:43 +000042
Bryan Duxbury7a9fb812011-09-01 18:31:53 +000043 template<typename ProcessorFactory>
44 TThreadedServer(const boost::shared_ptr<ProcessorFactory>& processorFactory,
45 const boost::shared_ptr<TServerTransport>& serverTransport,
46 const boost::shared_ptr<TTransportFactory>& transportFactory,
47 const boost::shared_ptr<TProtocolFactory>& protocolFactory,
48 THRIFT_OVERLOAD_IF(ProcessorFactory, TProcessorFactory));
Mark Sleeb3cb6292007-02-01 22:55:00 +000049
Bryan Duxbury7a9fb812011-09-01 18:31:53 +000050 template<typename ProcessorFactory>
51 TThreadedServer(const boost::shared_ptr<ProcessorFactory>& processorFactory,
52 const boost::shared_ptr<TServerTransport>& serverTransport,
53 const boost::shared_ptr<TTransportFactory>& transportFactory,
54 const boost::shared_ptr<TProtocolFactory>& protocolFactory,
55 const boost::shared_ptr<ThreadFactory>& threadFactory,
56 THRIFT_OVERLOAD_IF(ProcessorFactory, TProtocolFactory));
57
58 template<typename Processor>
59 TThreadedServer(const boost::shared_ptr<Processor>& processor,
60 const boost::shared_ptr<TServerTransport>& serverTransport,
61 const boost::shared_ptr<TTransportFactory>& transportFactory,
62 const boost::shared_ptr<TProtocolFactory>& protocolFactory,
63 THRIFT_OVERLOAD_IF(Processor, TProcessor));
64
65 template<typename Processor>
66 TThreadedServer(const boost::shared_ptr<Processor>& processor,
67 const boost::shared_ptr<TServerTransport>& serverTransport,
68 const boost::shared_ptr<TTransportFactory>& transportFactory,
69 const boost::shared_ptr<TProtocolFactory>& protocolFactory,
70 const boost::shared_ptr<ThreadFactory>& threadFactory,
71 THRIFT_OVERLOAD_IF(Processor, TProcessor));
David Reiss45d56962009-03-14 23:35:16 +000072
Mark Sleeb3cb6292007-02-01 22:55:00 +000073 virtual ~TThreadedServer();
74
75 virtual void serve();
76
Mark Slee1d4ce802007-03-07 05:16:16 +000077 void stop() {
78 stop_ = true;
79 serverTransport_->interrupt();
80 }
81
Mark Sleeb3cb6292007-02-01 22:55:00 +000082 protected:
Bryan Duxbury7a9fb812011-09-01 18:31:53 +000083 void init();
84
Mark Slee5ea15f92007-03-05 22:55:59 +000085 boost::shared_ptr<ThreadFactory> threadFactory_;
Mark Slee1d4ce802007-03-07 05:16:16 +000086 volatile bool stop_;
87
88 Monitor tasksMonitor_;
89 std::set<Task*> tasks_;
Mark Sleeb3cb6292007-02-01 22:55:00 +000090
91};
92
Bryan Duxbury7a9fb812011-09-01 18:31:53 +000093template<typename ProcessorFactory>
94TThreadedServer::TThreadedServer(
95 const boost::shared_ptr<ProcessorFactory>& processorFactory,
96 const boost::shared_ptr<TServerTransport>& serverTransport,
97 const boost::shared_ptr<TTransportFactory>& transportFactory,
98 const boost::shared_ptr<TProtocolFactory>& protocolFactory,
99 THRIFT_OVERLOAD_IF_DEFN(ProcessorFactory, TProcessorFactory)) :
100 TServer(processorFactory, serverTransport, transportFactory,
101 protocolFactory) {
102 init();
103}
104
105template<typename ProcessorFactory>
106TThreadedServer::TThreadedServer(
107 const boost::shared_ptr<ProcessorFactory>& processorFactory,
108 const boost::shared_ptr<TServerTransport>& serverTransport,
109 const boost::shared_ptr<TTransportFactory>& transportFactory,
110 const boost::shared_ptr<TProtocolFactory>& protocolFactory,
111 const boost::shared_ptr<ThreadFactory>& threadFactory,
112 THRIFT_OVERLOAD_IF_DEFN(ProcessorFactory, TProtocolFactory)) :
113 TServer(processorFactory, serverTransport, transportFactory,
114 protocolFactory),
115 threadFactory_(threadFactory) {
116 init();
117}
118
119template<typename Processor>
120TThreadedServer::TThreadedServer(
121 const boost::shared_ptr<Processor>& processor,
122 const boost::shared_ptr<TServerTransport>& serverTransport,
123 const boost::shared_ptr<TTransportFactory>& transportFactory,
124 const boost::shared_ptr<TProtocolFactory>& protocolFactory,
125 THRIFT_OVERLOAD_IF_DEFN(Processor, TProcessor)) :
126 TServer(processor, serverTransport, transportFactory, protocolFactory) {
127 init();
128}
129
130template<typename Processor>
131TThreadedServer::TThreadedServer(
132 const boost::shared_ptr<Processor>& processor,
133 const boost::shared_ptr<TServerTransport>& serverTransport,
134 const boost::shared_ptr<TTransportFactory>& transportFactory,
135 const boost::shared_ptr<TProtocolFactory>& protocolFactory,
136 const boost::shared_ptr<ThreadFactory>& threadFactory,
137 THRIFT_OVERLOAD_IF_DEFN(Processor, TProcessor)) :
138 TServer(processor, serverTransport, transportFactory, protocolFactory),
139 threadFactory_(threadFactory) {
140 init();
141}
142
T Jake Lucianib5e62212009-01-31 22:36:20 +0000143}}} // apache::thrift::server
Mark Sleeb3cb6292007-02-01 22:55:00 +0000144
145#endif // #ifndef _THRIFT_SERVER_TTHREADEDSERVER_H_