/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ #ifndef THRIFT_TPROCESSOR_H_ #define THRIFT_TPROCESSOR_H_ 1 #include #include #include "thrift/lib/cpp/EventHandlerBase.h" #include "thrift/lib/cpp/server/TConnectionContext.h" #include "thrift/lib/cpp/protocol/TProtocol.h" #include namespace apache { namespace thrift { /** * A processor is a generic object that acts upon two streams of data, one * an input and the other an output. The definition of this object is loose, * though the typical case is for some sort of server that either generates * responses to an input stream or forwards data from one pipe onto another. * */ class TProcessor : public TProcessorBase { public: virtual ~TProcessor() {} virtual bool process(boost::shared_ptr in, boost::shared_ptr out, TConnectionContext* connectionContext) = 0; bool process(boost::shared_ptr io, TConnectionContext* connectionContext) { return process(io, io, connectionContext); } protected: TProcessor() {} }; class TProcessorFactory { public: virtual ~TProcessorFactory() {} /** * Get the TProcessor to use for a particular connection. * * This method is always invoked in the same thread that the connection was * accepted on. This generally means that this call does not need to be * thread safe, as it will always be invoked from a single thread. */ virtual boost::shared_ptr getProcessor( server::TConnectionContext* ctx) = 0; }; class TSingletonProcessorFactory : public TProcessorFactory { public: explicit TSingletonProcessorFactory( const boost::shared_ptr& processor) : processor_(processor) {} boost::shared_ptr getProcessor(server::TConnectionContext*) { return processor_; } boost::shared_ptr getProcessor() { return processor_; } private: boost::shared_ptr processor_; }; /** * This is a helper class to allow boost::shared_ptr to be used with handler * pointers returned by the generated handler factories. * * The handler factory classes generated by the thrift compiler return raw * pointers, and factory->releaseHandler() must be called when the handler is * no longer needed. * * A ReleaseHandler object can be instantiated and passed as the second * parameter to a shared_ptr, so that factory->releaseHandler() will be called * when the object is no longer needed, instead of deleting the pointer. */ template class ReleaseHandler { public: explicit ReleaseHandler( const boost::shared_ptr& handlerFactory) : handlerFactory_(handlerFactory) {} void operator()(typename HandlerFactory_::Handler* handler) { if (handler) { handlerFactory_->releaseHandler(handler); } } private: boost::shared_ptr handlerFactory_; }; }} // apache::thrift #endif // #ifndef THRIFT_TPROCESSOR_H_