remote/RpcExecutor.h (54 lines of code) (raw):

#ifndef JCEF_RPCEXECUTOR_H #define JCEF_RPCEXECUTOR_H #include <mutex> #include "./gen-cpp/ClientHandlers.h" #include "log/Log.h" class MyBinaryProtocol; typedef std::shared_ptr<thrift_codegen::ClientHandlersClient> JavaService; class RpcExecutor { public: RpcExecutor(int port); RpcExecutor(std::string pipeName); void close(); bool isClosed() { return myService == nullptr; } // Thread-safe RPC execution. template<typename T> T exec(std::function<T(JavaService)> rpc, T defVal) { std::unique_lock<std::recursive_mutex> lock(myMutex); if (myService == nullptr) return defVal; ExecHolder eh(*this); try { T returnVal = rpc(myService); return returnVal; } catch (apache::thrift::TException& tx) { onThriftException(tx); } return defVal; } void exec(std::function<void(JavaService)> rpc); bool isProcessing() const { return myIsProcessing; } std::chrono::steady_clock::time_point getProcessingStart() const { return myStartExec; } std::string getProcessingName() const; private: JavaService myService = nullptr; std::shared_ptr<apache::thrift::transport::TTransport> myTransport; std::shared_ptr<MyBinaryProtocol> myProtocol; std::recursive_mutex myMutex; std::chrono::steady_clock::time_point myStartExec; volatile bool myIsProcessing = false; void beforeExec(); void afterExec(); void onThriftException(apache::thrift::TException& tx); class ExecHolder { RpcExecutor & myExecutor; public: ExecHolder(RpcExecutor & executor) : myExecutor(executor) { myExecutor.beforeExec(); } ~ExecHolder() { myExecutor.afterExec(); } }; }; typedef std::unique_lock<std::recursive_mutex> Lock; #endif // JCEF_RPCEXECUTOR_H