mirror of
https://gitee.com/TarsCloud/TarsCpp.git
synced 2024-12-22 22:16:38 +08:00
compiler examples, add auto test scripts
This commit is contained in:
parent
17df5bba83
commit
2401420e78
78
cmake/modules/FindMySQL.cmake
Normal file
78
cmake/modules/FindMySQL.cmake
Normal file
@ -0,0 +1,78 @@
|
||||
# - Try to find MySQL.
|
||||
# Once done this will define:
|
||||
# MYSQL_FOUND - If false, do not try to use MySQL.
|
||||
# MYSQL_INCLUDE_DIRS - Where to find mysql.h, etc.
|
||||
# MYSQL_LIBRARIES - The libraries to link against.
|
||||
# MYSQL_VERSION_STRING - Version in a string of MySQL.
|
||||
#
|
||||
# Created by RenatoUtsch based on eAthena implementation.
|
||||
#
|
||||
#
|
||||
|
||||
find_path(MYSQL_INCLUDE_DIR
|
||||
NAMES mysql.h
|
||||
PATHS /usr/local/opt/mysql-client/include/mysql /usr/include/mysql /usr/local/include/mysql /usr/local/mysql/include/
|
||||
$ENV{PROGRAMFILES}/MySQL/*/include $ENV{SYSTEMDRIVE}/MySQL/*/include C:/mysql/include)
|
||||
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".lib")
|
||||
|
||||
find_library(MYSQL_LIBRARY
|
||||
NAMES mysqlclient mysqlclient_r
|
||||
PATHS /usr/local/opt/mysql-client/lib /lib/mysql /lib64/mysql /usr/lib/mysql /usr/lib64/mysql /usr/local/lib/mysql /usr/local/lib64/mysql /usr/local/mysql/lib/
|
||||
$ENV{PROGRAMFILES}/MySQL/*/lib $ENV{SYSTEMDRIVE}/MySQL/*/lib C:/mysql/lib/vs14)
|
||||
|
||||
find_path(SSL_INCLUDE_DIR
|
||||
NAMES openssl/ssl.h
|
||||
PATHS
|
||||
/usr/local/Cellar/openssl@1.1/1.1.1d /usr/include /usr/local/include /opt/local/include /sw/include
|
||||
PATH_SUFFIXES
|
||||
include)
|
||||
|
||||
find_library(_SSL_LIB
|
||||
NAMES ssl
|
||||
PATHS
|
||||
/usr/local/Cellar/openssl@1.1/1.1.1d /usr/lib /usr/local/lib /opt/local/lib /sw/lib
|
||||
PATH_SUFFIXES
|
||||
lib)
|
||||
|
||||
find_library(_CRYPTO_LIB
|
||||
NAMES crypto
|
||||
PATHS
|
||||
/usr/local/Cellar/openssl@1.1/1.1.1d /usr/lib /usr/local/lib /opt/local/lib /sw/lib
|
||||
PATH_SUFFIXES
|
||||
lib)
|
||||
|
||||
|
||||
if (MYSQL_INCLUDE_DIR AND EXISTS "${MYSQL_INCLUDE_DIR}/mysql_version.h")
|
||||
file(STRINGS "${MYSQL_INCLUDE_DIR}/mysql_version.h"
|
||||
MYSQL_VERSION_H REGEX "^#define[ \t]+MYSQL_SERVER_VERSION[ \t]+\"[^\"]+\".*$")
|
||||
string(REGEX REPLACE
|
||||
"^.*MYSQL_SERVER_VERSION[ \t]+\"([^\"]+)\".*$" "\\1" MYSQL_VERSION_STRING
|
||||
"${MYSQL_VERSION_H}")
|
||||
endif ()
|
||||
|
||||
# handle the QUIETLY and REQUIRED arguments and set MYSQL_FOUND to TRUE if
|
||||
# all listed variables are TRUE
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(MYSQL DEFAULT_MSG MYSQL_LIBRARY MYSQL_INCLUDE_DIR MYSQL_VERSION_STRING)
|
||||
|
||||
if(MYSQL_FOUND)
|
||||
set(MYSQL_INCLUDE_DIRS ${MYSQL_INCLUDE_DIR})
|
||||
set(MYSQL_LIBRARIES ${MYSQL_LIBRARY})
|
||||
endif()
|
||||
|
||||
mark_as_advanced(MYSQL_INCLUDE_DIR MYSQL_LIBRARY)
|
||||
|
||||
find_package_handle_standard_args(ssl DEFAULT_MSG _SSL_LIB _CRYPTO_LIB SSL_INCLUDE_DIR)
|
||||
mark_as_advanced(SSL_INCLUDE_DIR _SSL_LIB _CRYPTO_LIB)
|
||||
|
||||
if(SSL_FOUND)
|
||||
set(MYSQL_INCLUDE_DIRS ${MYSQL_INCLUDE_DIR} ${SSL_INCLUDE_DIR})
|
||||
set(MYSQL_LIBRARIES ${MYSQL_LIBRARY} ${_SSL_LIB} ${_CRYPTO_LIB})
|
||||
endif()
|
||||
|
||||
message("------------MySQL------------")
|
||||
message("MYSQL_VERSION_STRING=${MYSQL_VERSION_STRING}")
|
||||
message("MYSQL_INCLUDE_DIRS=${MYSQL_INCLUDE_DIRS}")
|
||||
message("MYSQL_LIBRARIES=${MYSQL_LIBRARIES}")
|
||||
message("------------MySQL------------")
|
11
examples/CMakeLists.txt
Normal file
11
examples/CMakeLists.txt
Normal file
@ -0,0 +1,11 @@
|
||||
|
||||
add_subdirectory(CoroutineDemo)
|
||||
add_subdirectory(HttpDemo)
|
||||
add_subdirectory(PushDemo)
|
||||
add_subdirectory(QuickStartDemo)
|
||||
add_subdirectory(StressDemo)
|
||||
|
||||
add_custom_target(run-quick-start
|
||||
DEPENDS QuickStartDemo QuickStartDemoClient
|
||||
COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/scripts/run-quick-start.sh
|
||||
COMMENT "call")
|
648
examples/CoroutineDemo/AServer/AServant.h
Normal file
648
examples/CoroutineDemo/AServer/AServant.h
Normal file
@ -0,0 +1,648 @@
|
||||
// **********************************************************************
|
||||
// This file was generated by a TARS parser!
|
||||
// TARS version 1.4.0.
|
||||
// **********************************************************************
|
||||
|
||||
#ifndef __ASERVANT_H_
|
||||
#define __ASERVANT_H_
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "tup/Tars.h"
|
||||
#include "tup/TarsJson.h"
|
||||
using namespace std;
|
||||
#include "servant/ServantProxy.h"
|
||||
#include "servant/Servant.h"
|
||||
|
||||
|
||||
namespace Test
|
||||
{
|
||||
|
||||
/* callback of async proxy for client */
|
||||
class AServantPrxCallback: public tars::ServantProxyCallback
|
||||
{
|
||||
public:
|
||||
virtual ~AServantPrxCallback(){}
|
||||
virtual void callback_test(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_test() override incorrect."); }
|
||||
virtual void callback_test_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_test_exception() override incorrect."); }
|
||||
|
||||
virtual void callback_testInt(tars::Int32 ret, tars::Int32 iOut)
|
||||
{ throw std::runtime_error("callback_testInt() override incorrect."); }
|
||||
virtual void callback_testInt_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_testInt_exception() override incorrect."); }
|
||||
|
||||
virtual void callback_testStr(tars::Int32 ret, const std::string& sOut)
|
||||
{ throw std::runtime_error("callback_testStr() override incorrect."); }
|
||||
virtual void callback_testStr_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_testStr_exception() override incorrect."); }
|
||||
|
||||
public:
|
||||
virtual const map<std::string, std::string> & getResponseContext() const
|
||||
{
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
if(!pCbtd->getContextValid())
|
||||
{
|
||||
throw TC_Exception("cann't get response context");
|
||||
}
|
||||
return pCbtd->getResponseContext();
|
||||
}
|
||||
|
||||
public:
|
||||
virtual int onDispatch(tars::ReqMessagePtr msg)
|
||||
{
|
||||
static ::std::string __AServant_all[]=
|
||||
{
|
||||
"test",
|
||||
"testInt",
|
||||
"testStr"
|
||||
};
|
||||
pair<string*, string*> r = equal_range(__AServant_all, __AServant_all+3, string(msg->request.sFuncName));
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __AServant_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_test_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_test(_ret);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testInt_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
tars::Int32 iOut;
|
||||
_is.read(iOut, 2, true);
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_testInt(_ret, iOut);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testStr_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_testStr(_ret, sOut);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
|
||||
};
|
||||
typedef tars::TC_AutoPtr<AServantPrxCallback> AServantPrxCallbackPtr;
|
||||
|
||||
/* callback of coroutine async proxy for client */
|
||||
class AServantCoroPrxCallback: public AServantPrxCallback
|
||||
{
|
||||
public:
|
||||
virtual ~AServantCoroPrxCallback(){}
|
||||
public:
|
||||
virtual const map<std::string, std::string> & getResponseContext() const { return _mRspContext; }
|
||||
|
||||
virtual void setResponseContext(const map<std::string, std::string> &mContext) { _mRspContext = mContext; }
|
||||
|
||||
public:
|
||||
int onDispatch(tars::ReqMessagePtr msg)
|
||||
{
|
||||
static ::std::string __AServant_all[]=
|
||||
{
|
||||
"test",
|
||||
"testInt",
|
||||
"testStr"
|
||||
};
|
||||
|
||||
pair<string*, string*> r = equal_range(__AServant_all, __AServant_all+3, string(msg->request.sFuncName));
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __AServant_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_test_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_test(_ret);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_test_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_test_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testInt_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
tars::Int32 iOut;
|
||||
_is.read(iOut, 2, true);
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_testInt(_ret, iOut);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_testInt_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_testInt_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testStr_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_testStr(_ret, sOut);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_testStr_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_testStr_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
|
||||
protected:
|
||||
map<std::string, std::string> _mRspContext;
|
||||
};
|
||||
typedef tars::TC_AutoPtr<AServantCoroPrxCallback> AServantCoroPrxCallbackPtr;
|
||||
|
||||
/* proxy for client */
|
||||
class AServantProxy : public tars::ServantProxy
|
||||
{
|
||||
public:
|
||||
typedef map<string, string> TARS_CONTEXT;
|
||||
tars::Int32 test(const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"test", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_test(AServantPrxCallbackPtr callback,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"test", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_test(AServantCoroPrxCallbackPtr callback,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"test", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
tars::Int32 testInt(tars::Int32 iIn,tars::Int32 &iOut,const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(iIn, 1);
|
||||
_os.write(iOut, 2);
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"testInt", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
_is.read(iOut, 2, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_testInt(AServantPrxCallbackPtr callback,tars::Int32 iIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(iIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testInt", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_testInt(AServantCoroPrxCallbackPtr callback,tars::Int32 iIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(iIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testInt", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
tars::Int32 testStr(const std::string & sIn,std::string &sOut,const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
_os.write(sOut, 2);
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"testStr", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
_is.read(sOut, 2, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_testStr(AServantPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testStr", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_testStr(AServantCoroPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testStr", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
AServantProxy* tars_hash(int64_t key)
|
||||
{
|
||||
return (AServantProxy*)ServantProxy::tars_hash(key);
|
||||
}
|
||||
|
||||
AServantProxy* tars_consistent_hash(int64_t key)
|
||||
{
|
||||
return (AServantProxy*)ServantProxy::tars_consistent_hash(key);
|
||||
}
|
||||
|
||||
AServantProxy* tars_set_timeout(int msecond)
|
||||
{
|
||||
return (AServantProxy*)ServantProxy::tars_set_timeout(msecond);
|
||||
}
|
||||
|
||||
static const char* tars_prxname() { return "AServantProxy"; }
|
||||
};
|
||||
typedef tars::TC_AutoPtr<AServantProxy> AServantPrx;
|
||||
|
||||
/* servant for server */
|
||||
class AServant : public tars::Servant
|
||||
{
|
||||
public:
|
||||
virtual ~AServant(){}
|
||||
virtual tars::Int32 test(tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_test(tars::TarsCurrentPtr current, tars::Int32 _ret)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
virtual tars::Int32 testInt(tars::Int32 iIn,tars::Int32 &iOut,tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_testInt(tars::TarsCurrentPtr current, tars::Int32 _ret, tars::Int32 iOut)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("iOut", iOut);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
_os.write(iOut, 2);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
virtual tars::Int32 testStr(const std::string & sIn,std::string &sOut,tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_testStr(tars::TarsCurrentPtr current, tars::Int32 _ret, const std::string &sOut)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
_os.write(sOut, 2);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
int onDispatch(tars::TarsCurrentPtr _current, vector<char> &_sResponseBuffer)
|
||||
{
|
||||
static ::std::string __Test__AServant_all[]=
|
||||
{
|
||||
"test",
|
||||
"testInt",
|
||||
"testStr"
|
||||
};
|
||||
|
||||
pair<string*, string*> r = equal_range(__Test__AServant_all, __Test__AServant_all+3, _current->getFuncName());
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __Test__AServant_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
tars::Int32 _ret = test(_current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
tars::Int32 iIn;
|
||||
tars::Int32 iOut;
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
tarsAttr.get("iIn", iIn);
|
||||
tarsAttr.getByDefault("iOut", iOut, iOut);
|
||||
}
|
||||
else
|
||||
{
|
||||
_is.read(iIn, 1, true);
|
||||
_is.read(iOut, 2, false);
|
||||
}
|
||||
tars::Int32 _ret = testInt(iIn,iOut, _current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("iOut", iOut);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.write(iOut, 2);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
std::string sIn;
|
||||
std::string sOut;
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
tarsAttr.get("sIn", sIn);
|
||||
tarsAttr.getByDefault("sOut", sOut, sOut);
|
||||
}
|
||||
else
|
||||
{
|
||||
_is.read(sIn, 1, true);
|
||||
_is.read(sOut, 2, false);
|
||||
}
|
||||
tars::Int32 _ret = testStr(sIn,sOut, _current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.write(sOut, 2);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
648
examples/CoroutineDemo/BServer/AServant.h
Normal file
648
examples/CoroutineDemo/BServer/AServant.h
Normal file
@ -0,0 +1,648 @@
|
||||
// **********************************************************************
|
||||
// This file was generated by a TARS parser!
|
||||
// TARS version 1.4.0.
|
||||
// **********************************************************************
|
||||
|
||||
#ifndef __ASERVANT_H_
|
||||
#define __ASERVANT_H_
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "tup/Tars.h"
|
||||
#include "tup/TarsJson.h"
|
||||
using namespace std;
|
||||
#include "servant/ServantProxy.h"
|
||||
#include "servant/Servant.h"
|
||||
|
||||
|
||||
namespace Test
|
||||
{
|
||||
|
||||
/* callback of async proxy for client */
|
||||
class AServantPrxCallback: public tars::ServantProxyCallback
|
||||
{
|
||||
public:
|
||||
virtual ~AServantPrxCallback(){}
|
||||
virtual void callback_test(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_test() override incorrect."); }
|
||||
virtual void callback_test_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_test_exception() override incorrect."); }
|
||||
|
||||
virtual void callback_testInt(tars::Int32 ret, tars::Int32 iOut)
|
||||
{ throw std::runtime_error("callback_testInt() override incorrect."); }
|
||||
virtual void callback_testInt_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_testInt_exception() override incorrect."); }
|
||||
|
||||
virtual void callback_testStr(tars::Int32 ret, const std::string& sOut)
|
||||
{ throw std::runtime_error("callback_testStr() override incorrect."); }
|
||||
virtual void callback_testStr_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_testStr_exception() override incorrect."); }
|
||||
|
||||
public:
|
||||
virtual const map<std::string, std::string> & getResponseContext() const
|
||||
{
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
if(!pCbtd->getContextValid())
|
||||
{
|
||||
throw TC_Exception("cann't get response context");
|
||||
}
|
||||
return pCbtd->getResponseContext();
|
||||
}
|
||||
|
||||
public:
|
||||
virtual int onDispatch(tars::ReqMessagePtr msg)
|
||||
{
|
||||
static ::std::string __AServant_all[]=
|
||||
{
|
||||
"test",
|
||||
"testInt",
|
||||
"testStr"
|
||||
};
|
||||
pair<string*, string*> r = equal_range(__AServant_all, __AServant_all+3, string(msg->request.sFuncName));
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __AServant_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_test_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_test(_ret);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testInt_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
tars::Int32 iOut;
|
||||
_is.read(iOut, 2, true);
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_testInt(_ret, iOut);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testStr_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_testStr(_ret, sOut);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
|
||||
};
|
||||
typedef tars::TC_AutoPtr<AServantPrxCallback> AServantPrxCallbackPtr;
|
||||
|
||||
/* callback of coroutine async proxy for client */
|
||||
class AServantCoroPrxCallback: public AServantPrxCallback
|
||||
{
|
||||
public:
|
||||
virtual ~AServantCoroPrxCallback(){}
|
||||
public:
|
||||
virtual const map<std::string, std::string> & getResponseContext() const { return _mRspContext; }
|
||||
|
||||
virtual void setResponseContext(const map<std::string, std::string> &mContext) { _mRspContext = mContext; }
|
||||
|
||||
public:
|
||||
int onDispatch(tars::ReqMessagePtr msg)
|
||||
{
|
||||
static ::std::string __AServant_all[]=
|
||||
{
|
||||
"test",
|
||||
"testInt",
|
||||
"testStr"
|
||||
};
|
||||
|
||||
pair<string*, string*> r = equal_range(__AServant_all, __AServant_all+3, string(msg->request.sFuncName));
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __AServant_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_test_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_test(_ret);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_test_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_test_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testInt_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
tars::Int32 iOut;
|
||||
_is.read(iOut, 2, true);
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_testInt(_ret, iOut);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_testInt_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_testInt_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testStr_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_testStr(_ret, sOut);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_testStr_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_testStr_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
|
||||
protected:
|
||||
map<std::string, std::string> _mRspContext;
|
||||
};
|
||||
typedef tars::TC_AutoPtr<AServantCoroPrxCallback> AServantCoroPrxCallbackPtr;
|
||||
|
||||
/* proxy for client */
|
||||
class AServantProxy : public tars::ServantProxy
|
||||
{
|
||||
public:
|
||||
typedef map<string, string> TARS_CONTEXT;
|
||||
tars::Int32 test(const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"test", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_test(AServantPrxCallbackPtr callback,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"test", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_test(AServantCoroPrxCallbackPtr callback,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"test", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
tars::Int32 testInt(tars::Int32 iIn,tars::Int32 &iOut,const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(iIn, 1);
|
||||
_os.write(iOut, 2);
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"testInt", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
_is.read(iOut, 2, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_testInt(AServantPrxCallbackPtr callback,tars::Int32 iIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(iIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testInt", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_testInt(AServantCoroPrxCallbackPtr callback,tars::Int32 iIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(iIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testInt", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
tars::Int32 testStr(const std::string & sIn,std::string &sOut,const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
_os.write(sOut, 2);
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"testStr", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
_is.read(sOut, 2, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_testStr(AServantPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testStr", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_testStr(AServantCoroPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testStr", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
AServantProxy* tars_hash(int64_t key)
|
||||
{
|
||||
return (AServantProxy*)ServantProxy::tars_hash(key);
|
||||
}
|
||||
|
||||
AServantProxy* tars_consistent_hash(int64_t key)
|
||||
{
|
||||
return (AServantProxy*)ServantProxy::tars_consistent_hash(key);
|
||||
}
|
||||
|
||||
AServantProxy* tars_set_timeout(int msecond)
|
||||
{
|
||||
return (AServantProxy*)ServantProxy::tars_set_timeout(msecond);
|
||||
}
|
||||
|
||||
static const char* tars_prxname() { return "AServantProxy"; }
|
||||
};
|
||||
typedef tars::TC_AutoPtr<AServantProxy> AServantPrx;
|
||||
|
||||
/* servant for server */
|
||||
class AServant : public tars::Servant
|
||||
{
|
||||
public:
|
||||
virtual ~AServant(){}
|
||||
virtual tars::Int32 test(tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_test(tars::TarsCurrentPtr current, tars::Int32 _ret)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
virtual tars::Int32 testInt(tars::Int32 iIn,tars::Int32 &iOut,tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_testInt(tars::TarsCurrentPtr current, tars::Int32 _ret, tars::Int32 iOut)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("iOut", iOut);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
_os.write(iOut, 2);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
virtual tars::Int32 testStr(const std::string & sIn,std::string &sOut,tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_testStr(tars::TarsCurrentPtr current, tars::Int32 _ret, const std::string &sOut)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
_os.write(sOut, 2);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
int onDispatch(tars::TarsCurrentPtr _current, vector<char> &_sResponseBuffer)
|
||||
{
|
||||
static ::std::string __Test__AServant_all[]=
|
||||
{
|
||||
"test",
|
||||
"testInt",
|
||||
"testStr"
|
||||
};
|
||||
|
||||
pair<string*, string*> r = equal_range(__Test__AServant_all, __Test__AServant_all+3, _current->getFuncName());
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __Test__AServant_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
tars::Int32 _ret = test(_current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
tars::Int32 iIn;
|
||||
tars::Int32 iOut;
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
tarsAttr.get("iIn", iIn);
|
||||
tarsAttr.getByDefault("iOut", iOut, iOut);
|
||||
}
|
||||
else
|
||||
{
|
||||
_is.read(iIn, 1, true);
|
||||
_is.read(iOut, 2, false);
|
||||
}
|
||||
tars::Int32 _ret = testInt(iIn,iOut, _current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("iOut", iOut);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.write(iOut, 2);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
std::string sIn;
|
||||
std::string sOut;
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
tarsAttr.get("sIn", sIn);
|
||||
tarsAttr.getByDefault("sOut", sOut, sOut);
|
||||
}
|
||||
else
|
||||
{
|
||||
_is.read(sIn, 1, true);
|
||||
_is.read(sOut, 2, false);
|
||||
}
|
||||
tars::Int32 _ret = testStr(sIn,sOut, _current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.write(sOut, 2);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
648
examples/CoroutineDemo/BServer/BServant.h
Normal file
648
examples/CoroutineDemo/BServer/BServant.h
Normal file
@ -0,0 +1,648 @@
|
||||
// **********************************************************************
|
||||
// This file was generated by a TARS parser!
|
||||
// TARS version 1.4.0.
|
||||
// **********************************************************************
|
||||
|
||||
#ifndef __BSERVANT_H_
|
||||
#define __BSERVANT_H_
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "tup/Tars.h"
|
||||
#include "tup/TarsJson.h"
|
||||
using namespace std;
|
||||
#include "servant/ServantProxy.h"
|
||||
#include "servant/Servant.h"
|
||||
|
||||
|
||||
namespace Test
|
||||
{
|
||||
|
||||
/* callback of async proxy for client */
|
||||
class BServantPrxCallback: public tars::ServantProxyCallback
|
||||
{
|
||||
public:
|
||||
virtual ~BServantPrxCallback(){}
|
||||
virtual void callback_test(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_test() override incorrect."); }
|
||||
virtual void callback_test_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_test_exception() override incorrect."); }
|
||||
|
||||
virtual void callback_testCoroParallel(tars::Int32 ret, const std::string& sOut)
|
||||
{ throw std::runtime_error("callback_testCoroParallel() override incorrect."); }
|
||||
virtual void callback_testCoroParallel_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_testCoroParallel_exception() override incorrect."); }
|
||||
|
||||
virtual void callback_testCoroSerial(tars::Int32 ret, const std::string& sOut)
|
||||
{ throw std::runtime_error("callback_testCoroSerial() override incorrect."); }
|
||||
virtual void callback_testCoroSerial_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_testCoroSerial_exception() override incorrect."); }
|
||||
|
||||
public:
|
||||
virtual const map<std::string, std::string> & getResponseContext() const
|
||||
{
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
if(!pCbtd->getContextValid())
|
||||
{
|
||||
throw TC_Exception("cann't get response context");
|
||||
}
|
||||
return pCbtd->getResponseContext();
|
||||
}
|
||||
|
||||
public:
|
||||
virtual int onDispatch(tars::ReqMessagePtr msg)
|
||||
{
|
||||
static ::std::string __BServant_all[]=
|
||||
{
|
||||
"test",
|
||||
"testCoroParallel",
|
||||
"testCoroSerial"
|
||||
};
|
||||
pair<string*, string*> r = equal_range(__BServant_all, __BServant_all+3, string(msg->request.sFuncName));
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __BServant_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_test_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_test(_ret);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testCoroParallel_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_testCoroParallel(_ret, sOut);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testCoroSerial_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_testCoroSerial(_ret, sOut);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
|
||||
};
|
||||
typedef tars::TC_AutoPtr<BServantPrxCallback> BServantPrxCallbackPtr;
|
||||
|
||||
/* callback of coroutine async proxy for client */
|
||||
class BServantCoroPrxCallback: public BServantPrxCallback
|
||||
{
|
||||
public:
|
||||
virtual ~BServantCoroPrxCallback(){}
|
||||
public:
|
||||
virtual const map<std::string, std::string> & getResponseContext() const { return _mRspContext; }
|
||||
|
||||
virtual void setResponseContext(const map<std::string, std::string> &mContext) { _mRspContext = mContext; }
|
||||
|
||||
public:
|
||||
int onDispatch(tars::ReqMessagePtr msg)
|
||||
{
|
||||
static ::std::string __BServant_all[]=
|
||||
{
|
||||
"test",
|
||||
"testCoroParallel",
|
||||
"testCoroSerial"
|
||||
};
|
||||
|
||||
pair<string*, string*> r = equal_range(__BServant_all, __BServant_all+3, string(msg->request.sFuncName));
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __BServant_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_test_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_test(_ret);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_test_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_test_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testCoroParallel_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_testCoroParallel(_ret, sOut);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_testCoroParallel_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_testCoroParallel_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testCoroSerial_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_testCoroSerial(_ret, sOut);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_testCoroSerial_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_testCoroSerial_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
|
||||
protected:
|
||||
map<std::string, std::string> _mRspContext;
|
||||
};
|
||||
typedef tars::TC_AutoPtr<BServantCoroPrxCallback> BServantCoroPrxCallbackPtr;
|
||||
|
||||
/* proxy for client */
|
||||
class BServantProxy : public tars::ServantProxy
|
||||
{
|
||||
public:
|
||||
typedef map<string, string> TARS_CONTEXT;
|
||||
tars::Int32 test(const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"test", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_test(BServantPrxCallbackPtr callback,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"test", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_test(BServantCoroPrxCallbackPtr callback,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"test", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
tars::Int32 testCoroParallel(const std::string & sIn,std::string &sOut,const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
_os.write(sOut, 2);
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"testCoroParallel", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
_is.read(sOut, 2, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_testCoroParallel(BServantPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testCoroParallel", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_testCoroParallel(BServantCoroPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testCoroParallel", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
tars::Int32 testCoroSerial(const std::string & sIn,std::string &sOut,const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
_os.write(sOut, 2);
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"testCoroSerial", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
_is.read(sOut, 2, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_testCoroSerial(BServantPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testCoroSerial", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_testCoroSerial(BServantCoroPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testCoroSerial", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
BServantProxy* tars_hash(int64_t key)
|
||||
{
|
||||
return (BServantProxy*)ServantProxy::tars_hash(key);
|
||||
}
|
||||
|
||||
BServantProxy* tars_consistent_hash(int64_t key)
|
||||
{
|
||||
return (BServantProxy*)ServantProxy::tars_consistent_hash(key);
|
||||
}
|
||||
|
||||
BServantProxy* tars_set_timeout(int msecond)
|
||||
{
|
||||
return (BServantProxy*)ServantProxy::tars_set_timeout(msecond);
|
||||
}
|
||||
|
||||
static const char* tars_prxname() { return "BServantProxy"; }
|
||||
};
|
||||
typedef tars::TC_AutoPtr<BServantProxy> BServantPrx;
|
||||
|
||||
/* servant for server */
|
||||
class BServant : public tars::Servant
|
||||
{
|
||||
public:
|
||||
virtual ~BServant(){}
|
||||
virtual tars::Int32 test(tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_test(tars::TarsCurrentPtr current, tars::Int32 _ret)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
virtual tars::Int32 testCoroParallel(const std::string & sIn,std::string &sOut,tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_testCoroParallel(tars::TarsCurrentPtr current, tars::Int32 _ret, const std::string &sOut)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
_os.write(sOut, 2);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
virtual tars::Int32 testCoroSerial(const std::string & sIn,std::string &sOut,tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_testCoroSerial(tars::TarsCurrentPtr current, tars::Int32 _ret, const std::string &sOut)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
_os.write(sOut, 2);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
int onDispatch(tars::TarsCurrentPtr _current, vector<char> &_sResponseBuffer)
|
||||
{
|
||||
static ::std::string __Test__BServant_all[]=
|
||||
{
|
||||
"test",
|
||||
"testCoroParallel",
|
||||
"testCoroSerial"
|
||||
};
|
||||
|
||||
pair<string*, string*> r = equal_range(__Test__BServant_all, __Test__BServant_all+3, _current->getFuncName());
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __Test__BServant_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
tars::Int32 _ret = test(_current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
std::string sIn;
|
||||
std::string sOut;
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
tarsAttr.get("sIn", sIn);
|
||||
tarsAttr.getByDefault("sOut", sOut, sOut);
|
||||
}
|
||||
else
|
||||
{
|
||||
_is.read(sIn, 1, true);
|
||||
_is.read(sOut, 2, false);
|
||||
}
|
||||
tars::Int32 _ret = testCoroParallel(sIn,sOut, _current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.write(sOut, 2);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
std::string sIn;
|
||||
std::string sOut;
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
tarsAttr.get("sIn", sIn);
|
||||
tarsAttr.getByDefault("sOut", sOut, sOut);
|
||||
}
|
||||
else
|
||||
{
|
||||
_is.read(sIn, 1, true);
|
||||
_is.read(sOut, 2, false);
|
||||
}
|
||||
tars::Int32 _ret = testCoroSerial(sIn,sOut, _current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.write(sOut, 2);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
648
examples/CoroutineDemo/client/BServant.h
Normal file
648
examples/CoroutineDemo/client/BServant.h
Normal file
@ -0,0 +1,648 @@
|
||||
// **********************************************************************
|
||||
// This file was generated by a TARS parser!
|
||||
// TARS version 1.4.0.
|
||||
// **********************************************************************
|
||||
|
||||
#ifndef __BSERVANT_H_
|
||||
#define __BSERVANT_H_
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "tup/Tars.h"
|
||||
#include "tup/TarsJson.h"
|
||||
using namespace std;
|
||||
#include "servant/ServantProxy.h"
|
||||
#include "servant/Servant.h"
|
||||
|
||||
|
||||
namespace Test
|
||||
{
|
||||
|
||||
/* callback of async proxy for client */
|
||||
class BServantPrxCallback: public tars::ServantProxyCallback
|
||||
{
|
||||
public:
|
||||
virtual ~BServantPrxCallback(){}
|
||||
virtual void callback_test(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_test() override incorrect."); }
|
||||
virtual void callback_test_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_test_exception() override incorrect."); }
|
||||
|
||||
virtual void callback_testCoroParallel(tars::Int32 ret, const std::string& sOut)
|
||||
{ throw std::runtime_error("callback_testCoroParallel() override incorrect."); }
|
||||
virtual void callback_testCoroParallel_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_testCoroParallel_exception() override incorrect."); }
|
||||
|
||||
virtual void callback_testCoroSerial(tars::Int32 ret, const std::string& sOut)
|
||||
{ throw std::runtime_error("callback_testCoroSerial() override incorrect."); }
|
||||
virtual void callback_testCoroSerial_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_testCoroSerial_exception() override incorrect."); }
|
||||
|
||||
public:
|
||||
virtual const map<std::string, std::string> & getResponseContext() const
|
||||
{
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
if(!pCbtd->getContextValid())
|
||||
{
|
||||
throw TC_Exception("cann't get response context");
|
||||
}
|
||||
return pCbtd->getResponseContext();
|
||||
}
|
||||
|
||||
public:
|
||||
virtual int onDispatch(tars::ReqMessagePtr msg)
|
||||
{
|
||||
static ::std::string __BServant_all[]=
|
||||
{
|
||||
"test",
|
||||
"testCoroParallel",
|
||||
"testCoroSerial"
|
||||
};
|
||||
pair<string*, string*> r = equal_range(__BServant_all, __BServant_all+3, string(msg->request.sFuncName));
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __BServant_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_test_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_test(_ret);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testCoroParallel_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_testCoroParallel(_ret, sOut);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testCoroSerial_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_testCoroSerial(_ret, sOut);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
|
||||
};
|
||||
typedef tars::TC_AutoPtr<BServantPrxCallback> BServantPrxCallbackPtr;
|
||||
|
||||
/* callback of coroutine async proxy for client */
|
||||
class BServantCoroPrxCallback: public BServantPrxCallback
|
||||
{
|
||||
public:
|
||||
virtual ~BServantCoroPrxCallback(){}
|
||||
public:
|
||||
virtual const map<std::string, std::string> & getResponseContext() const { return _mRspContext; }
|
||||
|
||||
virtual void setResponseContext(const map<std::string, std::string> &mContext) { _mRspContext = mContext; }
|
||||
|
||||
public:
|
||||
int onDispatch(tars::ReqMessagePtr msg)
|
||||
{
|
||||
static ::std::string __BServant_all[]=
|
||||
{
|
||||
"test",
|
||||
"testCoroParallel",
|
||||
"testCoroSerial"
|
||||
};
|
||||
|
||||
pair<string*, string*> r = equal_range(__BServant_all, __BServant_all+3, string(msg->request.sFuncName));
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __BServant_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_test_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_test(_ret);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_test_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_test_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testCoroParallel_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_testCoroParallel(_ret, sOut);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_testCoroParallel_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_testCoroParallel_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testCoroSerial_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_testCoroSerial(_ret, sOut);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_testCoroSerial_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_testCoroSerial_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
|
||||
protected:
|
||||
map<std::string, std::string> _mRspContext;
|
||||
};
|
||||
typedef tars::TC_AutoPtr<BServantCoroPrxCallback> BServantCoroPrxCallbackPtr;
|
||||
|
||||
/* proxy for client */
|
||||
class BServantProxy : public tars::ServantProxy
|
||||
{
|
||||
public:
|
||||
typedef map<string, string> TARS_CONTEXT;
|
||||
tars::Int32 test(const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"test", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_test(BServantPrxCallbackPtr callback,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"test", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_test(BServantCoroPrxCallbackPtr callback,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"test", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
tars::Int32 testCoroParallel(const std::string & sIn,std::string &sOut,const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
_os.write(sOut, 2);
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"testCoroParallel", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
_is.read(sOut, 2, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_testCoroParallel(BServantPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testCoroParallel", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_testCoroParallel(BServantCoroPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testCoroParallel", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
tars::Int32 testCoroSerial(const std::string & sIn,std::string &sOut,const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
_os.write(sOut, 2);
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"testCoroSerial", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
_is.read(sOut, 2, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_testCoroSerial(BServantPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testCoroSerial", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_testCoroSerial(BServantCoroPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testCoroSerial", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
BServantProxy* tars_hash(int64_t key)
|
||||
{
|
||||
return (BServantProxy*)ServantProxy::tars_hash(key);
|
||||
}
|
||||
|
||||
BServantProxy* tars_consistent_hash(int64_t key)
|
||||
{
|
||||
return (BServantProxy*)ServantProxy::tars_consistent_hash(key);
|
||||
}
|
||||
|
||||
BServantProxy* tars_set_timeout(int msecond)
|
||||
{
|
||||
return (BServantProxy*)ServantProxy::tars_set_timeout(msecond);
|
||||
}
|
||||
|
||||
static const char* tars_prxname() { return "BServantProxy"; }
|
||||
};
|
||||
typedef tars::TC_AutoPtr<BServantProxy> BServantPrx;
|
||||
|
||||
/* servant for server */
|
||||
class BServant : public tars::Servant
|
||||
{
|
||||
public:
|
||||
virtual ~BServant(){}
|
||||
virtual tars::Int32 test(tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_test(tars::TarsCurrentPtr current, tars::Int32 _ret)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
virtual tars::Int32 testCoroParallel(const std::string & sIn,std::string &sOut,tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_testCoroParallel(tars::TarsCurrentPtr current, tars::Int32 _ret, const std::string &sOut)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
_os.write(sOut, 2);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
virtual tars::Int32 testCoroSerial(const std::string & sIn,std::string &sOut,tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_testCoroSerial(tars::TarsCurrentPtr current, tars::Int32 _ret, const std::string &sOut)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
_os.write(sOut, 2);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
int onDispatch(tars::TarsCurrentPtr _current, vector<char> &_sResponseBuffer)
|
||||
{
|
||||
static ::std::string __Test__BServant_all[]=
|
||||
{
|
||||
"test",
|
||||
"testCoroParallel",
|
||||
"testCoroSerial"
|
||||
};
|
||||
|
||||
pair<string*, string*> r = equal_range(__Test__BServant_all, __Test__BServant_all+3, _current->getFuncName());
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __Test__BServant_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
tars::Int32 _ret = test(_current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
std::string sIn;
|
||||
std::string sOut;
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
tarsAttr.get("sIn", sIn);
|
||||
tarsAttr.getByDefault("sOut", sOut, sOut);
|
||||
}
|
||||
else
|
||||
{
|
||||
_is.read(sIn, 1, true);
|
||||
_is.read(sOut, 2, false);
|
||||
}
|
||||
tars::Int32 _ret = testCoroParallel(sIn,sOut, _current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.write(sOut, 2);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
std::string sIn;
|
||||
std::string sOut;
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
tarsAttr.get("sIn", sIn);
|
||||
tarsAttr.getByDefault("sOut", sOut, sOut);
|
||||
}
|
||||
else
|
||||
{
|
||||
_is.read(sIn, 1, true);
|
||||
_is.read(sOut, 2, false);
|
||||
}
|
||||
tars::Int32 _ret = testCoroSerial(sIn,sOut, _current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.write(sOut, 2);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
648
examples/CoroutineDemo/testCoro/BServant.h
Normal file
648
examples/CoroutineDemo/testCoro/BServant.h
Normal file
@ -0,0 +1,648 @@
|
||||
// **********************************************************************
|
||||
// This file was generated by a TARS parser!
|
||||
// TARS version 1.4.0.
|
||||
// **********************************************************************
|
||||
|
||||
#ifndef __BSERVANT_H_
|
||||
#define __BSERVANT_H_
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "tup/Tars.h"
|
||||
#include "tup/TarsJson.h"
|
||||
using namespace std;
|
||||
#include "servant/ServantProxy.h"
|
||||
#include "servant/Servant.h"
|
||||
|
||||
|
||||
namespace Test
|
||||
{
|
||||
|
||||
/* callback of async proxy for client */
|
||||
class BServantPrxCallback: public tars::ServantProxyCallback
|
||||
{
|
||||
public:
|
||||
virtual ~BServantPrxCallback(){}
|
||||
virtual void callback_test(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_test() override incorrect."); }
|
||||
virtual void callback_test_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_test_exception() override incorrect."); }
|
||||
|
||||
virtual void callback_testCoroParallel(tars::Int32 ret, const std::string& sOut)
|
||||
{ throw std::runtime_error("callback_testCoroParallel() override incorrect."); }
|
||||
virtual void callback_testCoroParallel_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_testCoroParallel_exception() override incorrect."); }
|
||||
|
||||
virtual void callback_testCoroSerial(tars::Int32 ret, const std::string& sOut)
|
||||
{ throw std::runtime_error("callback_testCoroSerial() override incorrect."); }
|
||||
virtual void callback_testCoroSerial_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_testCoroSerial_exception() override incorrect."); }
|
||||
|
||||
public:
|
||||
virtual const map<std::string, std::string> & getResponseContext() const
|
||||
{
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
if(!pCbtd->getContextValid())
|
||||
{
|
||||
throw TC_Exception("cann't get response context");
|
||||
}
|
||||
return pCbtd->getResponseContext();
|
||||
}
|
||||
|
||||
public:
|
||||
virtual int onDispatch(tars::ReqMessagePtr msg)
|
||||
{
|
||||
static ::std::string __BServant_all[]=
|
||||
{
|
||||
"test",
|
||||
"testCoroParallel",
|
||||
"testCoroSerial"
|
||||
};
|
||||
pair<string*, string*> r = equal_range(__BServant_all, __BServant_all+3, string(msg->request.sFuncName));
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __BServant_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_test_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_test(_ret);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testCoroParallel_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_testCoroParallel(_ret, sOut);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testCoroSerial_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_testCoroSerial(_ret, sOut);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
|
||||
};
|
||||
typedef tars::TC_AutoPtr<BServantPrxCallback> BServantPrxCallbackPtr;
|
||||
|
||||
/* callback of coroutine async proxy for client */
|
||||
class BServantCoroPrxCallback: public BServantPrxCallback
|
||||
{
|
||||
public:
|
||||
virtual ~BServantCoroPrxCallback(){}
|
||||
public:
|
||||
virtual const map<std::string, std::string> & getResponseContext() const { return _mRspContext; }
|
||||
|
||||
virtual void setResponseContext(const map<std::string, std::string> &mContext) { _mRspContext = mContext; }
|
||||
|
||||
public:
|
||||
int onDispatch(tars::ReqMessagePtr msg)
|
||||
{
|
||||
static ::std::string __BServant_all[]=
|
||||
{
|
||||
"test",
|
||||
"testCoroParallel",
|
||||
"testCoroSerial"
|
||||
};
|
||||
|
||||
pair<string*, string*> r = equal_range(__BServant_all, __BServant_all+3, string(msg->request.sFuncName));
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __BServant_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_test_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_test(_ret);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_test_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_test_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testCoroParallel_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_testCoroParallel(_ret, sOut);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_testCoroParallel_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_testCoroParallel_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testCoroSerial_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_testCoroSerial(_ret, sOut);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_testCoroSerial_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_testCoroSerial_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
|
||||
protected:
|
||||
map<std::string, std::string> _mRspContext;
|
||||
};
|
||||
typedef tars::TC_AutoPtr<BServantCoroPrxCallback> BServantCoroPrxCallbackPtr;
|
||||
|
||||
/* proxy for client */
|
||||
class BServantProxy : public tars::ServantProxy
|
||||
{
|
||||
public:
|
||||
typedef map<string, string> TARS_CONTEXT;
|
||||
tars::Int32 test(const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"test", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_test(BServantPrxCallbackPtr callback,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"test", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_test(BServantCoroPrxCallbackPtr callback,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"test", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
tars::Int32 testCoroParallel(const std::string & sIn,std::string &sOut,const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
_os.write(sOut, 2);
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"testCoroParallel", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
_is.read(sOut, 2, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_testCoroParallel(BServantPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testCoroParallel", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_testCoroParallel(BServantCoroPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testCoroParallel", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
tars::Int32 testCoroSerial(const std::string & sIn,std::string &sOut,const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
_os.write(sOut, 2);
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"testCoroSerial", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
_is.read(sOut, 2, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_testCoroSerial(BServantPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testCoroSerial", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_testCoroSerial(BServantCoroPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testCoroSerial", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
BServantProxy* tars_hash(int64_t key)
|
||||
{
|
||||
return (BServantProxy*)ServantProxy::tars_hash(key);
|
||||
}
|
||||
|
||||
BServantProxy* tars_consistent_hash(int64_t key)
|
||||
{
|
||||
return (BServantProxy*)ServantProxy::tars_consistent_hash(key);
|
||||
}
|
||||
|
||||
BServantProxy* tars_set_timeout(int msecond)
|
||||
{
|
||||
return (BServantProxy*)ServantProxy::tars_set_timeout(msecond);
|
||||
}
|
||||
|
||||
static const char* tars_prxname() { return "BServantProxy"; }
|
||||
};
|
||||
typedef tars::TC_AutoPtr<BServantProxy> BServantPrx;
|
||||
|
||||
/* servant for server */
|
||||
class BServant : public tars::Servant
|
||||
{
|
||||
public:
|
||||
virtual ~BServant(){}
|
||||
virtual tars::Int32 test(tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_test(tars::TarsCurrentPtr current, tars::Int32 _ret)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
virtual tars::Int32 testCoroParallel(const std::string & sIn,std::string &sOut,tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_testCoroParallel(tars::TarsCurrentPtr current, tars::Int32 _ret, const std::string &sOut)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
_os.write(sOut, 2);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
virtual tars::Int32 testCoroSerial(const std::string & sIn,std::string &sOut,tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_testCoroSerial(tars::TarsCurrentPtr current, tars::Int32 _ret, const std::string &sOut)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
_os.write(sOut, 2);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
int onDispatch(tars::TarsCurrentPtr _current, vector<char> &_sResponseBuffer)
|
||||
{
|
||||
static ::std::string __Test__BServant_all[]=
|
||||
{
|
||||
"test",
|
||||
"testCoroParallel",
|
||||
"testCoroSerial"
|
||||
};
|
||||
|
||||
pair<string*, string*> r = equal_range(__Test__BServant_all, __Test__BServant_all+3, _current->getFuncName());
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __Test__BServant_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
tars::Int32 _ret = test(_current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
std::string sIn;
|
||||
std::string sOut;
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
tarsAttr.get("sIn", sIn);
|
||||
tarsAttr.getByDefault("sOut", sOut, sOut);
|
||||
}
|
||||
else
|
||||
{
|
||||
_is.read(sIn, 1, true);
|
||||
_is.read(sOut, 2, false);
|
||||
}
|
||||
tars::Int32 _ret = testCoroParallel(sIn,sOut, _current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.write(sOut, 2);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
std::string sIn;
|
||||
std::string sOut;
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
tarsAttr.get("sIn", sIn);
|
||||
tarsAttr.getByDefault("sOut", sOut, sOut);
|
||||
}
|
||||
else
|
||||
{
|
||||
_is.read(sIn, 1, true);
|
||||
_is.read(sOut, 2, false);
|
||||
}
|
||||
tars::Int32 _ret = testCoroSerial(sIn,sOut, _current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.write(sOut, 2);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
648
examples/CoroutineDemo/testParallelCoro/BServant.h
Normal file
648
examples/CoroutineDemo/testParallelCoro/BServant.h
Normal file
@ -0,0 +1,648 @@
|
||||
// **********************************************************************
|
||||
// This file was generated by a TARS parser!
|
||||
// TARS version 1.4.0.
|
||||
// **********************************************************************
|
||||
|
||||
#ifndef __BSERVANT_H_
|
||||
#define __BSERVANT_H_
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "tup/Tars.h"
|
||||
#include "tup/TarsJson.h"
|
||||
using namespace std;
|
||||
#include "servant/ServantProxy.h"
|
||||
#include "servant/Servant.h"
|
||||
|
||||
|
||||
namespace Test
|
||||
{
|
||||
|
||||
/* callback of async proxy for client */
|
||||
class BServantPrxCallback: public tars::ServantProxyCallback
|
||||
{
|
||||
public:
|
||||
virtual ~BServantPrxCallback(){}
|
||||
virtual void callback_test(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_test() override incorrect."); }
|
||||
virtual void callback_test_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_test_exception() override incorrect."); }
|
||||
|
||||
virtual void callback_testCoroParallel(tars::Int32 ret, const std::string& sOut)
|
||||
{ throw std::runtime_error("callback_testCoroParallel() override incorrect."); }
|
||||
virtual void callback_testCoroParallel_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_testCoroParallel_exception() override incorrect."); }
|
||||
|
||||
virtual void callback_testCoroSerial(tars::Int32 ret, const std::string& sOut)
|
||||
{ throw std::runtime_error("callback_testCoroSerial() override incorrect."); }
|
||||
virtual void callback_testCoroSerial_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_testCoroSerial_exception() override incorrect."); }
|
||||
|
||||
public:
|
||||
virtual const map<std::string, std::string> & getResponseContext() const
|
||||
{
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
if(!pCbtd->getContextValid())
|
||||
{
|
||||
throw TC_Exception("cann't get response context");
|
||||
}
|
||||
return pCbtd->getResponseContext();
|
||||
}
|
||||
|
||||
public:
|
||||
virtual int onDispatch(tars::ReqMessagePtr msg)
|
||||
{
|
||||
static ::std::string __BServant_all[]=
|
||||
{
|
||||
"test",
|
||||
"testCoroParallel",
|
||||
"testCoroSerial"
|
||||
};
|
||||
pair<string*, string*> r = equal_range(__BServant_all, __BServant_all+3, string(msg->request.sFuncName));
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __BServant_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_test_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_test(_ret);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testCoroParallel_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_testCoroParallel(_ret, sOut);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testCoroSerial_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_testCoroSerial(_ret, sOut);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
|
||||
};
|
||||
typedef tars::TC_AutoPtr<BServantPrxCallback> BServantPrxCallbackPtr;
|
||||
|
||||
/* callback of coroutine async proxy for client */
|
||||
class BServantCoroPrxCallback: public BServantPrxCallback
|
||||
{
|
||||
public:
|
||||
virtual ~BServantCoroPrxCallback(){}
|
||||
public:
|
||||
virtual const map<std::string, std::string> & getResponseContext() const { return _mRspContext; }
|
||||
|
||||
virtual void setResponseContext(const map<std::string, std::string> &mContext) { _mRspContext = mContext; }
|
||||
|
||||
public:
|
||||
int onDispatch(tars::ReqMessagePtr msg)
|
||||
{
|
||||
static ::std::string __BServant_all[]=
|
||||
{
|
||||
"test",
|
||||
"testCoroParallel",
|
||||
"testCoroSerial"
|
||||
};
|
||||
|
||||
pair<string*, string*> r = equal_range(__BServant_all, __BServant_all+3, string(msg->request.sFuncName));
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __BServant_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_test_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_test(_ret);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_test_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_test_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testCoroParallel_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_testCoroParallel(_ret, sOut);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_testCoroParallel_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_testCoroParallel_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testCoroSerial_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_testCoroSerial(_ret, sOut);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_testCoroSerial_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_testCoroSerial_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
|
||||
protected:
|
||||
map<std::string, std::string> _mRspContext;
|
||||
};
|
||||
typedef tars::TC_AutoPtr<BServantCoroPrxCallback> BServantCoroPrxCallbackPtr;
|
||||
|
||||
/* proxy for client */
|
||||
class BServantProxy : public tars::ServantProxy
|
||||
{
|
||||
public:
|
||||
typedef map<string, string> TARS_CONTEXT;
|
||||
tars::Int32 test(const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"test", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_test(BServantPrxCallbackPtr callback,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"test", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_test(BServantCoroPrxCallbackPtr callback,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"test", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
tars::Int32 testCoroParallel(const std::string & sIn,std::string &sOut,const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
_os.write(sOut, 2);
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"testCoroParallel", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
_is.read(sOut, 2, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_testCoroParallel(BServantPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testCoroParallel", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_testCoroParallel(BServantCoroPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testCoroParallel", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
tars::Int32 testCoroSerial(const std::string & sIn,std::string &sOut,const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
_os.write(sOut, 2);
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"testCoroSerial", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
_is.read(sOut, 2, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_testCoroSerial(BServantPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testCoroSerial", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_testCoroSerial(BServantCoroPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testCoroSerial", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
BServantProxy* tars_hash(int64_t key)
|
||||
{
|
||||
return (BServantProxy*)ServantProxy::tars_hash(key);
|
||||
}
|
||||
|
||||
BServantProxy* tars_consistent_hash(int64_t key)
|
||||
{
|
||||
return (BServantProxy*)ServantProxy::tars_consistent_hash(key);
|
||||
}
|
||||
|
||||
BServantProxy* tars_set_timeout(int msecond)
|
||||
{
|
||||
return (BServantProxy*)ServantProxy::tars_set_timeout(msecond);
|
||||
}
|
||||
|
||||
static const char* tars_prxname() { return "BServantProxy"; }
|
||||
};
|
||||
typedef tars::TC_AutoPtr<BServantProxy> BServantPrx;
|
||||
|
||||
/* servant for server */
|
||||
class BServant : public tars::Servant
|
||||
{
|
||||
public:
|
||||
virtual ~BServant(){}
|
||||
virtual tars::Int32 test(tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_test(tars::TarsCurrentPtr current, tars::Int32 _ret)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
virtual tars::Int32 testCoroParallel(const std::string & sIn,std::string &sOut,tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_testCoroParallel(tars::TarsCurrentPtr current, tars::Int32 _ret, const std::string &sOut)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
_os.write(sOut, 2);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
virtual tars::Int32 testCoroSerial(const std::string & sIn,std::string &sOut,tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_testCoroSerial(tars::TarsCurrentPtr current, tars::Int32 _ret, const std::string &sOut)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
_os.write(sOut, 2);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
int onDispatch(tars::TarsCurrentPtr _current, vector<char> &_sResponseBuffer)
|
||||
{
|
||||
static ::std::string __Test__BServant_all[]=
|
||||
{
|
||||
"test",
|
||||
"testCoroParallel",
|
||||
"testCoroSerial"
|
||||
};
|
||||
|
||||
pair<string*, string*> r = equal_range(__Test__BServant_all, __Test__BServant_all+3, _current->getFuncName());
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __Test__BServant_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
tars::Int32 _ret = test(_current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
std::string sIn;
|
||||
std::string sOut;
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
tarsAttr.get("sIn", sIn);
|
||||
tarsAttr.getByDefault("sOut", sOut, sOut);
|
||||
}
|
||||
else
|
||||
{
|
||||
_is.read(sIn, 1, true);
|
||||
_is.read(sOut, 2, false);
|
||||
}
|
||||
tars::Int32 _ret = testCoroParallel(sIn,sOut, _current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.write(sOut, 2);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
std::string sIn;
|
||||
std::string sOut;
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
tarsAttr.get("sIn", sIn);
|
||||
tarsAttr.getByDefault("sOut", sOut, sOut);
|
||||
}
|
||||
else
|
||||
{
|
||||
_is.read(sIn, 1, true);
|
||||
_is.read(sOut, 2, false);
|
||||
}
|
||||
tars::Int32 _ret = testCoroSerial(sIn,sOut, _current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.write(sOut, 2);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
@ -1,27 +0,0 @@
|
||||
/**
|
||||
* Tencent is pleased to support the open source community by making Tars available.
|
||||
*
|
||||
* Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
|
||||
*
|
||||
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* https://opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
module Test
|
||||
{
|
||||
|
||||
interface AServant
|
||||
{
|
||||
int queryResultSerial(string sIn, out string sOut);
|
||||
|
||||
int queryResultParallel(string sIn, out string sOut);
|
||||
};
|
||||
|
||||
};
|
@ -1,267 +0,0 @@
|
||||
/**
|
||||
* Tencent is pleased to support the open source community by making Tars available.
|
||||
*
|
||||
* Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
|
||||
*
|
||||
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* https://opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "AServantImp.h"
|
||||
#include "AServer.h"
|
||||
#include "servant/Application.h"
|
||||
#include "servant/Communicator.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace tars;
|
||||
|
||||
//////////////////////////////////////////////////////
|
||||
class BServantCallback : public BServantPrxCallback
|
||||
{
|
||||
|
||||
public:
|
||||
BServantCallback(TarsCurrentPtr ¤t)
|
||||
: _current(current)
|
||||
{}
|
||||
|
||||
BServantCallback(TarsCurrentPtr ¤t, const tars::Promise<std::string> &promise)
|
||||
: _current(current)
|
||||
, _promise(promise)
|
||||
{}
|
||||
|
||||
void callback_queryResult(tars::Int32 ret, const std::string &sOut)
|
||||
{
|
||||
if(ret == 0)
|
||||
{
|
||||
_promise.setValue(sOut);
|
||||
}
|
||||
else
|
||||
{
|
||||
handExp("callback_queryResult", ret);
|
||||
}
|
||||
}
|
||||
void callback_queryResult_exception(tars::Int32 ret)
|
||||
{
|
||||
handExp("callback_queryResult_exception", ret);
|
||||
}
|
||||
|
||||
private:
|
||||
void handExp(const std::string &sFuncName, tars::Int32 ret)
|
||||
{
|
||||
string s("sFuncName:");
|
||||
s += sFuncName;
|
||||
s += "|ret:";
|
||||
s += TC_Common::tostr(ret);
|
||||
|
||||
_promise.setException(tars::copyException(s));
|
||||
|
||||
TLOGDEBUG("ServerPrxCallback handExp:" << s << endl);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
TarsCurrentPtr _current;
|
||||
tars::Promise<std::string> _promise;
|
||||
};
|
||||
//////////////////////////////////////////////////////
|
||||
class CServantCallback : public CServantPrxCallback
|
||||
{
|
||||
|
||||
public:
|
||||
CServantCallback(TarsCurrentPtr ¤t)
|
||||
: _current(current)
|
||||
{}
|
||||
|
||||
CServantCallback(TarsCurrentPtr ¤t, const tars::Promise<std::string> &promise)
|
||||
: _current(current)
|
||||
, _promise(promise)
|
||||
{}
|
||||
|
||||
void callback_queryResult(tars::Int32 ret, const std::string &sOut)
|
||||
{
|
||||
if(ret == 0)
|
||||
{
|
||||
_promise.setValue(sOut);
|
||||
}
|
||||
else
|
||||
{
|
||||
handExp("callback_queryResult", ret);
|
||||
}
|
||||
}
|
||||
void callback_queryResult_exception(tars::Int32 ret)
|
||||
{
|
||||
handExp("callback_queryResult_exception", ret);
|
||||
}
|
||||
|
||||
private:
|
||||
void handExp(const std::string &sFuncName, tars::Int32 ret)
|
||||
{
|
||||
string s("sFuncName:");
|
||||
s += sFuncName;
|
||||
s += "|ret:";
|
||||
s += TC_Common::tostr(ret);
|
||||
|
||||
_promise.setException(tars::copyException(s));
|
||||
|
||||
TLOGDEBUG("ServerPrxCallback handExp:" << s << endl);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
TarsCurrentPtr _current;
|
||||
tars::Promise<std::string> _promise;
|
||||
};
|
||||
//////////////////////////////////////////////////////
|
||||
tars::Future<std::string> sendBReq(BServantPrx prx, const std::string& sIn, tars::TarsCurrentPtr current)
|
||||
{
|
||||
tars::Promise<std::string> promise;
|
||||
|
||||
Test::BServantPrxCallbackPtr cb = new BServantCallback(current, promise);
|
||||
|
||||
prx->async_queryResult(cb, sIn);
|
||||
|
||||
return promise.getFuture();
|
||||
}
|
||||
//////////////////////////////////////////////////////
|
||||
tars::Future<std::string> sendCReq(CServantPrx prx, const std::string& sIn, tars::TarsCurrentPtr current)
|
||||
{
|
||||
tars::Promise<std::string> promise;
|
||||
|
||||
Test::CServantPrxCallbackPtr cb = new CServantCallback(current, promise);
|
||||
|
||||
prx->async_queryResult(cb, sIn);
|
||||
|
||||
return promise.getFuture();
|
||||
}
|
||||
//////////////////////////////////////////////////////
|
||||
tars::Future<std::string> handleBRspAndSendCReq(CServantPrx prx, TarsCurrentPtr current, const tars::Future<std::string>& future)
|
||||
{
|
||||
std::string sResult("");
|
||||
std::string sException("");
|
||||
try
|
||||
{
|
||||
sResult = future.get();
|
||||
|
||||
return sendCReq(prx, sResult, current);
|
||||
}
|
||||
catch (exception& e)
|
||||
{
|
||||
TLOGDEBUG("Exception:" << e.what() << endl);
|
||||
sException = e.what();
|
||||
}
|
||||
|
||||
tars::Promise<std::string> promise;
|
||||
promise.setValue(sException);
|
||||
|
||||
return promise.getFuture();
|
||||
}
|
||||
//////////////////////////////////////////////////////
|
||||
int handleCRspAndReturnClient(TarsCurrentPtr current, const tars::Future<std::string>& future)
|
||||
{
|
||||
int ret = 0;
|
||||
std::string sResult("");
|
||||
try
|
||||
{
|
||||
sResult = future.get();
|
||||
}
|
||||
catch (exception& e)
|
||||
{
|
||||
ret = -1;
|
||||
sResult = e.what();
|
||||
|
||||
TLOGDEBUG("Exception:" << e.what() << endl);
|
||||
}
|
||||
|
||||
AServant::async_response_queryResultSerial(current, ret, sResult);
|
||||
|
||||
return 0;
|
||||
}
|
||||
//////////////////////////////////////////////////////
|
||||
int handleBCRspAndReturnClient(TarsCurrentPtr current, const tars::Future<std::tuple<tars::Future<std::string>, tars::Future<std::string> > >& allFuture)
|
||||
{
|
||||
int ret = 0;
|
||||
std::string sResult("");
|
||||
try
|
||||
{
|
||||
std::tuple<tars::Future<std::string>, tars::Future<std::string> > tupleFuture = allFuture.get();
|
||||
|
||||
std::string sResult1 = std::get<0>(tupleFuture).get();
|
||||
std::string sResult2 = std::get<1>(tupleFuture).get();
|
||||
|
||||
sResult = sResult1;
|
||||
sResult += "|";
|
||||
sResult += sResult2;
|
||||
}
|
||||
catch (exception& e)
|
||||
{
|
||||
ret = -1;
|
||||
sResult = e.what();
|
||||
|
||||
TLOGDEBUG("Exception:" << e.what() << endl);
|
||||
}
|
||||
|
||||
AServant::async_response_queryResultParallel(current, ret, sResult);
|
||||
|
||||
return 0;
|
||||
}
|
||||
//////////////////////////////////////////////////////
|
||||
void AServantImp::initialize()
|
||||
{
|
||||
//initialize servant here:
|
||||
//...
|
||||
_pPrxB = Application::getCommunicator()->stringToProxy<BServantPrx>("Test.BServer.BServantObj");
|
||||
_pPrxC = Application::getCommunicator()->stringToProxy<CServantPrx>("Test.CServer.CServantObj");
|
||||
}
|
||||
//////////////////////////////////////////////////////
|
||||
void AServantImp::destroy()
|
||||
{
|
||||
}
|
||||
|
||||
// class Test1
|
||||
// {
|
||||
// public:
|
||||
// template <typename R>
|
||||
// void then(const std::function<R(const Future&)>& callback);
|
||||
// {
|
||||
// cout <<"then" << endl;
|
||||
// }
|
||||
// }
|
||||
|
||||
//////////////////////////////////////////////////////
|
||||
tars::Int32 AServantImp::queryResultSerial(const std::string& sIn, std::string &sOut, tars::TarsCurrentPtr current)
|
||||
{
|
||||
current->setResponse(false);
|
||||
|
||||
tars::Future<std::string> f = sendBReq(_pPrxB, sIn, current);
|
||||
|
||||
auto b1 = std::bind(handleBRspAndSendCReq, _pPrxC, current);//, std::placeholders::_3);
|
||||
auto b2 = std::bind(handleCRspAndReturnClient, current);//, std::placeholders::_2);
|
||||
f.then(b1).then(b2);
|
||||
|
||||
// Test1 t;
|
||||
// t.then<std::string>(b1);
|
||||
return 0;
|
||||
}
|
||||
//////////////////////////////////////////////////////
|
||||
tars::Int32 AServantImp::queryResultParallel(const std::string& sIn, std::string &sOut, tars::TarsCurrentPtr current)
|
||||
{
|
||||
current->setResponse(false);
|
||||
|
||||
tars::Future<std::string> f1 = sendBReq(_pPrxB, sIn, current);
|
||||
|
||||
tars::Future<std::string> f2 = sendCReq(_pPrxC, sIn, current);
|
||||
|
||||
tars::Future<std::tuple<tars::Future<std::string>, tars::Future<std::string> > > f_all = tars::whenAll(f1, f2);
|
||||
|
||||
f_all.then(std::bind(&handleBCRspAndReturnClient, current));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,63 +0,0 @@
|
||||
/**
|
||||
* Tencent is pleased to support the open source community by making Tars available.
|
||||
*
|
||||
* Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
|
||||
*
|
||||
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* https://opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
* 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 _BServantImp_H_
|
||||
#define _BServantImp_H_
|
||||
|
||||
#include "servant/Application.h"
|
||||
#include "AServant.h"
|
||||
#include "BServant.h"
|
||||
#include "CServant.h"
|
||||
#include "promise/promise.h"
|
||||
//#include "promise/tuple.h"
|
||||
|
||||
#include "promise/when_all.h"
|
||||
|
||||
using namespace Test;
|
||||
|
||||
///////////////////////////////////
|
||||
tars::Future<std::string> sendBReq(BServantPrx prx, const std::string& sIn, tars::TarsCurrentPtr current);
|
||||
|
||||
tars::Future<std::string> handleBRspAndSendCReq(CServantPrx prx, TarsCurrentPtr current, const tars::Future<std::string>& future);
|
||||
|
||||
tars::Future<std::string> sendCReq(CServantPrx prx, const std::string& sIn, tars::TarsCurrentPtr current);
|
||||
|
||||
int handleCRspAndReturnClient(TarsCurrentPtr current, const tars::Future<std::string>& future);
|
||||
|
||||
///////////////////////////////////
|
||||
int handleBCRspAndReturnClient(TarsCurrentPtr current, const tars::Future<std::tuple<tars::Future<std::string>, tars::Future<std::string> > >& allFuture);
|
||||
|
||||
///////////////////////////////////
|
||||
class AServantImp : public Test::AServant
|
||||
{
|
||||
public:
|
||||
|
||||
virtual ~AServantImp() {}
|
||||
|
||||
virtual void initialize();
|
||||
|
||||
virtual void destroy();
|
||||
|
||||
tars::Int32 queryResultSerial(const std::string& sIn, std::string &sOut, tars::TarsCurrentPtr current);
|
||||
|
||||
tars::Int32 queryResultParallel(const std::string& sIn, std::string &sOut, tars::TarsCurrentPtr current);
|
||||
|
||||
private:
|
||||
BServantPrx _pPrxB;
|
||||
CServantPrx _pPrxC;
|
||||
};
|
||||
/////////////////////////////////////////////////////
|
||||
#endif
|
@ -1,57 +0,0 @@
|
||||
/**
|
||||
* Tencent is pleased to support the open source community by making Tars available.
|
||||
*
|
||||
* Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
|
||||
*
|
||||
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* https://opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "AServer.h"
|
||||
#include "AServantImp.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
AServer g_app;
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
void AServer::initialize()
|
||||
{
|
||||
//initialize application here:
|
||||
//...
|
||||
|
||||
addServant<AServantImp>(ServerConfig::Application + "." + ServerConfig::ServerName + ".AServantObj");
|
||||
}
|
||||
/////////////////////////////////////////////////////////////////
|
||||
void AServer::destroyApp()
|
||||
{
|
||||
//destroy application here:
|
||||
//...
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
try
|
||||
{
|
||||
g_app.main(argc, argv);
|
||||
g_app.waitForShutdown();
|
||||
}
|
||||
catch (std::exception& e)
|
||||
{
|
||||
cerr << "std::exception:" << e.what() << std::endl;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
cerr << "unknown exception." << std::endl;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
/////////////////////////////////////////////////////////////////
|
@ -1,25 +0,0 @@
|
||||
/**
|
||||
* Tencent is pleased to support the open source community by making Tars available.
|
||||
*
|
||||
* Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
|
||||
*
|
||||
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* https://opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
module Test
|
||||
{
|
||||
|
||||
interface BServant
|
||||
{
|
||||
int queryResult(string sIn, out string sOut);
|
||||
};
|
||||
|
||||
};
|
@ -1 +0,0 @@
|
||||
build_tars_server("PromiseDemoAServer")
|
@ -1,25 +0,0 @@
|
||||
/**
|
||||
* Tencent is pleased to support the open source community by making Tars available.
|
||||
*
|
||||
* Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
|
||||
*
|
||||
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* https://opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
module Test
|
||||
{
|
||||
|
||||
interface CServant
|
||||
{
|
||||
int queryResult(string sIn, out string sOut);
|
||||
};
|
||||
|
||||
};
|
@ -1 +0,0 @@
|
||||
build_tars_server("PromiseDemoBServer")
|
@ -1,11 +0,0 @@
|
||||
#-----------------------------------------------------------------------
|
||||
|
||||
APP := Test
|
||||
TARGET := BServer
|
||||
CONFIG :=
|
||||
STRIP_FLAG:= N
|
||||
INCLUDE +=
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
include /usr/local/tars/cpp/makefile/makefile.tars
|
||||
#-----------------------------------------------------------------------
|
@ -1,6 +0,0 @@
|
||||
|
||||
add_subdirectory(AServer)
|
||||
add_subdirectory(BServer)
|
||||
add_subdirectory(CServer)
|
||||
add_subdirectory(Client)
|
||||
|
@ -1 +0,0 @@
|
||||
build_tars_server("PromiseDemoCServer")
|
@ -1,45 +0,0 @@
|
||||
/**
|
||||
* Tencent is pleased to support the open source community by making Tars available.
|
||||
*
|
||||
* Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
|
||||
*
|
||||
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* https://opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "CServantImp.h"
|
||||
#include "CServer.h"
|
||||
#include "servant/Application.h"
|
||||
#include "servant/Communicator.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace tars;
|
||||
|
||||
//////////////////////////////////////////////////////
|
||||
void CServantImp::initialize()
|
||||
{
|
||||
//initialize servant here:
|
||||
//...
|
||||
}
|
||||
//////////////////////////////////////////////////////
|
||||
void CServantImp::destroy()
|
||||
{
|
||||
}
|
||||
//////////////////////////////////////////////////////
|
||||
tars::Int32 CServantImp::queryResult(const std::string& sIn, std::string &sOut, tars::TarsCurrentPtr current)
|
||||
{
|
||||
sOut = "[sResult:";
|
||||
sOut += sIn;
|
||||
sOut += "]";
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1,53 +0,0 @@
|
||||
/**
|
||||
* Tencent is pleased to support the open source community by making Tars available.
|
||||
*
|
||||
* Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
|
||||
*
|
||||
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* https://opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
* 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 _BServer_H_
|
||||
#define _BServer_H_
|
||||
|
||||
#include <iostream>
|
||||
#include "servant/Application.h"
|
||||
|
||||
using namespace tars;
|
||||
|
||||
/**
|
||||
* *
|
||||
* **/
|
||||
class CServer : public Application
|
||||
{
|
||||
public:
|
||||
/**
|
||||
*
|
||||
**/
|
||||
virtual ~CServer() {};
|
||||
|
||||
/**
|
||||
*
|
||||
**/
|
||||
virtual void initialize();
|
||||
|
||||
/**
|
||||
*
|
||||
**/
|
||||
virtual void destroyApp();
|
||||
protected:
|
||||
bool cmdprofile(const string& command, const string& params, string& result);
|
||||
};
|
||||
|
||||
extern CServer g_app;
|
||||
|
||||
////////////////////////////////////////////
|
||||
#endif
|
||||
|
@ -1,11 +0,0 @@
|
||||
#-----------------------------------------------------------------------
|
||||
APP := Test
|
||||
TARGET := CServer
|
||||
CONFIG :=
|
||||
STRIP_FLAG:= N
|
||||
|
||||
INCLUDE +=
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
include /usr/local/tars/cpp/makefile/makefile.tars
|
||||
#-----------------------------------------------------------------------
|
@ -1 +0,0 @@
|
||||
build_tars_server("PromiseDemoClient")
|
@ -1,138 +0,0 @@
|
||||
/**
|
||||
* Tencent is pleased to support the open source community by making Tars available.
|
||||
*
|
||||
* Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
|
||||
*
|
||||
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* https://opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "AServant.h"
|
||||
#include "servant/Communicator.h"
|
||||
#include "util/tc_thread_pool.h"
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
using namespace Test;
|
||||
using namespace tars;
|
||||
|
||||
class Test1
|
||||
{
|
||||
public:
|
||||
Test1(const string &sStr);
|
||||
|
||||
~Test1();
|
||||
|
||||
void queryResult(int iFlag, int iExecuteNum);
|
||||
|
||||
private:
|
||||
Communicator _comm;
|
||||
AServantPrx prx;
|
||||
};
|
||||
|
||||
Test1::Test1(const string &sStr)
|
||||
{
|
||||
_comm.setProperty("locator", "tars.tarsregistry.QueryObj@ tcp -h 10.208.139.242 -p 17890 -t 10000 ");
|
||||
_comm.stringToProxy(sStr, prx);
|
||||
}
|
||||
|
||||
Test1::~Test1()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void Test1::queryResult(int iFlag, int iExecuteNum)
|
||||
{
|
||||
string sIn(10,'a');
|
||||
string sOut("");
|
||||
|
||||
tars::Int32 count = 0;
|
||||
unsigned long sum = 0;
|
||||
|
||||
time_t _iTime=TC_TimeProvider::getInstance()->getNowMs();
|
||||
|
||||
for(int i=0; i<iExecuteNum; i++)
|
||||
{
|
||||
sOut = "";
|
||||
try
|
||||
{
|
||||
int ret = -1;
|
||||
if(iFlag == 0)
|
||||
{
|
||||
ret = prx->queryResultSerial(sIn, sOut);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = prx->queryResultParallel(sIn, sOut);
|
||||
}
|
||||
|
||||
if(ret == 0)
|
||||
{
|
||||
++sum;
|
||||
++count;
|
||||
if(count == iExecuteNum)
|
||||
{
|
||||
cout << "pthread id: " << pthread_self() << " | " << TC_TimeProvider::getInstance()->getNowMs() - _iTime << endl;
|
||||
_iTime=TC_TimeProvider::getInstance()->getNowMs();
|
||||
count = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(TC_Exception &e)
|
||||
{
|
||||
cout << "pthread id: " << pthread_self() << "id: " << i << "exception: " << e.what() << endl;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
cout << "pthread id: " << pthread_self() << "id: " << i << "unknown exception." << endl;
|
||||
}
|
||||
}
|
||||
cout << "succ:" << sum << endl;
|
||||
cout << "sOut:" << sOut << endl;
|
||||
}
|
||||
|
||||
int main(int argc,char ** argv)
|
||||
{
|
||||
if(argc != 5)
|
||||
{
|
||||
cout << "usage: " << argv[0] << " sObj ThreadNum CallTimes CallMode" << endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
string s = string(argv[1]);
|
||||
|
||||
Test1 test1(s);
|
||||
try
|
||||
{
|
||||
tars::Int32 threads = TC_Common::strto<tars::Int32>(string(argv[2]));
|
||||
TC_ThreadPool tp;
|
||||
tp.init(threads);
|
||||
tp.start();
|
||||
tars::Int32 times = TC_Common::strto<tars::Int32>(string(argv[3]));
|
||||
tars::Int32 callMode = TC_Common::strto<tars::Int32>(string(argv[4]));
|
||||
|
||||
for(int i = 0; i<threads; i++)
|
||||
{
|
||||
auto fw = std::bind(&Test1::queryResult, &test1, callMode, times);
|
||||
tp.exec(fw);
|
||||
cout << "********************" <<endl;
|
||||
}
|
||||
tp.waitForAllDone();
|
||||
}catch(exception &e)
|
||||
{
|
||||
cout<<e.what()<<endl;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
该工程是Tars promise编程示例的代码
|
||||
|
||||
|
||||
目录名称 |功能
|
||||
-----------------|----------------
|
||||
AServer | promise编程的示例程序,用promsie方式去并行和串行访问BServer和CServer
|
@ -29,7 +29,7 @@ int main(int argc,char ** argv)
|
||||
try
|
||||
{
|
||||
HelloPrx prx;
|
||||
comm.stringToProxy("TestApp.HelloServer.HelloObj@tcp -h 10.120.129.226 -p 20001" , prx);
|
||||
comm.stringToProxy("TestApp.HelloServer.HelloObj@tcp -h 127.0.0.1 -p 8999" , prx);
|
||||
|
||||
try
|
||||
{
|
||||
|
471
examples/QuickStartDemo/HelloServer/Server/Hello.h
Normal file
471
examples/QuickStartDemo/HelloServer/Server/Hello.h
Normal file
@ -0,0 +1,471 @@
|
||||
// **********************************************************************
|
||||
// This file was generated by a TARS parser!
|
||||
// TARS version 1.4.0.
|
||||
// **********************************************************************
|
||||
|
||||
#ifndef __HELLO_H_
|
||||
#define __HELLO_H_
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "tup/Tars.h"
|
||||
#include "tup/TarsJson.h"
|
||||
using namespace std;
|
||||
#include "servant/ServantProxy.h"
|
||||
#include "servant/Servant.h"
|
||||
|
||||
|
||||
namespace TestApp
|
||||
{
|
||||
|
||||
/* callback of async proxy for client */
|
||||
class HelloPrxCallback: public tars::ServantProxyCallback
|
||||
{
|
||||
public:
|
||||
virtual ~HelloPrxCallback(){}
|
||||
virtual void callback_test(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_test() override incorrect."); }
|
||||
virtual void callback_test_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_test_exception() override incorrect."); }
|
||||
|
||||
virtual void callback_testHello(tars::Int32 ret, const std::string& sRsp)
|
||||
{ throw std::runtime_error("callback_testHello() override incorrect."); }
|
||||
virtual void callback_testHello_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_testHello_exception() override incorrect."); }
|
||||
|
||||
public:
|
||||
virtual const map<std::string, std::string> & getResponseContext() const
|
||||
{
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
if(!pCbtd->getContextValid())
|
||||
{
|
||||
throw TC_Exception("cann't get response context");
|
||||
}
|
||||
return pCbtd->getResponseContext();
|
||||
}
|
||||
|
||||
public:
|
||||
virtual int onDispatch(tars::ReqMessagePtr msg)
|
||||
{
|
||||
static ::std::string __Hello_all[]=
|
||||
{
|
||||
"test",
|
||||
"testHello"
|
||||
};
|
||||
pair<string*, string*> r = equal_range(__Hello_all, __Hello_all+2, string(msg->request.sFuncName));
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __Hello_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_test_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_test(_ret);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testHello_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sRsp;
|
||||
_is.read(sRsp, 2, true);
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_testHello(_ret, sRsp);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
|
||||
};
|
||||
typedef tars::TC_AutoPtr<HelloPrxCallback> HelloPrxCallbackPtr;
|
||||
|
||||
/* callback of coroutine async proxy for client */
|
||||
class HelloCoroPrxCallback: public HelloPrxCallback
|
||||
{
|
||||
public:
|
||||
virtual ~HelloCoroPrxCallback(){}
|
||||
public:
|
||||
virtual const map<std::string, std::string> & getResponseContext() const { return _mRspContext; }
|
||||
|
||||
virtual void setResponseContext(const map<std::string, std::string> &mContext) { _mRspContext = mContext; }
|
||||
|
||||
public:
|
||||
int onDispatch(tars::ReqMessagePtr msg)
|
||||
{
|
||||
static ::std::string __Hello_all[]=
|
||||
{
|
||||
"test",
|
||||
"testHello"
|
||||
};
|
||||
|
||||
pair<string*, string*> r = equal_range(__Hello_all, __Hello_all+2, string(msg->request.sFuncName));
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __Hello_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_test_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_test(_ret);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_test_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_test_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testHello_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sRsp;
|
||||
_is.read(sRsp, 2, true);
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_testHello(_ret, sRsp);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_testHello_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_testHello_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
|
||||
protected:
|
||||
map<std::string, std::string> _mRspContext;
|
||||
};
|
||||
typedef tars::TC_AutoPtr<HelloCoroPrxCallback> HelloCoroPrxCallbackPtr;
|
||||
|
||||
/* proxy for client */
|
||||
class HelloProxy : public tars::ServantProxy
|
||||
{
|
||||
public:
|
||||
typedef map<string, string> TARS_CONTEXT;
|
||||
tars::Int32 test(const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"test", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_test(HelloPrxCallbackPtr callback,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"test", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_test(HelloCoroPrxCallbackPtr callback,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"test", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
tars::Int32 testHello(const std::string & sReq,std::string &sRsp,const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sReq, 1);
|
||||
_os.write(sRsp, 2);
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"testHello", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
_is.read(sRsp, 2, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_testHello(HelloPrxCallbackPtr callback,const std::string &sReq,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sReq, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testHello", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_testHello(HelloCoroPrxCallbackPtr callback,const std::string &sReq,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sReq, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testHello", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
HelloProxy* tars_hash(int64_t key)
|
||||
{
|
||||
return (HelloProxy*)ServantProxy::tars_hash(key);
|
||||
}
|
||||
|
||||
HelloProxy* tars_consistent_hash(int64_t key)
|
||||
{
|
||||
return (HelloProxy*)ServantProxy::tars_consistent_hash(key);
|
||||
}
|
||||
|
||||
HelloProxy* tars_set_timeout(int msecond)
|
||||
{
|
||||
return (HelloProxy*)ServantProxy::tars_set_timeout(msecond);
|
||||
}
|
||||
|
||||
static const char* tars_prxname() { return "HelloProxy"; }
|
||||
};
|
||||
typedef tars::TC_AutoPtr<HelloProxy> HelloPrx;
|
||||
|
||||
/* servant for server */
|
||||
class Hello : public tars::Servant
|
||||
{
|
||||
public:
|
||||
virtual ~Hello(){}
|
||||
virtual tars::Int32 test(tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_test(tars::TarsCurrentPtr current, tars::Int32 _ret)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
virtual tars::Int32 testHello(const std::string & sReq,std::string &sRsp,tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_testHello(tars::TarsCurrentPtr current, tars::Int32 _ret, const std::string &sRsp)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sRsp", sRsp);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
_os.write(sRsp, 2);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
int onDispatch(tars::TarsCurrentPtr _current, vector<char> &_sResponseBuffer)
|
||||
{
|
||||
static ::std::string __TestApp__Hello_all[]=
|
||||
{
|
||||
"test",
|
||||
"testHello"
|
||||
};
|
||||
|
||||
pair<string*, string*> r = equal_range(__TestApp__Hello_all, __TestApp__Hello_all+2, _current->getFuncName());
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __TestApp__Hello_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
tars::Int32 _ret = test(_current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
std::string sReq;
|
||||
std::string sRsp;
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
tarsAttr.get("sReq", sReq);
|
||||
tarsAttr.getByDefault("sRsp", sRsp, sRsp);
|
||||
}
|
||||
else
|
||||
{
|
||||
_is.read(sReq, 1, true);
|
||||
_is.read(sRsp, 2, false);
|
||||
}
|
||||
tars::Int32 _ret = testHello(sReq,sRsp, _current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sRsp", sRsp);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.write(sRsp, 2);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
@ -14,12 +14,13 @@
|
||||
* specific language governing permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
module Test
|
||||
module TestApp
|
||||
{
|
||||
|
||||
interface CServant
|
||||
interface Hello
|
||||
{
|
||||
int queryResult(string sIn, out string sOut);
|
||||
int test();
|
||||
int testHello(string sReq, out string sRsp);
|
||||
};
|
||||
|
||||
};
|
@ -14,32 +14,29 @@
|
||||
* specific language governing permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
#include "BServantImp.h"
|
||||
#include "BServer.h"
|
||||
#include "HelloImp.h"
|
||||
#include "servant/Application.h"
|
||||
#include "servant/Communicator.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace tars;
|
||||
|
||||
//////////////////////////////////////////////////////
|
||||
void BServantImp::initialize()
|
||||
void HelloImp::initialize()
|
||||
{
|
||||
//initialize servant here:
|
||||
//...
|
||||
}
|
||||
//////////////////////////////////////////////////////
|
||||
void BServantImp::destroy()
|
||||
{
|
||||
}
|
||||
//////////////////////////////////////////////////////
|
||||
tars::Int32 BServantImp::queryResult(const std::string& sIn, std::string &sOut, tars::TarsCurrentPtr current)
|
||||
{
|
||||
sOut = "[sResult:";
|
||||
sOut += sIn;
|
||||
sOut += "]";
|
||||
|
||||
//////////////////////////////////////////////////////
|
||||
void HelloImp::destroy()
|
||||
{
|
||||
//destroy servant here:
|
||||
//...
|
||||
}
|
||||
|
||||
int HelloImp::testHello(const std::string &sReq, std::string &sRsp, tars::TarsCurrentPtr current)
|
||||
{
|
||||
TLOGDEBUG("HelloImp::testHellosReq:"<<sReq<<endl);
|
||||
sRsp = sReq;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -14,27 +14,40 @@
|
||||
* specific language governing permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef _BServantImp_H_
|
||||
#define _BServantImp_H_
|
||||
#ifndef _HelloImp_H_
|
||||
#define _HelloImp_H_
|
||||
|
||||
#include "servant/Application.h"
|
||||
#include "CServant.h"
|
||||
#include "promise/promise.h"
|
||||
#include "Hello.h"
|
||||
|
||||
using namespace Test;
|
||||
|
||||
class CServantImp : public Test::CServant
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
class HelloImp : public TestApp::Hello
|
||||
{
|
||||
public:
|
||||
/**
|
||||
*
|
||||
*/
|
||||
virtual ~HelloImp() {}
|
||||
|
||||
virtual ~CServantImp() {}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
virtual void initialize();
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
virtual void destroy();
|
||||
|
||||
tars::Int32 queryResult(const std::string& sIn, std::string &sOut, tars::TarsCurrentPtr current);
|
||||
/**
|
||||
*
|
||||
*/
|
||||
virtual int test(tars::TarsCurrentPtr current) { return 0;};
|
||||
|
||||
virtual int testHello(const std::string &sReq, std::string &sRsp, tars::TarsCurrentPtr current);
|
||||
};
|
||||
/////////////////////////////////////////////////////
|
||||
#endif
|
@ -14,30 +14,32 @@
|
||||
* specific language governing permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
#include "CServer.h"
|
||||
#include "CServantImp.h"
|
||||
#include "HelloServer.h"
|
||||
#include "HelloImp.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
CServer g_app;
|
||||
HelloServer g_app;
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
void CServer::initialize()
|
||||
void
|
||||
HelloServer::initialize()
|
||||
{
|
||||
//initialize application here:
|
||||
//...
|
||||
//...
|
||||
|
||||
addServant<CServantImp>(ServerConfig::Application + "." + ServerConfig::ServerName + ".CServantObj");
|
||||
addServant<HelloImp>(ServerConfig::Application + "." + ServerConfig::ServerName + ".HelloObj");
|
||||
}
|
||||
/////////////////////////////////////////////////////////////////
|
||||
void CServer::destroyApp()
|
||||
void
|
||||
HelloServer::destroyApp()
|
||||
{
|
||||
//destroy application here:
|
||||
//...
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
int main(int argc, char* argv[])
|
||||
int
|
||||
main(int argc, char* argv[])
|
||||
{
|
||||
try
|
||||
{
|
@ -14,8 +14,8 @@
|
||||
* specific language governing permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef _BServer_H_
|
||||
#define _BServer_H_
|
||||
#ifndef _HelloServer_H_
|
||||
#define _HelloServer_H_
|
||||
|
||||
#include <iostream>
|
||||
#include "servant/Application.h"
|
||||
@ -25,13 +25,13 @@ using namespace tars;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
class BServer : public Application
|
||||
class HelloServer : public Application
|
||||
{
|
||||
public:
|
||||
/**
|
||||
*
|
||||
**/
|
||||
virtual ~BServer() {};
|
||||
virtual ~HelloServer() {};
|
||||
|
||||
/**
|
||||
*
|
||||
@ -42,11 +42,9 @@ public:
|
||||
*
|
||||
**/
|
||||
virtual void destroyApp();
|
||||
protected:
|
||||
bool cmdprofile(const string& command, const string& params, string& result);
|
||||
};
|
||||
|
||||
extern BServer g_app;
|
||||
extern HelloServer g_app;
|
||||
|
||||
////////////////////////////////////////////
|
||||
#endif
|
70
examples/QuickStartDemo/HelloServer/Server/config.conf
Executable file
70
examples/QuickStartDemo/HelloServer/Server/config.conf
Executable file
@ -0,0 +1,70 @@
|
||||
<tars>
|
||||
<application>
|
||||
<client>
|
||||
#tarsregistry locator
|
||||
locator = tars.tarsregistry.QueryObj@tcp -h 127.0.0.1 -p 17890
|
||||
#max invoke timeout
|
||||
max-invoke-timeout = 5000
|
||||
#refresh endpoint interval
|
||||
refresh-endpoint-interval = 10000
|
||||
#stat obj
|
||||
stat = tars.tarsstat.StatObj
|
||||
#max send queue length limit
|
||||
sendqueuelimit = 100000
|
||||
#async queue length limit
|
||||
asyncqueuecap = 100000
|
||||
#async callback thread num
|
||||
asyncthread = 3
|
||||
#net thread
|
||||
netthread = 1
|
||||
#merge net and sync thread
|
||||
mergenetasync = 0
|
||||
#module name
|
||||
modulename = TestApp.HelloServer
|
||||
</client>
|
||||
|
||||
<server>
|
||||
#not cout
|
||||
closecout = 0
|
||||
#app name
|
||||
app = TestApp
|
||||
#server name
|
||||
server = HelloServer
|
||||
#path
|
||||
basepath = ./
|
||||
datapath = ./
|
||||
#log path
|
||||
logpath = ./
|
||||
#merge net and imp thread
|
||||
mergenetimp = 0
|
||||
#local ip, for tarsnode
|
||||
# local = tcp -h 127.0.0.1 -p 15001 -t 10000
|
||||
|
||||
#tarsnode
|
||||
# node = ServerObj@tcp -h 127.0.0.1 -p 2345 -t 10000
|
||||
#config obj
|
||||
# config = tars.tarsconfig.ConfigObj
|
||||
#notify obj
|
||||
# notify = tars.tarsconfig.NotifyObj
|
||||
#log obj
|
||||
# log = tars.tarslog.LogObj
|
||||
|
||||
<HelloAdapter>
|
||||
#ip:port:timeout
|
||||
endpoint = tcp -h 127.0.0.1 -p 8999 -t 10000
|
||||
#allow ip
|
||||
allow =
|
||||
#max connection num
|
||||
maxconns = 4096
|
||||
#imp thread num
|
||||
threads = 5
|
||||
#servant
|
||||
servant = TestApp.HelloServer.HelloObj
|
||||
#queue capacity
|
||||
queuecap = 1000000
|
||||
#tars protocol
|
||||
protocol = tars
|
||||
</HelloAdapter>
|
||||
</server>
|
||||
</application>
|
||||
</tars>
|
@ -1,12 +1,16 @@
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
APP := Test
|
||||
TARGET := AServer
|
||||
|
||||
APP := TestApp
|
||||
TARGET := HelloServer
|
||||
CONFIG :=
|
||||
STRIP_FLAG:= N
|
||||
|
||||
INCLUDE +=
|
||||
INCLUDE +=
|
||||
LIB +=
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
|
||||
include /usr/local/tars/cpp/makefile/makefile.tars
|
||||
|
||||
#-----------------------------------------------------------------------
|
471
examples/QuickStartDemo/ProxyServer/Server/Proxy.h
Normal file
471
examples/QuickStartDemo/ProxyServer/Server/Proxy.h
Normal file
@ -0,0 +1,471 @@
|
||||
// **********************************************************************
|
||||
// This file was generated by a TARS parser!
|
||||
// TARS version 1.4.0.
|
||||
// **********************************************************************
|
||||
|
||||
#ifndef __PROXY_H_
|
||||
#define __PROXY_H_
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "tup/Tars.h"
|
||||
#include "tup/TarsJson.h"
|
||||
using namespace std;
|
||||
#include "servant/ServantProxy.h"
|
||||
#include "servant/Servant.h"
|
||||
|
||||
|
||||
namespace TestApp
|
||||
{
|
||||
|
||||
/* callback of async proxy for client */
|
||||
class ProxyPrxCallback: public tars::ServantProxyCallback
|
||||
{
|
||||
public:
|
||||
virtual ~ProxyPrxCallback(){}
|
||||
virtual void callback_test(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_test() override incorrect."); }
|
||||
virtual void callback_test_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_test_exception() override incorrect."); }
|
||||
|
||||
virtual void callback_testProxy(tars::Int32 ret, const std::string& sRsp)
|
||||
{ throw std::runtime_error("callback_testProxy() override incorrect."); }
|
||||
virtual void callback_testProxy_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_testProxy_exception() override incorrect."); }
|
||||
|
||||
public:
|
||||
virtual const map<std::string, std::string> & getResponseContext() const
|
||||
{
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
if(!pCbtd->getContextValid())
|
||||
{
|
||||
throw TC_Exception("cann't get response context");
|
||||
}
|
||||
return pCbtd->getResponseContext();
|
||||
}
|
||||
|
||||
public:
|
||||
virtual int onDispatch(tars::ReqMessagePtr msg)
|
||||
{
|
||||
static ::std::string __Proxy_all[]=
|
||||
{
|
||||
"test",
|
||||
"testProxy"
|
||||
};
|
||||
pair<string*, string*> r = equal_range(__Proxy_all, __Proxy_all+2, string(msg->request.sFuncName));
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __Proxy_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_test_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_test(_ret);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testProxy_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sRsp;
|
||||
_is.read(sRsp, 2, true);
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_testProxy(_ret, sRsp);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
|
||||
};
|
||||
typedef tars::TC_AutoPtr<ProxyPrxCallback> ProxyPrxCallbackPtr;
|
||||
|
||||
/* callback of coroutine async proxy for client */
|
||||
class ProxyCoroPrxCallback: public ProxyPrxCallback
|
||||
{
|
||||
public:
|
||||
virtual ~ProxyCoroPrxCallback(){}
|
||||
public:
|
||||
virtual const map<std::string, std::string> & getResponseContext() const { return _mRspContext; }
|
||||
|
||||
virtual void setResponseContext(const map<std::string, std::string> &mContext) { _mRspContext = mContext; }
|
||||
|
||||
public:
|
||||
int onDispatch(tars::ReqMessagePtr msg)
|
||||
{
|
||||
static ::std::string __Proxy_all[]=
|
||||
{
|
||||
"test",
|
||||
"testProxy"
|
||||
};
|
||||
|
||||
pair<string*, string*> r = equal_range(__Proxy_all, __Proxy_all+2, string(msg->request.sFuncName));
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __Proxy_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_test_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_test(_ret);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_test_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_test_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testProxy_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sRsp;
|
||||
_is.read(sRsp, 2, true);
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_testProxy(_ret, sRsp);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_testProxy_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_testProxy_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
|
||||
protected:
|
||||
map<std::string, std::string> _mRspContext;
|
||||
};
|
||||
typedef tars::TC_AutoPtr<ProxyCoroPrxCallback> ProxyCoroPrxCallbackPtr;
|
||||
|
||||
/* proxy for client */
|
||||
class ProxyProxy : public tars::ServantProxy
|
||||
{
|
||||
public:
|
||||
typedef map<string, string> TARS_CONTEXT;
|
||||
tars::Int32 test(const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"test", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_test(ProxyPrxCallbackPtr callback,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"test", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_test(ProxyCoroPrxCallbackPtr callback,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"test", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
tars::Int32 testProxy(const std::string & sReq,std::string &sRsp,const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sReq, 1);
|
||||
_os.write(sRsp, 2);
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"testProxy", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
_is.read(sRsp, 2, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_testProxy(ProxyPrxCallbackPtr callback,const std::string &sReq,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sReq, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testProxy", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_testProxy(ProxyCoroPrxCallbackPtr callback,const std::string &sReq,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sReq, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testProxy", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
ProxyProxy* tars_hash(int64_t key)
|
||||
{
|
||||
return (ProxyProxy*)ServantProxy::tars_hash(key);
|
||||
}
|
||||
|
||||
ProxyProxy* tars_consistent_hash(int64_t key)
|
||||
{
|
||||
return (ProxyProxy*)ServantProxy::tars_consistent_hash(key);
|
||||
}
|
||||
|
||||
ProxyProxy* tars_set_timeout(int msecond)
|
||||
{
|
||||
return (ProxyProxy*)ServantProxy::tars_set_timeout(msecond);
|
||||
}
|
||||
|
||||
static const char* tars_prxname() { return "ProxyProxy"; }
|
||||
};
|
||||
typedef tars::TC_AutoPtr<ProxyProxy> ProxyPrx;
|
||||
|
||||
/* servant for server */
|
||||
class Proxy : public tars::Servant
|
||||
{
|
||||
public:
|
||||
virtual ~Proxy(){}
|
||||
virtual tars::Int32 test(tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_test(tars::TarsCurrentPtr current, tars::Int32 _ret)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
virtual tars::Int32 testProxy(const std::string & sReq,std::string &sRsp,tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_testProxy(tars::TarsCurrentPtr current, tars::Int32 _ret, const std::string &sRsp)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sRsp", sRsp);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
_os.write(sRsp, 2);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
int onDispatch(tars::TarsCurrentPtr _current, vector<char> &_sResponseBuffer)
|
||||
{
|
||||
static ::std::string __TestApp__Proxy_all[]=
|
||||
{
|
||||
"test",
|
||||
"testProxy"
|
||||
};
|
||||
|
||||
pair<string*, string*> r = equal_range(__TestApp__Proxy_all, __TestApp__Proxy_all+2, _current->getFuncName());
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __TestApp__Proxy_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
tars::Int32 _ret = test(_current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
std::string sReq;
|
||||
std::string sRsp;
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
tarsAttr.get("sReq", sReq);
|
||||
tarsAttr.getByDefault("sRsp", sRsp, sRsp);
|
||||
}
|
||||
else
|
||||
{
|
||||
_is.read(sReq, 1, true);
|
||||
_is.read(sRsp, 2, false);
|
||||
}
|
||||
tars::Int32 _ret = testProxy(sReq,sRsp, _current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sRsp", sRsp);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.write(sRsp, 2);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
@ -14,12 +14,13 @@
|
||||
* specific language governing permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
module Test
|
||||
module TestApp
|
||||
{
|
||||
|
||||
interface BServant
|
||||
interface Proxy
|
||||
{
|
||||
int queryResult(string sIn, out string sOut);
|
||||
int test();
|
||||
int testProxy(string sReq, out string sRsp);
|
||||
};
|
||||
|
||||
};
|
83
examples/QuickStartDemo/ProxyServer/Server/ProxyImp.cpp
Normal file
83
examples/QuickStartDemo/ProxyServer/Server/ProxyImp.cpp
Normal file
@ -0,0 +1,83 @@
|
||||
/**
|
||||
* Tencent is pleased to support the open source community by making Tars available.
|
||||
*
|
||||
* Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
|
||||
*
|
||||
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* https://opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "ProxyImp.h"
|
||||
#include "ProxyServer.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace tars;
|
||||
|
||||
class HelloCallback : public HelloPrxCallback
|
||||
{
|
||||
|
||||
public:
|
||||
HelloCallback(TarsCurrentPtr ¤t)
|
||||
: _current(current)
|
||||
{}
|
||||
|
||||
virtual void callback_testHello(tars::Int32 ret, const std::string& sOut)
|
||||
{
|
||||
Proxy::async_response_testProxy(_current, ret, sOut);
|
||||
}
|
||||
virtual void callback_testHello_exception(tars::Int32 ret)
|
||||
{
|
||||
TLOGERROR("HelloCallback callback_testHello_exception ret:" << ret << endl);
|
||||
|
||||
Proxy::async_response_testProxy(_current, ret, "");
|
||||
}
|
||||
|
||||
TarsCurrentPtr _current;
|
||||
};
|
||||
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////
|
||||
void ProxyImp::initialize()
|
||||
{
|
||||
//initialize servant here:
|
||||
//...
|
||||
|
||||
_prx = Application::getCommunicator()->stringToProxy<HelloPrx>("TestApp.HelloServer.HelloObj");
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////
|
||||
void ProxyImp::destroy()
|
||||
{
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////
|
||||
tars::Int32 ProxyImp::test(tars::TarsCurrentPtr current) { return 0;}
|
||||
|
||||
//////////////////////////////////////////////////////
|
||||
tars::Int32 ProxyImp::testProxy(const std::string& sIn, std::string &sOut, tars::TarsCurrentPtr current)
|
||||
{
|
||||
try
|
||||
{
|
||||
current->setResponse(false);
|
||||
|
||||
TestApp::HelloPrxCallbackPtr cb = new HelloCallback(current);
|
||||
|
||||
_prx->tars_set_timeout(3000)->async_testHello(cb,sIn);
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
current->setResponse(true);
|
||||
|
||||
TLOGERROR("ProxyImp::testProxy ex:" << ex.what() << endl);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
@ -14,26 +14,49 @@
|
||||
* specific language governing permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef _BServantImp_H_
|
||||
#define _BServantImp_H_
|
||||
#ifndef __PROXY_IMP_H_
|
||||
#define __PROXY_IMP_H_
|
||||
|
||||
#include "servant/Application.h"
|
||||
#include "BServant.h"
|
||||
#include "promise/promise.h"
|
||||
#include "Hello.h"
|
||||
#include "Proxy.h"
|
||||
|
||||
using namespace Test;
|
||||
using namespace TestApp;
|
||||
|
||||
class BServantImp : public Test::BServant
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
class ProxyImp : public TestApp::Proxy
|
||||
{
|
||||
public:
|
||||
/**
|
||||
*
|
||||
*/
|
||||
virtual ~ProxyImp() {}
|
||||
|
||||
virtual ~BServantImp() {}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
virtual void initialize();
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
virtual void destroy();
|
||||
|
||||
tars::Int32 queryResult(const std::string& sIn, std::string &sOut, tars::TarsCurrentPtr current);
|
||||
/**
|
||||
*
|
||||
*/
|
||||
virtual tars::Int32 test(tars::TarsCurrentPtr current);
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
virtual tars::Int32 testProxy(const std::string& sReq, std::string &sRsp, tars::TarsCurrentPtr current);
|
||||
|
||||
private:
|
||||
HelloPrx _prx;
|
||||
|
||||
};
|
||||
/////////////////////////////////////////////////////
|
@ -14,30 +14,30 @@
|
||||
* specific language governing permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
#include "BServer.h"
|
||||
#include "BServantImp.h"
|
||||
#include "ProxyServer.h"
|
||||
#include "ProxyImp.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
BServer g_app;
|
||||
ProxyServer g_app;
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
void BServer::initialize()
|
||||
void ProxyServer::initialize()
|
||||
{
|
||||
//initialize application here:
|
||||
//...
|
||||
addServant<ProxyImp>(ServerConfig::Application + "." + ServerConfig::ServerName + ".ProxyObj");
|
||||
|
||||
addServant<BServantImp>(ServerConfig::Application + "." + ServerConfig::ServerName + ".BServantObj");
|
||||
}
|
||||
/////////////////////////////////////////////////////////////////
|
||||
void BServer::destroyApp()
|
||||
void ProxyServer::destroyApp()
|
||||
{
|
||||
//destroy application here:
|
||||
//...
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
int main(int argc, char* argv[])
|
||||
int
|
||||
main(int argc, char* argv[])
|
||||
{
|
||||
try
|
||||
{
|
@ -14,8 +14,8 @@
|
||||
* specific language governing permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef _BServer_H_
|
||||
#define _BServer_H_
|
||||
#ifndef __PROXY_SERVER_H_
|
||||
#define __PROXY_SERVER_H_
|
||||
|
||||
#include <iostream>
|
||||
#include "servant/Application.h"
|
||||
@ -25,13 +25,13 @@ using namespace tars;
|
||||
/**
|
||||
*
|
||||
**/
|
||||
class AServer : public Application
|
||||
class ProxyServer : public Application
|
||||
{
|
||||
public:
|
||||
/**
|
||||
*
|
||||
**/
|
||||
virtual ~AServer() {};
|
||||
virtual ~ProxyServer() {};
|
||||
|
||||
/**
|
||||
*
|
||||
@ -43,10 +43,10 @@ public:
|
||||
**/
|
||||
virtual void destroyApp();
|
||||
protected:
|
||||
bool cmdprofile(const string& command, const string& params, string& result);
|
||||
|
||||
};
|
||||
|
||||
extern AServer g_app;
|
||||
extern ProxyServer g_app;
|
||||
|
||||
////////////////////////////////////////////
|
||||
#endif
|
@ -1,13 +1,17 @@
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
APP := Test
|
||||
TARGET := myClientPromise
|
||||
|
||||
APP := TestApp
|
||||
TARGET := ProxyServer
|
||||
CONFIG :=
|
||||
STRIP_FLAG:= N
|
||||
TARS2CPP_FLAG:=
|
||||
|
||||
INCLUDE +=
|
||||
INCLUDE +=
|
||||
LIB +=
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
include /home/tarsproto/Test/AServer/AServer.mk
|
||||
include /home/tarsproto/TestApp/HelloServer/HelloServer.mk
|
||||
include /usr/local/tars/cpp/makefile/makefile.tars
|
||||
|
||||
#-----------------------------------------------------------------------
|
471
examples/StressDemo/TarsStressServer/Stress.h
Normal file
471
examples/StressDemo/TarsStressServer/Stress.h
Normal file
@ -0,0 +1,471 @@
|
||||
// **********************************************************************
|
||||
// This file was generated by a TARS parser!
|
||||
// TARS version 1.4.0.
|
||||
// **********************************************************************
|
||||
|
||||
#ifndef __STRESS_H_
|
||||
#define __STRESS_H_
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "tup/Tars.h"
|
||||
#include "tup/TarsJson.h"
|
||||
using namespace std;
|
||||
#include "servant/ServantProxy.h"
|
||||
#include "servant/Servant.h"
|
||||
|
||||
|
||||
namespace Test
|
||||
{
|
||||
|
||||
/* callback of async proxy for client */
|
||||
class StressPrxCallback: public tars::ServantProxyCallback
|
||||
{
|
||||
public:
|
||||
virtual ~StressPrxCallback(){}
|
||||
virtual void callback_test(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_test() override incorrect."); }
|
||||
virtual void callback_test_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_test_exception() override incorrect."); }
|
||||
|
||||
virtual void callback_testStr(tars::Int32 ret, const std::string& sOut)
|
||||
{ throw std::runtime_error("callback_testStr() override incorrect."); }
|
||||
virtual void callback_testStr_exception(tars::Int32 ret)
|
||||
{ throw std::runtime_error("callback_testStr_exception() override incorrect."); }
|
||||
|
||||
public:
|
||||
virtual const map<std::string, std::string> & getResponseContext() const
|
||||
{
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
if(!pCbtd->getContextValid())
|
||||
{
|
||||
throw TC_Exception("cann't get response context");
|
||||
}
|
||||
return pCbtd->getResponseContext();
|
||||
}
|
||||
|
||||
public:
|
||||
virtual int onDispatch(tars::ReqMessagePtr msg)
|
||||
{
|
||||
static ::std::string __Stress_all[]=
|
||||
{
|
||||
"test",
|
||||
"testStr"
|
||||
};
|
||||
pair<string*, string*> r = equal_range(__Stress_all, __Stress_all+2, string(msg->request.sFuncName));
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __Stress_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_test_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_test(_ret);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testStr_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
CallbackThreadData * pCbtd = CallbackThreadData::getData();
|
||||
assert(pCbtd != NULL);
|
||||
|
||||
pCbtd->setResponseContext(msg->response->context);
|
||||
|
||||
callback_testStr(_ret, sOut);
|
||||
|
||||
pCbtd->delResponseContext();
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
|
||||
};
|
||||
typedef tars::TC_AutoPtr<StressPrxCallback> StressPrxCallbackPtr;
|
||||
|
||||
/* callback of coroutine async proxy for client */
|
||||
class StressCoroPrxCallback: public StressPrxCallback
|
||||
{
|
||||
public:
|
||||
virtual ~StressCoroPrxCallback(){}
|
||||
public:
|
||||
virtual const map<std::string, std::string> & getResponseContext() const { return _mRspContext; }
|
||||
|
||||
virtual void setResponseContext(const map<std::string, std::string> &mContext) { _mRspContext = mContext; }
|
||||
|
||||
public:
|
||||
int onDispatch(tars::ReqMessagePtr msg)
|
||||
{
|
||||
static ::std::string __Stress_all[]=
|
||||
{
|
||||
"test",
|
||||
"testStr"
|
||||
};
|
||||
|
||||
pair<string*, string*> r = equal_range(__Stress_all, __Stress_all+2, string(msg->request.sFuncName));
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __Stress_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_test_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_test(_ret);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_test_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_test_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
if (msg->response->iRet != tars::TARSSERVERSUCCESS)
|
||||
{
|
||||
callback_testStr_exception(msg->response->iRet);
|
||||
|
||||
return msg->response->iRet;
|
||||
}
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
|
||||
_is.setBuffer(msg->response->sBuffer);
|
||||
try
|
||||
{
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
|
||||
std::string sOut;
|
||||
_is.read(sOut, 2, true);
|
||||
setResponseContext(msg->response->context);
|
||||
|
||||
callback_testStr(_ret, sOut);
|
||||
|
||||
}
|
||||
catch(std::exception &ex)
|
||||
{
|
||||
callback_testStr_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
callback_testStr_exception(tars::TARSCLIENTDECODEERR);
|
||||
|
||||
return tars::TARSCLIENTDECODEERR;
|
||||
}
|
||||
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
|
||||
protected:
|
||||
map<std::string, std::string> _mRspContext;
|
||||
};
|
||||
typedef tars::TC_AutoPtr<StressCoroPrxCallback> StressCoroPrxCallbackPtr;
|
||||
|
||||
/* proxy for client */
|
||||
class StressProxy : public tars::ServantProxy
|
||||
{
|
||||
public:
|
||||
typedef map<string, string> TARS_CONTEXT;
|
||||
tars::Int32 test(const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"test", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_test(StressPrxCallbackPtr callback,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"test", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_test(StressCoroPrxCallbackPtr callback,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"test", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
tars::Int32 testStr(const std::string & sIn,std::string &sOut,const map<string, string> &context = TARS_CONTEXT(),map<string, string> * pResponseContext = NULL)
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
_os.write(sOut, 2);
|
||||
std::map<string, string> _mStatus;
|
||||
shared_ptr<tars::ResponsePacket> rep = tars_invoke(tars::TARSNORMAL,"testStr", _os, context, _mStatus);
|
||||
if(pResponseContext)
|
||||
{
|
||||
pResponseContext->swap(rep->context);
|
||||
}
|
||||
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(rep->sBuffer);
|
||||
tars::Int32 _ret;
|
||||
_is.read(_ret, 0, true);
|
||||
_is.read(sOut, 2, true);
|
||||
return _ret;
|
||||
}
|
||||
|
||||
void async_testStr(StressPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testStr", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
void coro_testStr(StressCoroPrxCallbackPtr callback,const std::string &sIn,const map<string, string>& context = TARS_CONTEXT())
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(sIn, 1);
|
||||
std::map<string, string> _mStatus;
|
||||
tars_invoke_async(tars::TARSNORMAL,"testStr", _os, context, _mStatus, callback);
|
||||
}
|
||||
|
||||
StressProxy* tars_hash(int64_t key)
|
||||
{
|
||||
return (StressProxy*)ServantProxy::tars_hash(key);
|
||||
}
|
||||
|
||||
StressProxy* tars_consistent_hash(int64_t key)
|
||||
{
|
||||
return (StressProxy*)ServantProxy::tars_consistent_hash(key);
|
||||
}
|
||||
|
||||
StressProxy* tars_set_timeout(int msecond)
|
||||
{
|
||||
return (StressProxy*)ServantProxy::tars_set_timeout(msecond);
|
||||
}
|
||||
|
||||
static const char* tars_prxname() { return "StressProxy"; }
|
||||
};
|
||||
typedef tars::TC_AutoPtr<StressProxy> StressPrx;
|
||||
|
||||
/* servant for server */
|
||||
class Stress : public tars::Servant
|
||||
{
|
||||
public:
|
||||
virtual ~Stress(){}
|
||||
virtual tars::Int32 test(tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_test(tars::TarsCurrentPtr current, tars::Int32 _ret)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
virtual tars::Int32 testStr(const std::string & sIn,std::string &sOut,tars::TarsCurrentPtr current) = 0;
|
||||
static void async_response_testStr(tars::TarsCurrentPtr current, tars::Int32 _ret, const std::string &sOut)
|
||||
{
|
||||
if (current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
|
||||
vector<char> sTupResponseBuffer;
|
||||
tarsAttr.encode(sTupResponseBuffer);
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, sTupResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
|
||||
_os.write(sOut, 2);
|
||||
|
||||
current->sendResponse(tars::TARSSERVERSUCCESS, _os.getByteBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
int onDispatch(tars::TarsCurrentPtr _current, vector<char> &_sResponseBuffer)
|
||||
{
|
||||
static ::std::string __Test__Stress_all[]=
|
||||
{
|
||||
"test",
|
||||
"testStr"
|
||||
};
|
||||
|
||||
pair<string*, string*> r = equal_range(__Test__Stress_all, __Test__Stress_all+2, _current->getFuncName());
|
||||
if(r.first == r.second) return tars::TARSSERVERNOFUNCERR;
|
||||
switch(r.first - __Test__Stress_all)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
tars::Int32 _ret = test(_current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
tars::TarsInputStream<tars::BufferReader> _is;
|
||||
_is.setBuffer(_current->getRequestBuffer());
|
||||
std::string sIn;
|
||||
std::string sOut;
|
||||
if (_current->getRequestVersion() == TUPVERSION)
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.decode(_current->getRequestBuffer());
|
||||
tarsAttr.get("sIn", sIn);
|
||||
tarsAttr.getByDefault("sOut", sOut, sOut);
|
||||
}
|
||||
else
|
||||
{
|
||||
_is.read(sIn, 1, true);
|
||||
_is.read(sOut, 2, false);
|
||||
}
|
||||
tars::Int32 _ret = testStr(sIn,sOut, _current);
|
||||
if(_current->isResponse())
|
||||
{
|
||||
if (_current->getRequestVersion() == TUPVERSION )
|
||||
{
|
||||
UniAttribute<tars::BufferWriterVector, tars::BufferReader> tarsAttr;
|
||||
tarsAttr.setVersion(_current->getRequestVersion());
|
||||
tarsAttr.put("", _ret);
|
||||
tarsAttr.put("sOut", sOut);
|
||||
tarsAttr.encode(_sResponseBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
tars::TarsOutputStream<tars::BufferWriterVector> _os;
|
||||
_os.write(_ret, 0);
|
||||
_os.write(sOut, 2);
|
||||
_os.swap(_sResponseBuffer);
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERSUCCESS;
|
||||
|
||||
}
|
||||
}
|
||||
return tars::TARSSERVERNOFUNCERR;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
17
examples/scripts/run-quick-start.sh
Normal file
17
examples/scripts/run-quick-start.sh
Normal file
@ -0,0 +1,17 @@
|
||||
#!/bin/bash
|
||||
|
||||
echo "run-quick-start.sh"
|
||||
|
||||
WORKDIR=$(pwd)
|
||||
|
||||
echo ${WORKDIR}
|
||||
|
||||
killall -9 QuickStartDemo
|
||||
|
||||
${WORKDIR}/../bin/QuickStartDemo --config=${WORKDIR}/../../examples/QuickStartDemo/HelloServer/Server/config.conf &
|
||||
|
||||
sleep 3
|
||||
|
||||
${WORKDIR}/../bin/QuickStartDemoClient
|
||||
|
||||
|
@ -1,235 +0,0 @@
|
||||
/**
|
||||
* Tencent is pleased to support the open source community by making Tars available.
|
||||
*
|
||||
* Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
|
||||
*
|
||||
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* https://opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
* 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 __TARS_PROMISE_EXCEPTION_PTR_H_
|
||||
#define __TARS_PROMISE_EXCEPTION_PTR_H_
|
||||
|
||||
// #include "util/tc_shared_ptr.h"
|
||||
#include "promise_exception.h"
|
||||
#include <stdexcept>
|
||||
#include <new>
|
||||
#include <typeinfo>
|
||||
#include <string>
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace tars
|
||||
{
|
||||
namespace detail
|
||||
{
|
||||
class ExceptionBase : public std::exception
|
||||
{
|
||||
public:
|
||||
ExceptionBase() {}
|
||||
|
||||
virtual ~ExceptionBase() throw() {}
|
||||
|
||||
virtual ExceptionBase* clone() const { return new ExceptionBase(*this); }
|
||||
|
||||
virtual void rethrow() const { throw *this; }
|
||||
|
||||
virtual const char* what() const throw() { return "ExceptionBase"; }
|
||||
|
||||
virtual int getErrCode() const { return -1; }
|
||||
};
|
||||
|
||||
class ExceptionBaseImpl : public ExceptionBase
|
||||
{
|
||||
public:
|
||||
ExceptionBaseImpl() {}
|
||||
|
||||
ExceptionBaseImpl(const std::string& s)
|
||||
: _sInfo(s)
|
||||
, _error(-1)
|
||||
{}
|
||||
|
||||
ExceptionBaseImpl(const std::string& s, int err)
|
||||
: _sInfo(s)
|
||||
, _error(err)
|
||||
{}
|
||||
|
||||
virtual ~ExceptionBaseImpl() throw() {}
|
||||
|
||||
virtual ExceptionBase* clone() const
|
||||
{
|
||||
return new ExceptionBaseImpl(*this);
|
||||
}
|
||||
|
||||
virtual void rethrow() const
|
||||
{
|
||||
throw *this;
|
||||
}
|
||||
|
||||
virtual const char* what() const throw()
|
||||
{
|
||||
return _sInfo.c_str();
|
||||
}
|
||||
|
||||
virtual int getErrCode() const
|
||||
{
|
||||
return _error;
|
||||
}
|
||||
private:
|
||||
std::string _sInfo;
|
||||
int _error;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
typedef shared_ptr<detail::ExceptionBase> ExceptionPtr;
|
||||
|
||||
class CurrentExceptionUnknownException : PromiseException
|
||||
{
|
||||
private:
|
||||
|
||||
const char *name() const
|
||||
{
|
||||
return "CurrentExceptionUnknownException";
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
inline ExceptionPtr currentException()
|
||||
{
|
||||
try
|
||||
{
|
||||
try
|
||||
{
|
||||
throw;
|
||||
}
|
||||
catch (detail::ExceptionBaseImpl& e)
|
||||
{
|
||||
return ExceptionPtr(e.clone());
|
||||
}
|
||||
catch (detail::ExceptionBase& e)
|
||||
{
|
||||
return ExceptionPtr(e.clone());
|
||||
}
|
||||
catch (std::domain_error& e)
|
||||
{
|
||||
return ExceptionPtr(new detail::ExceptionBaseImpl(string(e.what(), strlen(e.what())) ));
|
||||
}
|
||||
catch (std::invalid_argument& e)
|
||||
{
|
||||
return ExceptionPtr(new detail::ExceptionBaseImpl(string(e.what(), strlen(e.what())) ));
|
||||
}
|
||||
catch (std::length_error& e)
|
||||
{
|
||||
return ExceptionPtr(new detail::ExceptionBaseImpl(string(e.what(), strlen(e.what())) ));
|
||||
}
|
||||
catch (std::out_of_range& e)
|
||||
{
|
||||
return ExceptionPtr(new detail::ExceptionBaseImpl(string(e.what(), strlen(e.what())) ));
|
||||
}
|
||||
catch (std::range_error& e)
|
||||
{
|
||||
return ExceptionPtr(new detail::ExceptionBaseImpl(string(e.what(), strlen(e.what())) ));
|
||||
}
|
||||
catch (std::overflow_error& e)
|
||||
{
|
||||
return ExceptionPtr(new detail::ExceptionBaseImpl(string(e.what(), strlen(e.what())) ));
|
||||
}
|
||||
catch (std::underflow_error& e)
|
||||
{
|
||||
return ExceptionPtr(new detail::ExceptionBaseImpl(string(e.what(), strlen(e.what())) ));
|
||||
}
|
||||
catch (std::logic_error& e)
|
||||
{
|
||||
return ExceptionPtr(new detail::ExceptionBaseImpl(string(e.what(), strlen(e.what())) ));
|
||||
}
|
||||
catch (std::bad_alloc& e)
|
||||
{
|
||||
return ExceptionPtr(new detail::ExceptionBaseImpl(string(e.what(), strlen(e.what())) ));
|
||||
}
|
||||
catch (std::bad_cast& e)
|
||||
{
|
||||
return ExceptionPtr(new detail::ExceptionBaseImpl(string(e.what(), strlen(e.what())) ));
|
||||
}
|
||||
catch (std::bad_typeid& e)
|
||||
{
|
||||
return ExceptionPtr(new detail::ExceptionBaseImpl(string(e.what(), strlen(e.what())) ));
|
||||
}
|
||||
catch (std::bad_exception& e)
|
||||
{
|
||||
return ExceptionPtr(new detail::ExceptionBaseImpl(string(e.what(), strlen(e.what())) ));
|
||||
}
|
||||
catch (PromiseException& e)
|
||||
{
|
||||
return ExceptionPtr(new detail::ExceptionBaseImpl(string(e.what(), strlen(e.what())) ));
|
||||
}
|
||||
catch (std::exception& e)
|
||||
{
|
||||
return ExceptionPtr(new detail::ExceptionBaseImpl(string(e.what(), strlen(e.what())) ));
|
||||
}
|
||||
}
|
||||
catch (std::bad_alloc& e)
|
||||
{
|
||||
//return detail::ExceptionPtrStaticExceptionObject<std::bad_alloc>::e;
|
||||
return ExceptionPtr(new detail::ExceptionBaseImpl(string(e.what(), strlen(e.what())) ));
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
//return detail::ExceptionPtrStaticExceptionObject<CurrentExceptionUnknownException>::e;
|
||||
return ExceptionPtr(new detail::ExceptionBaseImpl(string("PromiseUnknownException") ));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline detail::ExceptionBaseImpl enableCurrentException(const string& t)
|
||||
{
|
||||
return detail::ExceptionBaseImpl(t);
|
||||
}
|
||||
|
||||
inline detail::ExceptionBaseImpl enableCurrentException(const string& t, int err)
|
||||
{
|
||||
return detail::ExceptionBaseImpl(t, err);
|
||||
}
|
||||
|
||||
template <typename E>
|
||||
inline void throwException(const E& e)
|
||||
{
|
||||
throw enableCurrentException(string(e.what(), strlen(e.what())));
|
||||
}
|
||||
|
||||
inline ExceptionPtr copyException(const string& e)
|
||||
{
|
||||
try
|
||||
{
|
||||
throw enableCurrentException(e);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
return currentException();
|
||||
}
|
||||
}
|
||||
|
||||
inline ExceptionPtr copyException(const string& e, int err)
|
||||
{
|
||||
try
|
||||
{
|
||||
throw enableCurrentException(e, err);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
return currentException();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace promise
|
||||
|
||||
#endif // __EXCEPTION_PTR_H__
|
@ -1,904 +0,0 @@
|
||||
/**
|
||||
* Tencent is pleased to support the open source community by making Tars available.
|
||||
*
|
||||
* Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
|
||||
*
|
||||
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* https://opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
* 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 __TARS_PROMISE_H_
|
||||
#define __TARS_PROMISE_H_
|
||||
|
||||
// #include "util/tc_callback.h"
|
||||
#include "exception_ptr.h"
|
||||
#include <pthread.h>
|
||||
#include <list>
|
||||
#include "promise_exception.h"
|
||||
// #include "util/tc_bind.h"
|
||||
// #include "util/tc_enable_shared_from_this.h"
|
||||
// #include "util/detail/assert.h"
|
||||
// #include "util/detail/tc_template_util.h"
|
||||
#include "util/tc_monitor.h"
|
||||
|
||||
// using namespace tars;
|
||||
|
||||
namespace tars
|
||||
{
|
||||
|
||||
class PromiseAlreadySatisfiedException : public PromiseException
|
||||
{
|
||||
public:
|
||||
|
||||
PromiseAlreadySatisfiedException(const char *filename, int line)
|
||||
: PromiseException(filename, line)
|
||||
{}
|
||||
|
||||
protected:
|
||||
|
||||
virtual const char *name() const
|
||||
{
|
||||
return "PromiseAlreadySatisfiedException";
|
||||
}
|
||||
};
|
||||
|
||||
class FutureUninitializedException : public PromiseException
|
||||
{
|
||||
public:
|
||||
FutureUninitializedException(const char *filename, int line)
|
||||
: PromiseException(filename, line)
|
||||
{}
|
||||
|
||||
protected:
|
||||
virtual const char *name() const
|
||||
{
|
||||
return "FutureUninitializedException";
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T> class Future;
|
||||
|
||||
template <typename T> struct is_future_type : std::false_type {};
|
||||
template <typename T> struct is_future_type<Future<T> > : std::true_type {};
|
||||
|
||||
template <typename T> class Promise;
|
||||
|
||||
namespace detail
|
||||
{
|
||||
template <typename T>
|
||||
struct resolved_type
|
||||
{
|
||||
typedef T type;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct resolved_type<Future<T> >
|
||||
{
|
||||
typedef T type;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct FutureTraits
|
||||
{
|
||||
// typedef TC_ScopedPtr<T> storage_type;
|
||||
typedef std::unique_ptr<T> storage_type;
|
||||
typedef const T& rvalue_source_type;
|
||||
typedef const T& move_dest_type;
|
||||
typedef T& dest_reference_type;
|
||||
|
||||
static void init(storage_type& storage, rvalue_source_type t)
|
||||
{
|
||||
storage.reset(new T(t));
|
||||
}
|
||||
|
||||
static void assign(dest_reference_type dest, const storage_type& storage)
|
||||
{
|
||||
dest = *storage;
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct FutureTraits<T&>
|
||||
{
|
||||
typedef T* storage_type;
|
||||
typedef T& rvalue_source_type;
|
||||
typedef T& move_dest_type;
|
||||
typedef T*& dest_reference_type;
|
||||
|
||||
static void init(storage_type& storage, T& t)
|
||||
{
|
||||
storage = &t;
|
||||
}
|
||||
|
||||
static void assign(dest_reference_type dest, const storage_type& storage)
|
||||
{
|
||||
dest = storage;
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct FutureTraits<void>
|
||||
{
|
||||
typedef void rvalue_source_type;
|
||||
typedef void move_dest_type;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class FutureObjectInterface
|
||||
{
|
||||
public:
|
||||
typedef typename FutureTraits<T>::rvalue_source_type rvalue_source_type;
|
||||
typedef typename FutureTraits<T>::move_dest_type move_dest_type;
|
||||
typedef typename FutureTraits<T>::dest_reference_type dest_reference_type;
|
||||
typedef std::function<void(const std::shared_ptr<FutureObjectInterface>&)> CallbackType;
|
||||
|
||||
virtual ~FutureObjectInterface() {}
|
||||
|
||||
virtual bool isDone() const = 0;
|
||||
virtual bool hasValue() const = 0;
|
||||
virtual bool hasException() const = 0;
|
||||
virtual void setValue(rvalue_source_type v) = 0;
|
||||
virtual void setException(const ExceptionPtr& e) = 0;
|
||||
virtual move_dest_type get() const = 0;
|
||||
virtual bool tryGet(dest_reference_type v) const = 0;
|
||||
virtual void registerCallback(const CallbackType& callback) = 0;
|
||||
};
|
||||
|
||||
template <>
|
||||
class FutureObjectInterface<void>
|
||||
{
|
||||
public:
|
||||
typedef FutureTraits<void>::move_dest_type move_dest_type;
|
||||
typedef std::function<void(const std::shared_ptr<FutureObjectInterface>&)> CallbackType;
|
||||
|
||||
virtual ~FutureObjectInterface() {}
|
||||
|
||||
virtual bool isDone() const = 0;
|
||||
virtual bool hasValue() const = 0;
|
||||
virtual bool hasException() const = 0;
|
||||
virtual void set() = 0;
|
||||
virtual void setException(const ExceptionPtr& e) = 0;
|
||||
virtual move_dest_type get() const = 0;
|
||||
virtual void registerCallback(const CallbackType& callback) = 0;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class PromptFutureObject : public FutureObjectInterface<T>,
|
||||
public std::enable_shared_from_this<PromptFutureObject<T> >
|
||||
{
|
||||
public:
|
||||
typedef typename FutureObjectInterface<T>::move_dest_type move_dest_type;
|
||||
typedef typename FutureObjectInterface<T>::rvalue_source_type rvalue_source_type;
|
||||
typedef typename FutureObjectInterface<T>::dest_reference_type dest_reference_type;
|
||||
typedef typename FutureObjectInterface<T>::CallbackType CallbackType;
|
||||
|
||||
PromptFutureObject(rvalue_source_type v)
|
||||
{
|
||||
FutureTraits<T>::init(m_value, v);
|
||||
}
|
||||
|
||||
PromptFutureObject(const ExceptionPtr& e)
|
||||
: m_exception_ptr(e)
|
||||
{}
|
||||
|
||||
virtual ~PromptFutureObject() {}
|
||||
|
||||
virtual bool isDone() const { return true; }
|
||||
|
||||
virtual bool hasValue() const
|
||||
{
|
||||
if (m_exception_ptr)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool hasException() const { return !!m_exception_ptr; }
|
||||
|
||||
virtual void setValue(rvalue_source_type /*v*/) {}
|
||||
virtual void setException(const ExceptionPtr& /*e*/) {}
|
||||
|
||||
virtual move_dest_type get() const
|
||||
{
|
||||
assert(m_exception_ptr || m_value);
|
||||
if (m_exception_ptr)
|
||||
m_exception_ptr->rethrow();
|
||||
return *m_value;
|
||||
}
|
||||
|
||||
virtual bool tryGet(dest_reference_type v) const { FutureTraits<T>::assign(v, m_value); return true; }
|
||||
|
||||
virtual void registerCallback(const CallbackType& callback)
|
||||
{
|
||||
assert(callback);
|
||||
try
|
||||
{
|
||||
callback(this->shared_from_this());
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
typename FutureTraits<T>::storage_type m_value;
|
||||
ExceptionPtr m_exception_ptr;
|
||||
};
|
||||
|
||||
template <>
|
||||
class PromptFutureObject<void> : public FutureObjectInterface<void>,
|
||||
public std::enable_shared_from_this<PromptFutureObject<void> >
|
||||
{
|
||||
public:
|
||||
typedef FutureObjectInterface<void>::move_dest_type move_dest_type;
|
||||
typedef FutureObjectInterface<void>::CallbackType CallbackType;
|
||||
|
||||
PromptFutureObject() {}
|
||||
|
||||
PromptFutureObject(const ExceptionPtr& e)
|
||||
: m_exception_ptr(e)
|
||||
{}
|
||||
|
||||
virtual ~PromptFutureObject() {}
|
||||
|
||||
virtual bool isDone() const { return true; }
|
||||
|
||||
virtual bool hasValue() const
|
||||
{
|
||||
if (m_exception_ptr)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool hasException() const { return (m_exception_ptr != NULL); }
|
||||
|
||||
virtual void set() {}
|
||||
virtual void setException(const ExceptionPtr& /*e*/) {}
|
||||
|
||||
virtual move_dest_type get() const
|
||||
{
|
||||
if (m_exception_ptr)
|
||||
m_exception_ptr->rethrow();
|
||||
}
|
||||
|
||||
virtual void registerCallback(const CallbackType& callback)
|
||||
{
|
||||
assert(callback);
|
||||
try
|
||||
{
|
||||
callback(this->shared_from_this());
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
ExceptionPtr m_exception_ptr;
|
||||
};
|
||||
|
||||
struct FutureObjectBase
|
||||
{
|
||||
FutureObjectBase()
|
||||
: m_is_done(false)
|
||||
{}
|
||||
|
||||
virtual ~FutureObjectBase() {}
|
||||
|
||||
bool isDone() const
|
||||
{
|
||||
TC_ThreadLock::Lock lock(m_monitor);
|
||||
return m_is_done;
|
||||
}
|
||||
|
||||
bool hasValue() const
|
||||
{
|
||||
TC_ThreadLock::Lock lock(m_monitor);
|
||||
return m_is_done && !m_exception_ptr;
|
||||
}
|
||||
|
||||
bool hasException() const
|
||||
{
|
||||
TC_ThreadLock::Lock lock(m_monitor);
|
||||
return m_is_done && m_exception_ptr;
|
||||
}
|
||||
|
||||
void markFinishedWithException(const ExceptionPtr& e)
|
||||
{
|
||||
assert(e);
|
||||
|
||||
TC_ThreadLock::Lock lock(m_monitor);
|
||||
if (m_is_done)
|
||||
{
|
||||
throw PromiseAlreadySatisfiedException(__FILE__, __LINE__);
|
||||
}
|
||||
m_exception_ptr = e;
|
||||
markFinishedInternal();
|
||||
}
|
||||
|
||||
void markFinishedInternal()
|
||||
{
|
||||
m_is_done = true;
|
||||
|
||||
m_monitor.notifyAll();
|
||||
}
|
||||
|
||||
void wait() const
|
||||
{
|
||||
{
|
||||
TC_ThreadLock::Lock lock(m_monitor);
|
||||
while(!m_is_done)
|
||||
{
|
||||
m_monitor.wait();
|
||||
}
|
||||
}
|
||||
|
||||
if (m_exception_ptr)
|
||||
m_exception_ptr->rethrow();
|
||||
}
|
||||
|
||||
TC_ThreadLock m_monitor;
|
||||
bool m_is_done;
|
||||
ExceptionPtr m_exception_ptr;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class FutureObject : public FutureObjectInterface<T>,
|
||||
public std::enable_shared_from_this<FutureObject<T> >,
|
||||
private FutureObjectBase
|
||||
{
|
||||
public:
|
||||
|
||||
typedef typename FutureObjectInterface<T>::move_dest_type move_dest_type;
|
||||
typedef typename FutureObjectInterface<T>::rvalue_source_type rvalue_source_type;
|
||||
typedef typename FutureObjectInterface<T>::CallbackType CallbackType;
|
||||
typedef typename FutureObjectInterface<T>::dest_reference_type dest_reference_type;
|
||||
|
||||
FutureObject() {}
|
||||
|
||||
virtual ~FutureObject() {}
|
||||
|
||||
virtual bool isDone() const
|
||||
{
|
||||
return FutureObjectBase::isDone();
|
||||
}
|
||||
|
||||
virtual bool hasValue() const
|
||||
{
|
||||
return FutureObjectBase::hasValue();
|
||||
}
|
||||
|
||||
virtual bool hasException() const
|
||||
{
|
||||
return FutureObjectBase::hasException();
|
||||
}
|
||||
|
||||
virtual move_dest_type get() const
|
||||
{
|
||||
wait();
|
||||
|
||||
assert(m_value);
|
||||
return *m_value;
|
||||
}
|
||||
|
||||
virtual bool tryGet(dest_reference_type v) const
|
||||
{
|
||||
if (!isDone())
|
||||
return false;
|
||||
if (m_exception_ptr)
|
||||
m_exception_ptr->rethrow();
|
||||
FutureTraits<T>::assign(v, m_value);
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual void setException(const ExceptionPtr& e)
|
||||
{
|
||||
markFinishedWithException(e);
|
||||
doPendingCallbacks();
|
||||
}
|
||||
|
||||
virtual void setValue(rvalue_source_type t)
|
||||
{
|
||||
{
|
||||
TC_ThreadLock::Lock lock(m_monitor);
|
||||
if (m_is_done)
|
||||
{
|
||||
throwException(PromiseAlreadySatisfiedException(__FILE__, __LINE__));
|
||||
}
|
||||
m_value.reset(new T(t));
|
||||
markFinishedInternal();
|
||||
}
|
||||
doPendingCallbacks();
|
||||
}
|
||||
|
||||
virtual void registerCallback(const CallbackType& callback)
|
||||
{
|
||||
assert(callback);
|
||||
|
||||
TC_ThreadLock::Lock lock(m_monitor);
|
||||
if (m_is_done)
|
||||
{
|
||||
lock.release();
|
||||
try
|
||||
{
|
||||
callback(this->shared_from_this());
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_pending_callbacks.push_back(callback);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
void doPendingCallbacks()
|
||||
{
|
||||
std::list<CallbackType> callbacks;
|
||||
{
|
||||
TC_ThreadLock::Lock lock(m_monitor);
|
||||
callbacks.swap(m_pending_callbacks);
|
||||
}
|
||||
|
||||
for (typename std::list<CallbackType>::const_iterator it = callbacks.begin(),
|
||||
end = callbacks.end();
|
||||
it != end; ++it)
|
||||
{
|
||||
try
|
||||
{
|
||||
(*it)(this->shared_from_this());
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
typename FutureTraits<T>::storage_type m_value;
|
||||
std::list<CallbackType> m_pending_callbacks;
|
||||
};
|
||||
|
||||
template <>
|
||||
class FutureObject<void> : public FutureObjectInterface<void>,
|
||||
public std::enable_shared_from_this<FutureObject<void> >,
|
||||
private FutureObjectBase
|
||||
{
|
||||
public:
|
||||
|
||||
using typename FutureObjectInterface<void>::CallbackType;
|
||||
|
||||
FutureObject() {}
|
||||
|
||||
virtual ~FutureObject() {}
|
||||
|
||||
virtual bool isDone() const
|
||||
{
|
||||
return FutureObjectBase::isDone();
|
||||
}
|
||||
|
||||
virtual bool hasValue() const
|
||||
{
|
||||
return FutureObjectBase::hasValue();
|
||||
}
|
||||
|
||||
virtual bool hasException() const
|
||||
{
|
||||
return FutureObjectBase::hasException();
|
||||
}
|
||||
|
||||
virtual void get() const
|
||||
{
|
||||
wait();
|
||||
}
|
||||
|
||||
virtual void set()
|
||||
{
|
||||
{
|
||||
TC_ThreadLock::Lock lock(m_monitor);
|
||||
if (m_is_done)
|
||||
{
|
||||
throwException(PromiseAlreadySatisfiedException(__FILE__, __LINE__));
|
||||
}
|
||||
markFinishedInternal();
|
||||
}
|
||||
|
||||
doPendingCallbacks();
|
||||
}
|
||||
|
||||
virtual void setException(const ExceptionPtr& e)
|
||||
{
|
||||
markFinishedWithException(e);
|
||||
doPendingCallbacks();
|
||||
}
|
||||
|
||||
void registerCallback(const CallbackType& callback)
|
||||
{
|
||||
assert(callback);
|
||||
|
||||
TC_ThreadLock::Lock lock(m_monitor);
|
||||
if (m_is_done)
|
||||
{
|
||||
lock.release();
|
||||
try
|
||||
{
|
||||
callback(this->shared_from_this());
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
|
||||
}
|
||||
return;
|
||||
}
|
||||
m_pending_callbacks.push_back(callback);
|
||||
}
|
||||
|
||||
private:
|
||||
void doPendingCallbacks()
|
||||
{
|
||||
std::list<CallbackType> callbacks;
|
||||
{
|
||||
TC_ThreadLock::Lock lock(m_monitor);
|
||||
callbacks.swap(m_pending_callbacks);
|
||||
}
|
||||
|
||||
for (std::list<CallbackType>::const_iterator it = callbacks.begin(),
|
||||
end = callbacks.end();
|
||||
it != end; ++it)
|
||||
{
|
||||
(*it)(this->shared_from_this());
|
||||
}
|
||||
}
|
||||
|
||||
std::list<CallbackType> m_pending_callbacks;
|
||||
};
|
||||
|
||||
template <typename R> class ForwardValue;
|
||||
|
||||
template <typename R, typename T>
|
||||
class SequentialCallback
|
||||
{
|
||||
private:
|
||||
typedef typename detail::resolved_type<R>::type value_type;
|
||||
typedef std::shared_ptr<detail::FutureObjectInterface<T> > FuturePtr;
|
||||
public:
|
||||
SequentialCallback(const std::function<R(const Future<T>&)>& callback,
|
||||
const Promise<value_type>& promise)
|
||||
: m_callback(callback)
|
||||
, m_promise(promise)
|
||||
{}
|
||||
|
||||
template <typename U>
|
||||
typename std::enable_if<std::is_void<U>::value >::type run(const FuturePtr& future)
|
||||
{
|
||||
try
|
||||
{
|
||||
m_callback(future);
|
||||
m_promise.set();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
m_promise.setException(currentException());
|
||||
}
|
||||
}
|
||||
|
||||
template <typename U>
|
||||
typename std::enable_if<!std::is_void<U>::value && !is_future_type<U>::value>::type
|
||||
run(const FuturePtr& future)
|
||||
{
|
||||
try
|
||||
{
|
||||
m_promise.setValue(m_callback(future));
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
m_promise.setException(currentException());
|
||||
}
|
||||
}
|
||||
|
||||
template <typename U>
|
||||
typename std::enable_if<is_future_type<U>::value >::type run(const FuturePtr& future)
|
||||
{
|
||||
try
|
||||
{
|
||||
m_callback(future).then(TC_Bind(&ForwardValue<value_type>::template run<value_type>,
|
||||
tc_owned(new ForwardValue<value_type>(m_promise))));
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
m_promise.setException(currentException());
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
std::function<R(const Future<T>&)> m_callback;
|
||||
Promise<value_type> m_promise;
|
||||
};
|
||||
|
||||
template <typename R>
|
||||
class ForwardValue
|
||||
{
|
||||
public:
|
||||
ForwardValue(const Promise<R>& promise)
|
||||
: m_promise(promise)
|
||||
{}
|
||||
|
||||
template <typename V>
|
||||
typename std::enable_if<std::is_void<V>::value >::type run(const Future<V>& future)
|
||||
{
|
||||
try
|
||||
{
|
||||
future.get();
|
||||
m_promise.set();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
m_promise.setException(currentException());
|
||||
}
|
||||
}
|
||||
|
||||
template <typename V>
|
||||
typename std::enable_if<!std::is_void<V>::value >::type run(const Future<V>& future)
|
||||
{
|
||||
try
|
||||
{
|
||||
m_promise.setValue(future.get());
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
m_promise.setException(currentException());
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
Promise<R> m_promise;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class FutureBase
|
||||
{
|
||||
private:
|
||||
typedef typename detail::FutureTraits<T>::move_dest_type move_dest_type;
|
||||
typedef typename detail::FutureTraits<T>::rvalue_source_type rvalue_source_type;
|
||||
public:
|
||||
typedef bool (FutureBase::*unspecified_bool_type)() const;
|
||||
|
||||
FutureBase() {}
|
||||
|
||||
FutureBase(const ExceptionPtr& e)
|
||||
: m_future(std::shared_ptr<detail::PromptFutureObject<T> >(new detail::PromptFutureObject<T>(e)))
|
||||
{}
|
||||
|
||||
virtual ~FutureBase() {}
|
||||
|
||||
move_dest_type get() const
|
||||
{
|
||||
if (!m_future)
|
||||
{
|
||||
throwException(FutureUninitializedException(__FILE__, __LINE__));
|
||||
}
|
||||
return m_future->get();
|
||||
}
|
||||
|
||||
bool isDone() const
|
||||
{
|
||||
if (!m_future)
|
||||
return false;
|
||||
return m_future && m_future->isDone();
|
||||
}
|
||||
|
||||
bool hasValue() const
|
||||
{
|
||||
if (!m_future)
|
||||
return false;
|
||||
return m_future && m_future->hasValue();
|
||||
}
|
||||
|
||||
bool hasException() const
|
||||
{
|
||||
if (!m_future)
|
||||
return false;
|
||||
return m_future && m_future->hasException();
|
||||
}
|
||||
|
||||
operator unspecified_bool_type() const
|
||||
{
|
||||
return m_future ? &FutureBase::isDone : NULL;
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
typedef std::shared_ptr<detail::FutureObjectInterface<T> > FuturePtr;
|
||||
|
||||
FutureBase(const FuturePtr& future)
|
||||
: m_future(future)
|
||||
{}
|
||||
|
||||
FuturePtr m_future;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template <typename T>
|
||||
class Future : public detail::FutureBase<T>
|
||||
{
|
||||
public:
|
||||
Future() {}
|
||||
|
||||
explicit Future(typename detail::FutureTraits<T>::rvalue_source_type t)
|
||||
: detail::FutureBase<T>(std::shared_ptr<detail::PromptFutureObject<T> >(new detail::PromptFutureObject<T>(t)))
|
||||
{}
|
||||
|
||||
Future(const ExceptionPtr& e)
|
||||
: detail::FutureBase<T>(e)
|
||||
{}
|
||||
|
||||
virtual ~Future() {}
|
||||
|
||||
template <typename R>
|
||||
Future<R> then(const std::function<R(const Future<T>&)>& callback) const
|
||||
{
|
||||
// typedef typename detail::resolved_type<R>::type value_type;
|
||||
|
||||
if (!this->m_future)
|
||||
{
|
||||
throwException(FutureUninitializedException(__FILE__, __LINE__));
|
||||
}
|
||||
|
||||
Promise<R> promise;
|
||||
shared_ptr<detail::SequentialCallback<R, T>> ptr(new detail::SequentialCallback<R, T>(callback, promise));
|
||||
|
||||
this->m_future->registerCallback(std::bind(&detail::SequentialCallback<R, T>::template run<R>, ptr));
|
||||
return promise.getFuture();
|
||||
}
|
||||
|
||||
|
||||
// template <typename R>
|
||||
// Future<typename detail::resolved_type<R>::type> then(const std::function<R(const Future<T>&)>& callback) const
|
||||
// {
|
||||
// typedef typename detail::resolved_type<R>::type value_type;
|
||||
|
||||
// if (!this->m_future)
|
||||
// {
|
||||
// throwException(FutureUninitializedException(__FILE__, __LINE__));
|
||||
// }
|
||||
|
||||
// Promise<value_type> promise;
|
||||
// this->m_future->registerCallback(TC_Bind(&detail::SequentialCallback<R, T>::template run<R>,
|
||||
// tc_owned(new detail::SequentialCallback<R, T>(callback, promise))));
|
||||
// return promise.getFuture();
|
||||
// }
|
||||
|
||||
private:
|
||||
|
||||
Future(const typename detail::FutureBase<T>::FuturePtr& future)
|
||||
: detail::FutureBase<T>(future)
|
||||
{}
|
||||
|
||||
template <typename R, typename U> friend class detail::SequentialCallback;
|
||||
friend class Promise<T>;
|
||||
};
|
||||
|
||||
template <>
|
||||
class Future<void> : public detail::FutureBase<void>
|
||||
{
|
||||
public:
|
||||
Future() {}
|
||||
|
||||
Future(const ExceptionPtr& e)
|
||||
: detail::FutureBase<void>(e)
|
||||
{}
|
||||
|
||||
virtual ~Future() {}
|
||||
|
||||
template <typename R>
|
||||
Future<typename detail::resolved_type<R>::type> then(const std::function<R(const Future<void>&)>& callback) const
|
||||
{
|
||||
typedef typename detail::resolved_type<R>::type value_type;
|
||||
|
||||
if (!this->m_future)
|
||||
{
|
||||
throwException(FutureUninitializedException(__FILE__, __LINE__));
|
||||
}
|
||||
|
||||
Promise<value_type> promise;
|
||||
this->m_future->registerCallback(TC_Bind(&detail::SequentialCallback<R, void>::template run<R>,
|
||||
tc_owned(new detail::SequentialCallback<R, void>(callback, promise))));
|
||||
return promise.getFuture();
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
Future(const detail::FutureBase<void>::FuturePtr& future)
|
||||
: detail::FutureBase<void>(future)
|
||||
{}
|
||||
|
||||
friend Future<void> makeFuture();
|
||||
|
||||
template <typename R, typename U> friend class detail::SequentialCallback;
|
||||
friend class Promise<void>;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
// typename std::disable_if<std::is_void<T>, Future<T> >::type
|
||||
typename std::enable_if<!std::is_void<T>::value, Future<T> >::type
|
||||
makeFuture(typename detail::FutureTraits<T>::rvalue_source_type t)
|
||||
{
|
||||
return Future<T>(t);
|
||||
}
|
||||
|
||||
inline Future<void> makeFuture()
|
||||
{
|
||||
return Future<void>(std::shared_ptr<detail::PromptFutureObject<void> >(new detail::PromptFutureObject<void>()));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
class Promise
|
||||
{
|
||||
public:
|
||||
|
||||
Promise()
|
||||
: m_future(std::shared_ptr<detail::FutureObject<T> >(new detail::FutureObject<T>()))
|
||||
{}
|
||||
|
||||
void setValue(typename detail::FutureTraits<T>::rvalue_source_type v)
|
||||
{
|
||||
assert(m_future);
|
||||
m_future->setValue(v);
|
||||
}
|
||||
|
||||
void setException(const ExceptionPtr& e)
|
||||
{
|
||||
m_future->setException(e);
|
||||
}
|
||||
|
||||
Future<T> getFuture() const
|
||||
{
|
||||
return Future<T>(m_future);
|
||||
}
|
||||
|
||||
private:
|
||||
std::shared_ptr<detail::FutureObjectInterface<T> > m_future;
|
||||
};
|
||||
|
||||
template <>
|
||||
class Promise<void>
|
||||
{
|
||||
private:
|
||||
std::shared_ptr<detail::FutureObjectInterface<void> > m_future;
|
||||
public:
|
||||
|
||||
Promise()
|
||||
: m_future(std::shared_ptr<detail::FutureObject<void> >(new detail::FutureObject<void>()))
|
||||
{}
|
||||
|
||||
void set()
|
||||
{
|
||||
assert(m_future);
|
||||
m_future->set();
|
||||
}
|
||||
|
||||
void setException(const ExceptionPtr& e)
|
||||
{
|
||||
m_future->setException(e);
|
||||
}
|
||||
|
||||
Future<void> getFuture() const
|
||||
{
|
||||
return Future<void>(m_future);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace promise
|
||||
|
||||
#endif // __TARS_PROMISE_H_
|
@ -1,200 +0,0 @@
|
||||
/**
|
||||
* Tencent is pleased to support the open source community by making Tars available.
|
||||
*
|
||||
* Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
|
||||
*
|
||||
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* https://opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
* 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 __TARS_PROMISE_EXCEPTION_H_
|
||||
#define __TARS_PROMISE_EXCEPTION_H_
|
||||
|
||||
#include <string.h>
|
||||
#include <exception>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <memory>
|
||||
// #include "util/tc_shared_ptr.h"
|
||||
// #include "util/detail/tc_template_util.h"
|
||||
|
||||
namespace tars
|
||||
{
|
||||
|
||||
class PromiseException : public std::exception
|
||||
{
|
||||
public:
|
||||
|
||||
PromiseException()
|
||||
: _filename(NULL)
|
||||
, _line(0)
|
||||
, _sep(':')
|
||||
{}
|
||||
|
||||
PromiseException(const char *filename, int line)
|
||||
: _filename(filename)
|
||||
, _line(line)
|
||||
, _sep(':')
|
||||
{}
|
||||
|
||||
virtual ~PromiseException() throw() {}
|
||||
|
||||
virtual const char *what() const throw()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!_what.unique())
|
||||
_what.reset(new std::string(*_what));
|
||||
|
||||
if (!_what || _what->empty())
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss << name() << " thrown";
|
||||
|
||||
if (_filename && _line > 0)
|
||||
ss << " at " << _filename << ':' << _line;
|
||||
|
||||
if (!_what)
|
||||
_what.reset(new std::string());
|
||||
|
||||
const std::string& s = getErrorInfo();
|
||||
if (!s.empty())
|
||||
{
|
||||
ss << _sep << ' ' << s;
|
||||
_sep = ';';
|
||||
}
|
||||
ss.str().swap(*_what);
|
||||
}
|
||||
|
||||
if (!_data.unique())
|
||||
_data.reset(new std::string(*_data));
|
||||
|
||||
if (_data && !_data->empty())
|
||||
{
|
||||
*_what += _sep;
|
||||
_sep = ';';
|
||||
*_what += ' ';
|
||||
_what->append(*_data);
|
||||
_data.reset();
|
||||
}
|
||||
return _what->c_str();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
virtual const char *name() const
|
||||
{
|
||||
return "PromiseException";
|
||||
}
|
||||
|
||||
virtual std::string getErrorInfo() const
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
const char *_filename;
|
||||
int _line;
|
||||
|
||||
mutable std::shared_ptr<std::string> _what;
|
||||
mutable std::shared_ptr<std::string> _data;
|
||||
mutable char _sep;
|
||||
|
||||
template <typename T>
|
||||
void injectErrorInfo(const T& t) const;
|
||||
|
||||
template <typename Exception, typename T>
|
||||
friend typename std::enable_if<std::is_base_of<Exception, PromiseException>::value, const Exception&>::type
|
||||
operator<<(const Exception& e, const T& t)
|
||||
{
|
||||
e.injectErrorInfo(t);
|
||||
return e;
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
void PromiseException::injectErrorInfo(const T& t) const
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss << t;
|
||||
|
||||
if (!_data.unique())
|
||||
_data.reset(new std::string(*_data));
|
||||
|
||||
if (!_data)
|
||||
{
|
||||
_data.reset(new std::string(ss.str()));
|
||||
}
|
||||
else
|
||||
{
|
||||
(*_data) += ss.str();
|
||||
}
|
||||
}
|
||||
|
||||
namespace detail
|
||||
{
|
||||
inline std::string errnoToString(int errorno)
|
||||
{
|
||||
return strerror(errorno);
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
|
||||
class SyscallException : public PromiseException
|
||||
{
|
||||
public:
|
||||
|
||||
SyscallException(const char *filename, int line, int err)
|
||||
: PromiseException(filename, line)
|
||||
, _errno(err)
|
||||
{}
|
||||
|
||||
int error() const { return _errno; }
|
||||
|
||||
protected:
|
||||
|
||||
virtual const char *name() const
|
||||
{
|
||||
return "SyscallException";
|
||||
}
|
||||
|
||||
virtual std::string getErrorInfo() const
|
||||
{
|
||||
return detail::errnoToString(_errno);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
int _errno;
|
||||
};
|
||||
|
||||
class AssertionFailureException : public PromiseException
|
||||
{
|
||||
public:
|
||||
AssertionFailureException(const char *filename, int line)
|
||||
: PromiseException(filename, line)
|
||||
{
|
||||
}
|
||||
|
||||
private:
|
||||
virtual const char *name() const
|
||||
{
|
||||
return "AssertionFailureException";
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace promise
|
||||
|
||||
#endif // __TARS_PROMISE_EXCEPTION_H__
|
@ -1,591 +0,0 @@
|
||||
#ifndef __TARS_PROMISE_TUPLE_H_
|
||||
#define __TARS_PROMISE_TUPLE_H_
|
||||
|
||||
// #include "util/detail/tc_assert.h"
|
||||
#include <ostream>
|
||||
|
||||
namespace tars
|
||||
{
|
||||
namespace detail
|
||||
{
|
||||
struct null_type {};
|
||||
|
||||
inline bool operator==(const null_type&, const null_type&)
|
||||
{ return true; }
|
||||
|
||||
inline bool operator!=(const null_type&, const null_type&)
|
||||
{ return false; }
|
||||
|
||||
inline bool operator<(const null_type&, const null_type&)
|
||||
{ return false; }
|
||||
|
||||
// A helper function to make a const temporary.
|
||||
inline const null_type make_null() { return null_type(); }
|
||||
|
||||
template <typename HT, typename TT>
|
||||
struct Cons
|
||||
{
|
||||
typedef HT head_type;
|
||||
typedef TT tail_type;
|
||||
|
||||
Cons()
|
||||
: head()
|
||||
, tail()
|
||||
{}
|
||||
|
||||
Cons(const head_type& h, const tail_type& t)
|
||||
: head(h)
|
||||
, tail(t)
|
||||
{}
|
||||
|
||||
template <typename T0, typename T1, typename T2, typename T3, typename T4,
|
||||
typename T5, typename T6, typename T7, typename T8, typename T9>
|
||||
Cons(T0& t0, T1& t1, T2& t2, T3& t3, T4& t4,
|
||||
T5& t5, T6& t6, T7& t7, T8& t8, T9& t9)
|
||||
: head(t0)
|
||||
, tail(t1, t2, t3, t4, t5, t6, t7, t8, t9, make_null())
|
||||
{}
|
||||
|
||||
template <typename HT2, typename TT2>
|
||||
Cons(const Cons<HT2, TT2>& o)
|
||||
: head(o.head)
|
||||
, tail(o.tail)
|
||||
{}
|
||||
|
||||
template <typename HT2, typename TT2>
|
||||
Cons& operator=(const Cons<HT2, TT2>& o)
|
||||
{
|
||||
head = o.head;
|
||||
tail = o.tail;
|
||||
return *this;
|
||||
}
|
||||
|
||||
void swap(const Cons& o)
|
||||
{
|
||||
std::swap(head, o.head);
|
||||
std::swap(tail, o.tail);
|
||||
}
|
||||
|
||||
// Because the C++ standard prohibits the function template partial
|
||||
// specialization, we have to define `operator==()' and `operator!=' as the
|
||||
// member function.
|
||||
|
||||
bool operator==(const Cons& o) const
|
||||
{
|
||||
return head == o.head && tail == o.tail;
|
||||
}
|
||||
|
||||
bool operator!=(const Cons& o) const
|
||||
{
|
||||
return !(operator==(o));
|
||||
}
|
||||
|
||||
bool operator<(const Cons& o) const
|
||||
{
|
||||
return (head < o.head) || (!(o.head < head) && tail < o.tail);
|
||||
}
|
||||
|
||||
head_type head;
|
||||
tail_type tail;
|
||||
};
|
||||
|
||||
template <typename HT>
|
||||
struct Cons<HT, null_type>
|
||||
{
|
||||
typedef HT head_type;
|
||||
typedef null_type tail_type;
|
||||
|
||||
Cons()
|
||||
: head()
|
||||
{}
|
||||
|
||||
template <typename T0>
|
||||
Cons(T0& t0, const null_type&, const null_type&, const null_type&, const null_type&,
|
||||
const null_type&, const null_type&, const null_type&, const null_type&, const null_type&)
|
||||
: head(t0)
|
||||
{}
|
||||
|
||||
template <typename HT2>
|
||||
Cons& operator=(const Cons<HT2, null_type>& o)
|
||||
{
|
||||
head = o.head;
|
||||
return *this;
|
||||
}
|
||||
|
||||
void swap(Cons& o)
|
||||
{
|
||||
std::swap(head, o.head);
|
||||
}
|
||||
|
||||
// Because the C++ standard prohibits the function template partial
|
||||
// specialization, we have to define `operator==()' and `operator!=' as the
|
||||
// member function.
|
||||
|
||||
bool operator==(const Cons& o) const
|
||||
{
|
||||
return head == o.head;
|
||||
}
|
||||
|
||||
bool operator!=(const Cons& o) const
|
||||
{
|
||||
return !(operator==(o));
|
||||
}
|
||||
|
||||
bool operator<(const Cons& o) const
|
||||
{
|
||||
return head < o.head;
|
||||
}
|
||||
|
||||
head_type head;
|
||||
};
|
||||
|
||||
template <typename T0, typename T1, typename T2, typename T3, typename T4,
|
||||
typename T5, typename T6, typename T7, typename T8, typename T9>
|
||||
struct map_tuple_to_cons
|
||||
{
|
||||
typedef Cons<T0, typename map_tuple_to_cons<T1, T2, T3, T4, T5, T6, T7, T8, T9, null_type>::type> type;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct map_tuple_to_cons<null_type, null_type, null_type, null_type, null_type,
|
||||
null_type, null_type, null_type, null_type, null_type>
|
||||
{
|
||||
typedef null_type type;
|
||||
};
|
||||
|
||||
// Gets the N-th tail of a tuple.
|
||||
template <int N, typename Tuple>
|
||||
struct drop_front
|
||||
{
|
||||
typedef typename drop_front<N-1, Tuple>::type::tail_type type;
|
||||
static const type& get_tail(const Tuple& tuple)
|
||||
{
|
||||
return drop_front<N-1, Tuple>::get_tail(tuple).tail;
|
||||
}
|
||||
};
|
||||
|
||||
template <typename Tuple>
|
||||
struct drop_front<0, Tuple>
|
||||
{
|
||||
typedef Tuple type;
|
||||
static const type& get_tail(const Tuple& tuple)
|
||||
{
|
||||
return tuple;
|
||||
}
|
||||
};
|
||||
|
||||
// Gets the type of the N-th element of a tuple.
|
||||
template <int N, typename Tuple>
|
||||
struct element
|
||||
{
|
||||
typedef typename drop_front<N, Tuple>::type::head_type type;
|
||||
};
|
||||
|
||||
// Gets the length of a tuple.
|
||||
template <typename Tuple>
|
||||
struct length
|
||||
{
|
||||
static const int value = length<typename Tuple::tail_type>::value + 1;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct length<null_type>
|
||||
{
|
||||
static const int value = 0;
|
||||
};
|
||||
|
||||
// Helper classes to print Cons.
|
||||
template <typename HT, typename TT>
|
||||
struct print_cons_helper
|
||||
{
|
||||
static std::ostream& print(std::ostream& o, const Cons<HT, TT>& cons)
|
||||
{
|
||||
o << cons.head;
|
||||
o << ", ";
|
||||
print_cons_helper<typename TT::head_type, typename TT::tail_type>::print(o, cons.tail);
|
||||
return o;
|
||||
}
|
||||
};
|
||||
|
||||
template <typename HT>
|
||||
struct print_cons_helper<HT, null_type>
|
||||
{
|
||||
static std::ostream& print(std::ostream& o, const Cons<HT, null_type>& cons)
|
||||
{
|
||||
o << cons.head;
|
||||
return o;
|
||||
}
|
||||
};
|
||||
|
||||
template <typename HT, typename TT>
|
||||
inline std::ostream& print_cons(std::ostream& o, const Cons<HT, TT>& cons)
|
||||
{
|
||||
return print_cons_helper<HT, TT>::print(o, cons);
|
||||
}
|
||||
|
||||
inline std::ostream& print_cons(std::ostream& o, const null_type&)
|
||||
{
|
||||
return o;
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template <typename T0 = detail::null_type, typename T1 = detail::null_type, typename T2 = detail::null_type,
|
||||
typename T3 = detail::null_type, typename T4 = detail::null_type, typename T5 = detail::null_type,
|
||||
typename T6 = detail::null_type, typename T7 = detail::null_type, typename T8 = detail::null_type,
|
||||
typename T9 = detail::null_type>
|
||||
class Tuple
|
||||
{
|
||||
private:
|
||||
typedef typename detail::map_tuple_to_cons<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>::type tuple_impl_type;
|
||||
|
||||
public:
|
||||
|
||||
// Returns the type of the N-th element of this tuple.
|
||||
template <int N>
|
||||
struct element
|
||||
{
|
||||
typedef typename detail::element<N, tuple_impl_type>::type type;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct access_traits
|
||||
{
|
||||
typedef const T& parameter_type;
|
||||
typedef const T& const_type;
|
||||
typedef T& non_const_type;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct access_traits<T&>
|
||||
{
|
||||
typedef T& parameter_type;
|
||||
typedef T& const_type;
|
||||
typedef T& non_const_type;
|
||||
};
|
||||
|
||||
// Number of elements of this tuple.
|
||||
enum
|
||||
{
|
||||
LENGTH = detail::length<tuple_impl_type>::value
|
||||
};
|
||||
|
||||
Tuple() {}
|
||||
|
||||
Tuple(typename access_traits<T0>::parameter_type t0)
|
||||
: m_tuple_impl(t0, detail::make_null(), detail::make_null(), detail::make_null(), detail::make_null(),
|
||||
detail::make_null(), detail::make_null(), detail::make_null(), detail::make_null(), detail::make_null())
|
||||
{}
|
||||
|
||||
Tuple(typename access_traits<T0>::parameter_type t0,
|
||||
typename access_traits<T1>::parameter_type t1)
|
||||
: m_tuple_impl(t0, t1, detail::make_null(), detail::make_null(), detail::make_null(),
|
||||
detail::make_null(), detail::make_null(), detail::make_null(), detail::make_null(), detail::make_null())
|
||||
{}
|
||||
|
||||
Tuple(typename access_traits<T0>::parameter_type t0,
|
||||
typename access_traits<T1>::parameter_type t1,
|
||||
typename access_traits<T2>::parameter_type t2)
|
||||
: m_tuple_impl(t0, t1, t2, detail::make_null(), detail::make_null(),
|
||||
detail::make_null(), detail::make_null(), detail::make_null(), detail::make_null(), detail::make_null())
|
||||
{}
|
||||
|
||||
Tuple(typename access_traits<T0>::parameter_type t0,
|
||||
typename access_traits<T1>::parameter_type t1,
|
||||
typename access_traits<T2>::parameter_type t2,
|
||||
typename access_traits<T3>::parameter_type t3)
|
||||
: m_tuple_impl(t0, t1, t2, t3, detail::make_null(), detail::make_null(), detail::make_null(), detail::make_null(),
|
||||
detail::make_null(), detail::make_null())
|
||||
{}
|
||||
|
||||
Tuple(typename access_traits<T0>::parameter_type t0,
|
||||
typename access_traits<T1>::parameter_type t1,
|
||||
typename access_traits<T2>::parameter_type t2,
|
||||
typename access_traits<T3>::parameter_type t3,
|
||||
typename access_traits<T4>::parameter_type t4)
|
||||
: m_tuple_impl(t0, t1, t2, t3, t4, detail::make_null(), detail::make_null(), detail::make_null(),
|
||||
detail::make_null(), detail::make_null())
|
||||
{}
|
||||
|
||||
Tuple(typename access_traits<T0>::parameter_type t0,
|
||||
typename access_traits<T1>::parameter_type t1,
|
||||
typename access_traits<T2>::parameter_type t2,
|
||||
typename access_traits<T3>::parameter_type t3,
|
||||
typename access_traits<T4>::parameter_type t4,
|
||||
typename access_traits<T5>::parameter_type t5)
|
||||
: m_tuple_impl(t0, t1, t2, t3, t4, t5, detail::make_null(), detail::make_null(),
|
||||
detail::make_null(), detail::make_null())
|
||||
{}
|
||||
|
||||
Tuple(typename access_traits<T0>::parameter_type t0,
|
||||
typename access_traits<T1>::parameter_type t1,
|
||||
typename access_traits<T2>::parameter_type t2,
|
||||
typename access_traits<T3>::parameter_type t3,
|
||||
typename access_traits<T4>::parameter_type t4,
|
||||
typename access_traits<T5>::parameter_type t5,
|
||||
typename access_traits<T6>::parameter_type t6)
|
||||
: m_tuple_impl(t0, t1, t2, t3, t4, t5, t6, detail::make_null(), detail::make_null(), detail::make_null())
|
||||
{}
|
||||
|
||||
Tuple(typename access_traits<T0>::parameter_type t0,
|
||||
typename access_traits<T1>::parameter_type t1,
|
||||
typename access_traits<T2>::parameter_type t2,
|
||||
typename access_traits<T3>::parameter_type t3,
|
||||
typename access_traits<T4>::parameter_type t4,
|
||||
typename access_traits<T5>::parameter_type t5,
|
||||
typename access_traits<T6>::parameter_type t6,
|
||||
typename access_traits<T7>::parameter_type t7)
|
||||
: m_tuple_impl(t0, t1, t2, t3, t4, t5, t6, t7, detail::make_null(), detail::make_null())
|
||||
{}
|
||||
|
||||
Tuple(typename access_traits<T0>::parameter_type t0,
|
||||
typename access_traits<T1>::parameter_type t1,
|
||||
typename access_traits<T2>::parameter_type t2,
|
||||
typename access_traits<T3>::parameter_type t3,
|
||||
typename access_traits<T4>::parameter_type t4,
|
||||
typename access_traits<T5>::parameter_type t5,
|
||||
typename access_traits<T6>::parameter_type t6,
|
||||
typename access_traits<T7>::parameter_type t7,
|
||||
typename access_traits<T8>::parameter_type t8)
|
||||
: m_tuple_impl(t0, t1, t2, t3, t4, t5, t6, t7, t8, detail::make_null())
|
||||
{}
|
||||
|
||||
Tuple(typename access_traits<T0>::parameter_type t0,
|
||||
typename access_traits<T1>::parameter_type t1,
|
||||
typename access_traits<T2>::parameter_type t2,
|
||||
typename access_traits<T3>::parameter_type t3,
|
||||
typename access_traits<T4>::parameter_type t4,
|
||||
typename access_traits<T5>::parameter_type t5,
|
||||
typename access_traits<T6>::parameter_type t6,
|
||||
typename access_traits<T7>::parameter_type t7,
|
||||
typename access_traits<T8>::parameter_type t8,
|
||||
typename access_traits<T9>::parameter_type t9)
|
||||
: m_tuple_impl(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9)
|
||||
{}
|
||||
|
||||
template <typename TT0, typename TT1, typename TT2, typename TT3, typename TT4,
|
||||
typename TT5, typename TT6, typename TT7, typename TT8, typename TT9>
|
||||
Tuple(const Tuple<TT0, TT1, TT2, TT3, TT4, TT5, TT6, TT7, TT8, TT9>& o)
|
||||
: m_tuple_impl(o.m_tuple_impl)
|
||||
{}
|
||||
|
||||
template <typename TT0, typename TT1, typename TT2, typename TT3, typename TT4,
|
||||
typename TT5, typename TT6, typename TT7, typename TT8, typename TT9>
|
||||
Tuple& operator=(const Tuple<TT0, TT1, TT2, TT3, TT4, TT5, TT6, TT7, TT8, TT9>& o)
|
||||
{
|
||||
m_tuple_impl = o.m_tuple_impl;
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <int N>
|
||||
typename access_traits<typename element<N>::type>::const_type
|
||||
get() const
|
||||
{
|
||||
TC_STATIC_ASSERT(N < LENGTH, index_out_of_bounds);
|
||||
return detail::drop_front<N, tuple_impl_type>::get_tail(m_tuple_impl).head;
|
||||
}
|
||||
|
||||
template <int N>
|
||||
typename access_traits<typename element<N>::type>::non_const_type
|
||||
get()
|
||||
{
|
||||
TC_STATIC_ASSERT(N < LENGTH, index_out_of_bounds);
|
||||
typedef detail::drop_front<N, tuple_impl_type> impl;
|
||||
typedef typename impl::type cons_element;
|
||||
return const_cast<cons_element&>(impl::get_tail(m_tuple_impl)).head;
|
||||
}
|
||||
|
||||
void swap(Tuple& o)
|
||||
{
|
||||
m_tuple_impl.swap(o.m_tuple_impl);
|
||||
}
|
||||
|
||||
private:
|
||||
tuple_impl_type m_tuple_impl;
|
||||
|
||||
template <typename TT0, typename TT1, typename TT2, typename TT3, typename TT4,
|
||||
typename TT5, typename TT6, typename TT7, typename TT8, typename TT9>
|
||||
friend class Tuple;
|
||||
|
||||
friend bool operator==(const Tuple& lhs, const Tuple& rhs)
|
||||
{
|
||||
return lhs.m_tuple_impl == rhs.m_tuple_impl;
|
||||
}
|
||||
|
||||
friend bool operator!=(const Tuple& lhs, const Tuple& rhs)
|
||||
{
|
||||
return lhs.m_tuple_impl != rhs.m_tuple_impl;
|
||||
}
|
||||
|
||||
friend bool operator<(const Tuple& lhs, const Tuple& rhs)
|
||||
{
|
||||
return lhs.m_tuple_impl < rhs.m_tuple_impl;
|
||||
}
|
||||
|
||||
friend std::ostream& operator<<(std::ostream& o, const Tuple& t)
|
||||
{
|
||||
o << '(';
|
||||
detail::print_cons(o, t.m_tuple_impl);
|
||||
o << ')';
|
||||
return o;
|
||||
}
|
||||
};
|
||||
|
||||
namespace detail
|
||||
{
|
||||
// Call traits for make_tuple
|
||||
//
|
||||
// Conversions:
|
||||
// T -> T
|
||||
// T& -> T
|
||||
// const T& -> T
|
||||
// T[] -> const T*
|
||||
// const T[] -> const T*
|
||||
|
||||
template <typename T>
|
||||
struct make_tuple_traits
|
||||
{
|
||||
typedef T type;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct make_tuple_traits<T&>
|
||||
{
|
||||
typedef T type;
|
||||
};
|
||||
|
||||
// To produce compilation error intentionally by referencing an non-exsitent
|
||||
// member of this class.
|
||||
template <typename T>
|
||||
class generate_error {};
|
||||
|
||||
template <typename T, size_t n>
|
||||
struct make_tuple_traits<T[n]>
|
||||
{
|
||||
typedef const T* type;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct make_tuple_traits<const T[]>
|
||||
{
|
||||
typedef const T* type;
|
||||
};
|
||||
|
||||
template <typename T0 = null_type, typename T1 = null_type, typename T2 = null_type,
|
||||
typename T3 = null_type, typename T4 = null_type, typename T5 = null_type,
|
||||
typename T6 = null_type, typename T7 = null_type, typename T8 = null_type,
|
||||
typename T9 = null_type>
|
||||
struct make_tuple_mapper
|
||||
{
|
||||
typedef Tuple<typename make_tuple_traits<T0>::type,
|
||||
typename make_tuple_traits<T1>::type,
|
||||
typename make_tuple_traits<T2>::type,
|
||||
typename make_tuple_traits<T3>::type,
|
||||
typename make_tuple_traits<T4>::type,
|
||||
typename make_tuple_traits<T5>::type,
|
||||
typename make_tuple_traits<T6>::type,
|
||||
typename make_tuple_traits<T7>::type,
|
||||
typename make_tuple_traits<T8>::type,
|
||||
typename make_tuple_traits<T9>::type> type;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
// make_tuple function templates for arities 0~10
|
||||
|
||||
inline Tuple<> make_tuple()
|
||||
{ return Tuple<>(); }
|
||||
|
||||
template <typename T0>
|
||||
inline typename detail::make_tuple_mapper<T0>::type
|
||||
make_tuple(const T0& t0)
|
||||
{
|
||||
typedef typename detail::make_tuple_mapper<T0>::type tuple_type;
|
||||
return tuple_type(t0);
|
||||
}
|
||||
|
||||
template <typename T0, typename T1>
|
||||
inline typename detail::make_tuple_mapper<T0, T1>::type
|
||||
make_tuple(const T0& t0, const T1& t1)
|
||||
{
|
||||
typedef typename detail::make_tuple_mapper<T0, T1>::type tuple_type;
|
||||
return tuple_type(t0, t1);
|
||||
}
|
||||
|
||||
template <typename T0, typename T1, typename T2>
|
||||
inline typename detail::make_tuple_mapper<T0, T1, T2>::type
|
||||
make_tuple(const T0& t0, const T1& t1, const T2& t2)
|
||||
{
|
||||
typedef typename detail::make_tuple_mapper<T0, T1, T2>::type tuple_type;
|
||||
return tuple_type(t0, t1, t2);
|
||||
}
|
||||
|
||||
template <typename T0, typename T1, typename T2, typename T3>
|
||||
inline typename detail::make_tuple_mapper<T0, T1, T2, T3>::type
|
||||
make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3)
|
||||
{
|
||||
typedef typename detail::make_tuple_mapper<T0, T1, T2, T3>::type tuple_type;
|
||||
return tuple_type(t0, t1, t2, t3);
|
||||
}
|
||||
|
||||
template <typename T0, typename T1, typename T2, typename T3, typename T4>
|
||||
inline typename detail::make_tuple_mapper<T0, T1, T2, T3, T4>::type
|
||||
make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3, const T4& t4)
|
||||
{
|
||||
typedef typename detail::make_tuple_mapper<T0, T1, T2, T3, T4>::type tuple_type;
|
||||
return tuple_type(t0, t1, t2, t3, t4);
|
||||
}
|
||||
|
||||
template <typename T0, typename T1, typename T2, typename T3, typename T4,
|
||||
typename T5>
|
||||
inline typename detail::make_tuple_mapper<T0, T1, T2, T3, T4, T5>::type
|
||||
make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3, const T4& t4,
|
||||
const T5& t5)
|
||||
{
|
||||
typedef typename detail::make_tuple_mapper<T0, T1, T2, T3, T4, T5>::type tuple_type;
|
||||
return tuple_type(t0, t1, t2, t3, t4, t5);
|
||||
}
|
||||
|
||||
template <typename T0, typename T1, typename T2, typename T3, typename T4,
|
||||
typename T5, typename T6>
|
||||
inline typename detail::make_tuple_mapper<T0, T1, T2, T3, T4, T5, T6>::type
|
||||
make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3, const T4& t4,
|
||||
const T5& t5, const T6& t6)
|
||||
{
|
||||
typedef typename detail::make_tuple_mapper<T0, T1, T2, T3, T4, T5, T6>::type tuple_type;
|
||||
return tuple_type(t0, t1, t2, t3, t4, t5, t6);
|
||||
}
|
||||
|
||||
template <typename T0, typename T1, typename T2, typename T3, typename T4,
|
||||
typename T5, typename T6, typename T7>
|
||||
inline typename detail::make_tuple_mapper<T0, T1, T2, T3, T4, T5, T6, T7>::type
|
||||
make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3, const T4& t4,
|
||||
const T5& t5, const T6& t6, const T7& t7)
|
||||
{
|
||||
typedef typename detail::make_tuple_mapper<T0, T1, T2, T3, T4, T5, T6, T7>::type tuple_type;
|
||||
return tuple_type(t0, t1, t2, t3, t4, t5, t6, t7);
|
||||
}
|
||||
|
||||
template <typename T0, typename T1, typename T2, typename T3, typename T4,
|
||||
typename T5, typename T6, typename T7, typename T8>
|
||||
inline typename detail::make_tuple_mapper<T0, T1, T2, T3, T4, T5, T6, T7, T8>::type
|
||||
make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3, const T4& t4,
|
||||
const T5& t5, const T6& t6, const T7& t7, const T8& t8)
|
||||
{
|
||||
typedef typename detail::make_tuple_mapper<T0, T1, T2, T3, T4, T5, T6, T7, T8>::type tuple_type;
|
||||
return tuple_type(t0, t1, t2, t3, t4, t5, t6, t7, t8);
|
||||
}
|
||||
|
||||
template <typename T0, typename T1, typename T2, typename T3, typename T4,
|
||||
typename T5, typename T6, typename T7, typename T8, typename T9>
|
||||
inline typename detail::make_tuple_mapper<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>::type
|
||||
make_tuple(const T0& t0, const T1& t1, const T2& t2, const T3& t3, const T4& t4,
|
||||
const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9)
|
||||
{
|
||||
typedef typename detail::make_tuple_mapper<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>::type tuple_type;
|
||||
return tuple_type(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9);
|
||||
}
|
||||
|
||||
} // namespace promise
|
||||
|
||||
#endif // __TARS_PROMISE_TUPLE_H__
|
@ -1,334 +0,0 @@
|
||||
/**
|
||||
* Tencent is pleased to support the open source community by making Tars available.
|
||||
*
|
||||
* Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
|
||||
*
|
||||
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
|
||||
* in compliance with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* https://opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
* 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 __TARS_PROMISE_WHEN_ALL_H_
|
||||
#define __TARS_PROMISE_WHEN_ALL_H_
|
||||
|
||||
#include "promise.h"
|
||||
#include <vector>
|
||||
// #include "std::tuple.h"
|
||||
#include "util/tc_monitor.h"
|
||||
// #include "util/tc_shared_ptr.h"
|
||||
// #include "util/detail/assert.h"
|
||||
namespace tars
|
||||
{
|
||||
namespace detail
|
||||
{
|
||||
// Callback implementation for parallel composition of futures.
|
||||
template <typename FutureAllValueType>
|
||||
struct ParallelAllCallbackBase
|
||||
{
|
||||
public:
|
||||
typedef Promise<FutureAllValueType> PromiseAll;
|
||||
|
||||
ParallelAllCallbackBase(const PromiseAll& promise_all,
|
||||
size_t number_of_non_satisfied)
|
||||
: m_number_of_non_satisfied(number_of_non_satisfied)
|
||||
, m_promise_all(promise_all)
|
||||
{
|
||||
}
|
||||
|
||||
virtual ~ParallelAllCallbackBase()
|
||||
{
|
||||
}
|
||||
|
||||
size_t m_number_of_non_satisfied;
|
||||
PromiseAll m_promise_all;
|
||||
FutureAllValueType m_waiting_futures;
|
||||
TC_ThreadLock m_monitor;
|
||||
|
||||
private:
|
||||
ParallelAllCallbackBase(const ParallelAllCallbackBase&);
|
||||
void operator=(const ParallelAllCallbackBase&);
|
||||
|
||||
};
|
||||
|
||||
// FutureAllValueType is supposed to be of type tars::std::tuple<tars::Future, ...> or
|
||||
// std::vector<tars::Future>.
|
||||
//
|
||||
// This implementation is for tars::std::tuple<>.
|
||||
template <typename FutureAllValueType>
|
||||
class ParallelAllCallback : private ParallelAllCallbackBase<FutureAllValueType>
|
||||
{
|
||||
public:
|
||||
typedef typename ParallelAllCallbackBase<FutureAllValueType>::PromiseAll PromiseAll;
|
||||
|
||||
ParallelAllCallback(const PromiseAll& promise_all)
|
||||
: ParallelAllCallbackBase<FutureAllValueType>(promise_all, FutureAllValueType::LENGTH)
|
||||
{}
|
||||
|
||||
virtual ~ParallelAllCallback() {}
|
||||
|
||||
template <int N>
|
||||
void on_future(const typename FutureAllValueType::template element<N>::type& future)
|
||||
{
|
||||
// Note: this future must be recorded no matter what exception is thrown.
|
||||
TC_ThreadLock::Lock lock(this->m_monitor);
|
||||
this->m_waiting_futures.template get<N>() = future;
|
||||
assert(this->m_number_of_non_satisfied > 0);
|
||||
if (--this->m_number_of_non_satisfied == 0)
|
||||
{
|
||||
lock.release();
|
||||
try
|
||||
{
|
||||
this->m_promise_all.setValue(this->m_waiting_futures);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
this->m_promise_all.setException(currentException());
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
ParallelAllCallback(const ParallelAllCallback&);
|
||||
void operator=(const ParallelAllCallback&);
|
||||
|
||||
};
|
||||
|
||||
// This implementation is specialized for std::vector<tars::Future<> >.
|
||||
template <typename FutureType>
|
||||
class ParallelAllCallback<std::vector<FutureType> > : private ParallelAllCallbackBase<std::vector<FutureType> >
|
||||
{
|
||||
public:
|
||||
typedef typename ParallelAllCallbackBase<std::vector<FutureType> >::PromiseAll PromiseAll;
|
||||
|
||||
ParallelAllCallback(const PromiseAll& promise_all,
|
||||
size_t number_of_non_satisfied)
|
||||
: ParallelAllCallbackBase<std::vector<FutureType> >(promise_all, number_of_non_satisfied)
|
||||
{
|
||||
this->m_waiting_futures.resize(number_of_non_satisfied);
|
||||
}
|
||||
|
||||
virtual ~ParallelAllCallback() {}
|
||||
|
||||
void on_future(const FutureType& future, size_t idx)
|
||||
{
|
||||
// Note: this future must be recorded no matter what exception is thrown.
|
||||
assert(idx < this->m_waiting_futures.size());
|
||||
|
||||
TC_ThreadLock::Lock lock(this->m_monitor);
|
||||
this->m_waiting_futures[idx] = future;
|
||||
assert(this->m_number_of_non_satisfied > 0);
|
||||
if (--this->m_number_of_non_satisfied == 0)
|
||||
{
|
||||
lock.release();
|
||||
try
|
||||
{
|
||||
this->m_promise_all.setValue(this->m_waiting_futures);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
this->m_promise_all.setException(tars::currentException());
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
ParallelAllCallback(const ParallelAllCallback&);
|
||||
void operator=(const ParallelAllCallback&);
|
||||
|
||||
};
|
||||
|
||||
// A helper class to notify ParallelAllCallback<std::vector<> > which future is done.
|
||||
template <typename T>
|
||||
class VectorParallelCallback
|
||||
{
|
||||
public:
|
||||
VectorParallelCallback(const std::shared_ptr<ParallelAllCallback<std::vector<Future<T> > > >& cb, size_t idx)
|
||||
: m_parallel_callback(cb),
|
||||
m_idx(idx)
|
||||
{}
|
||||
|
||||
void on_future(const Future<T>& future)
|
||||
{
|
||||
m_parallel_callback->on_future(future, m_idx);
|
||||
}
|
||||
|
||||
private:
|
||||
std::shared_ptr<ParallelAllCallback<std::vector<Future<T> > > > m_parallel_callback;
|
||||
size_t m_idx;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
/**
|
||||
* Parallelly composite two or more futues. Only when all futures are satisfied is
|
||||
* the composited future satisfied.
|
||||
*/
|
||||
template <typename T1, typename T2>
|
||||
Future<std::tuple<Future<T1>, Future<T2> > >
|
||||
whenAll(const Future<T1>& future1, const Future<T2>& future2)
|
||||
{
|
||||
typedef std::tuple<Future<T1>, Future<T2> > FutureAllValueType;
|
||||
typedef Promise<FutureAllValueType> PromiseAll;
|
||||
typedef detail::ParallelAllCallback<FutureAllValueType> WhenAllCallback;
|
||||
|
||||
PromiseAll promise_all;
|
||||
std::shared_ptr<WhenAllCallback> future_callback(new WhenAllCallback(promise_all));
|
||||
future1.then(std::bind(&WhenAllCallback::template on_future<0>, (future_callback)));
|
||||
future2.then(std::bind(&WhenAllCallback::template on_future<1>, (future_callback)));
|
||||
return promise_all.getFuture();
|
||||
}
|
||||
|
||||
template <typename T1, typename T2, typename T3>
|
||||
Future<std::tuple<Future<T1>, Future<T2>, Future<T3> > >
|
||||
whenAll(const Future<T1>& future1, const Future<T2>& future2, const Future<T3>& future3)
|
||||
{
|
||||
typedef std::tuple<Future<T1>, Future<T2>, Future<T3> > FutureAllValueType;
|
||||
typedef Promise<FutureAllValueType> PromiseAll;
|
||||
typedef detail::ParallelAllCallback<FutureAllValueType> WhenAllCallback;
|
||||
|
||||
PromiseAll promise_all;
|
||||
std::shared_ptr<WhenAllCallback> future_callback(new WhenAllCallback(promise_all));
|
||||
future1.then(std::bind(&WhenAllCallback::template on_future<0>, (future_callback)));
|
||||
future2.then(std::bind(&WhenAllCallback::template on_future<1>, (future_callback)));
|
||||
future3.then(std::bind(&WhenAllCallback::template on_future<2>, (future_callback)));
|
||||
return promise_all.getFuture();
|
||||
}
|
||||
|
||||
template <typename T1, typename T2, typename T3, typename T4>
|
||||
Future<std::tuple<Future<T1>, Future<T2>, Future<T3>, Future<T4> > >
|
||||
whenAll(const Future<T1>& future1, const Future<T2>& future2, const Future<T3>& future3, const Future<T4>& future4)
|
||||
{
|
||||
typedef std::tuple<Future<T1>, Future<T2>, Future<T3>, Future<T4> > FutureAllValueType;
|
||||
typedef Promise<FutureAllValueType> PromiseAll;
|
||||
typedef detail::ParallelAllCallback<FutureAllValueType> WhenAllCallback;
|
||||
|
||||
PromiseAll promise_all;
|
||||
std::shared_ptr<WhenAllCallback> future_callback(new WhenAllCallback(promise_all));
|
||||
future1.then(std::bind(&WhenAllCallback::template on_future<0>, (future_callback)));
|
||||
future2.then(std::bind(&WhenAllCallback::template on_future<1>, (future_callback)));
|
||||
future3.then(std::bind(&WhenAllCallback::template on_future<2>, (future_callback)));
|
||||
future4.then(std::bind(&WhenAllCallback::template on_future<3>, (future_callback)));
|
||||
return promise_all.getFuture();
|
||||
}
|
||||
|
||||
template <typename T1, typename T2, typename T3, typename T4, typename T5>
|
||||
Future<std::tuple<Future<T1>, Future<T2>, Future<T3>, Future<T4>, Future<T5> > >
|
||||
whenAll(const Future<T1>& future1, const Future<T2>& future2, const Future<T3>& future3, const Future<T4>& future4,
|
||||
const Future<T5>& future5)
|
||||
{
|
||||
typedef std::tuple<Future<T1>, Future<T2>, Future<T3>, Future<T4>, Future<T5> > FutureAllValueType;
|
||||
typedef Promise<FutureAllValueType> PromiseAll;
|
||||
typedef detail::ParallelAllCallback<FutureAllValueType> WhenAllCallback;
|
||||
|
||||
PromiseAll promise_all;
|
||||
std::shared_ptr<WhenAllCallback> future_callback(new WhenAllCallback(promise_all));
|
||||
future1.then(std::bind(&WhenAllCallback::template on_future<0>, (future_callback)));
|
||||
future2.then(std::bind(&WhenAllCallback::template on_future<1>, (future_callback)));
|
||||
future3.then(std::bind(&WhenAllCallback::template on_future<2>, (future_callback)));
|
||||
future4.then(std::bind(&WhenAllCallback::template on_future<3>, (future_callback)));
|
||||
future5.then(std::bind(&WhenAllCallback::template on_future<4>, (future_callback)));
|
||||
return promise_all.getFuture();
|
||||
}
|
||||
|
||||
template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
|
||||
Future<std::tuple<Future<T1>, Future<T2>, Future<T3>, Future<T4>, Future<T5>, Future<T6> > >
|
||||
whenAll(const Future<T1>& future1, const Future<T2>& future2, const Future<T3>& future3, const Future<T4>& future4,
|
||||
const Future<T5>& future5, const Future<T6>& future6)
|
||||
{
|
||||
typedef std::tuple<Future<T1>, Future<T2>, Future<T3>, Future<T4>, Future<T5>, Future<T6> > FutureAllValueType;
|
||||
typedef Promise<FutureAllValueType> PromiseAll;
|
||||
typedef detail::ParallelAllCallback<FutureAllValueType> WhenAllCallback;
|
||||
|
||||
PromiseAll promise_all;
|
||||
std::shared_ptr<WhenAllCallback> future_callback(new WhenAllCallback(promise_all));
|
||||
future1.then(std::bind(&WhenAllCallback::template on_future<0>, (future_callback)));
|
||||
future2.then(std::bind(&WhenAllCallback::template on_future<1>, (future_callback)));
|
||||
future3.then(std::bind(&WhenAllCallback::template on_future<2>, (future_callback)));
|
||||
future4.then(std::bind(&WhenAllCallback::template on_future<3>, (future_callback)));
|
||||
future5.then(std::bind(&WhenAllCallback::template on_future<4>, (future_callback)));
|
||||
future6.then(std::bind(&WhenAllCallback::template on_future<5>, (future_callback)));
|
||||
return promise_all.getFuture();
|
||||
}
|
||||
|
||||
template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
|
||||
Future<std::tuple<Future<T1>, Future<T2>, Future<T3>, Future<T4>, Future<T5>, Future<T6>, Future<T7> > >
|
||||
whenAll(const Future<T1>& future1, const Future<T2>& future2, const Future<T3>& future3, const Future<T4>& future4,
|
||||
const Future<T5>& future5, const Future<T6>& future6, const Future<T7>& future7)
|
||||
{
|
||||
typedef std::tuple<Future<T1>, Future<T2>, Future<T3>, Future<T4>, Future<T5>, Future<T6>, Future<T7> > FutureAllValueType;
|
||||
typedef Promise<FutureAllValueType> PromiseAll;
|
||||
typedef detail::ParallelAllCallback<FutureAllValueType> WhenAllCallback;
|
||||
|
||||
PromiseAll promise_all;
|
||||
std::shared_ptr<WhenAllCallback> future_callback(new WhenAllCallback(promise_all));
|
||||
future1.then(std::bind(&WhenAllCallback::template on_future<0>, (future_callback)));
|
||||
future2.then(std::bind(&WhenAllCallback::template on_future<1>, (future_callback)));
|
||||
future3.then(std::bind(&WhenAllCallback::template on_future<2>, (future_callback)));
|
||||
future4.then(std::bind(&WhenAllCallback::template on_future<3>, (future_callback)));
|
||||
future5.then(std::bind(&WhenAllCallback::template on_future<4>, (future_callback)));
|
||||
future6.then(std::bind(&WhenAllCallback::template on_future<5>, (future_callback)));
|
||||
future7.then(std::bind(&WhenAllCallback::template on_future<6>, (future_callback)));
|
||||
return promise_all.getFuture();
|
||||
}
|
||||
|
||||
template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
|
||||
Future<std::tuple<Future<T1>, Future<T2>, Future<T3>, Future<T4>, Future<T5>, Future<T6>, Future<T7>, Future<T8> > >
|
||||
whenAll(const Future<T1>& future1, const Future<T2>& future2, const Future<T3>& future3, const Future<T4>& future4,
|
||||
const Future<T5>& future5, const Future<T6>& future6, const Future<T7>& future7, const Future<T8>& future8)
|
||||
{
|
||||
typedef std::tuple<Future<T1>, Future<T2>, Future<T3>, Future<T4>, Future<T5>, Future<T6>, Future<T7>, Future<T8> > FutureAllValueType;
|
||||
typedef Promise<FutureAllValueType> PromiseAll;
|
||||
typedef detail::ParallelAllCallback<FutureAllValueType> WhenAllCallback;
|
||||
|
||||
PromiseAll promise_all;
|
||||
std::shared_ptr<WhenAllCallback> future_callback(new WhenAllCallback(promise_all));
|
||||
future1.then(std::bind(&WhenAllCallback::template on_future<0>, (future_callback)));
|
||||
future2.then(std::bind(&WhenAllCallback::template on_future<1>, (future_callback)));
|
||||
future3.then(std::bind(&WhenAllCallback::template on_future<2>, (future_callback)));
|
||||
future4.then(std::bind(&WhenAllCallback::template on_future<3>, (future_callback)));
|
||||
future5.then(std::bind(&WhenAllCallback::template on_future<4>, (future_callback)));
|
||||
future6.then(std::bind(&WhenAllCallback::template on_future<5>, (future_callback)));
|
||||
future7.then(std::bind(&WhenAllCallback::template on_future<6>, (future_callback)));
|
||||
future8.then(std::bind(&WhenAllCallback::template on_future<7>, (future_callback)));
|
||||
return promise_all.getFuture();
|
||||
}
|
||||
|
||||
template <typename T, typename InputIterator>
|
||||
Future<std::vector<Future<T> > >
|
||||
whenAll(InputIterator first, InputIterator last)
|
||||
{
|
||||
typedef std::vector<Future<T> > FutureAllValueType;
|
||||
typedef Promise<FutureAllValueType> PromiseAll;
|
||||
typedef detail::ParallelAllCallback<FutureAllValueType> WhenAllCallback;
|
||||
|
||||
PromiseAll promise_all;
|
||||
if (first == last)
|
||||
{
|
||||
promise_all.setValue(FutureAllValueType());
|
||||
}
|
||||
else
|
||||
{
|
||||
std::shared_ptr<WhenAllCallback> when_all_callback(new WhenAllCallback(promise_all, std::distance(first, last)));
|
||||
size_t i;
|
||||
|
||||
for (i = 0; first != last; ++first, ++i)
|
||||
{
|
||||
std::shared_ptr<detail::VectorParallelCallback<T>> ptr(new detail::VectorParallelCallback<T>(when_all_callback, i));
|
||||
first->then(std::bind(&detail::VectorParallelCallback<T>::on_future, ptr));
|
||||
// tars::tc_owned(new detail::VectorParallelCallback<T>(when_all_callback, i))));
|
||||
}
|
||||
}
|
||||
return promise_all.getFuture();
|
||||
}
|
||||
|
||||
} // namespace promise
|
||||
|
||||
#endif // __TARS_PROMISE_WHEN_ALL_H__
|
@ -29,7 +29,7 @@ void usage()
|
||||
cout << " --unjson not json interface" << endl;
|
||||
cout << " --os only create struct(not create interface) " << endl;
|
||||
cout << " --include=\"dir1;dir2;dir3\" set search path of tars protocol" << endl;
|
||||
cout << " --unknown create unkown field" << endl;
|
||||
// cout << " --unknown create unkown field" << endl;
|
||||
cout << " --tarsMaster create get registry info interface" << endl;
|
||||
cout << " --currentPriority use current path first." << endl;
|
||||
cout << " tars2cpp support type: bool byte short int long float double vector map" << endl;
|
||||
@ -123,7 +123,7 @@ int main(int argc, char* argv[])
|
||||
g_parse->setHeader(option.getValue("header"));
|
||||
g_parse->setCurrentPriority(option.hasParam("currentPriority"));
|
||||
|
||||
t2c.setUnknownField(option.hasParam("unknown"));
|
||||
// t2c.setUnknownField(option.hasParam("unknown"));
|
||||
for(size_t i = 0; i < vTars.size(); i++)
|
||||
{
|
||||
|
||||
|
@ -31,7 +31,7 @@ Tars2Cpp::Tars2Cpp()
|
||||
, _onlyStruct(false)
|
||||
, _bJsonSupport(true)
|
||||
, _namespace("tars")
|
||||
, _unknownField(false)
|
||||
// , _unknownField(false)
|
||||
, _tarsMaster(false)
|
||||
{
|
||||
|
||||
@ -230,18 +230,18 @@ string Tars2Cpp::readFrom(const TypeIdPtr& pPtr, bool bIsRequire) const
|
||||
|
||||
|
||||
|
||||
string Tars2Cpp::readUnknown(const TypeIdPtr& pPtr) const
|
||||
{
|
||||
ostringstream s;
|
||||
s << TAB << "_is.readUnknown(sUnknownField, " << pPtr->getTag() << ");" << endl;
|
||||
return s.str();
|
||||
}
|
||||
string Tars2Cpp::writeUnknown() const
|
||||
{
|
||||
ostringstream s;
|
||||
s << TAB << "_os.writeUnknown(sUnknownField);" << endl;
|
||||
return s.str();
|
||||
}
|
||||
// string Tars2Cpp::readUnknown(const TypeIdPtr& pPtr) const
|
||||
// {
|
||||
// ostringstream s;
|
||||
// s << TAB << "_is.readUnknown(sUnknownField, " << pPtr->getTag() << ");" << endl;
|
||||
// return s.str();
|
||||
// }
|
||||
// string Tars2Cpp::writeUnknown() const
|
||||
// {
|
||||
// ostringstream s;
|
||||
// s << TAB << "_os.writeUnknown(sUnknownField);" << endl;
|
||||
// return s.str();
|
||||
// }
|
||||
|
||||
string Tars2Cpp::display(const TypeIdPtr& pPtr) const
|
||||
{
|
||||
@ -568,14 +568,14 @@ string Tars2Cpp::generateH(const StructPtr& pPtr, const string& namespaceId) con
|
||||
}
|
||||
}
|
||||
|
||||
if (b)
|
||||
{
|
||||
if (_unknownField)
|
||||
{
|
||||
s << ",sUnknownField(\"\")";
|
||||
}
|
||||
s << endl;
|
||||
}
|
||||
// if (b)
|
||||
// {
|
||||
// if (_unknownField)
|
||||
// {
|
||||
// s << ",sUnknownField(\"\")";
|
||||
// }
|
||||
// s << endl;
|
||||
// }
|
||||
|
||||
s << TAB << "{" << endl;
|
||||
INC_TAB;
|
||||
@ -656,10 +656,10 @@ string Tars2Cpp::generateH(const StructPtr& pPtr, const string& namespaceId) con
|
||||
{
|
||||
s << writeTo(member[j]);
|
||||
}
|
||||
if (_unknownField)
|
||||
{
|
||||
s << writeUnknown();
|
||||
}
|
||||
// if (_unknownField)
|
||||
// {
|
||||
// s << writeUnknown();
|
||||
// }
|
||||
DEL_TAB;
|
||||
s << TAB << "}" << endl;
|
||||
|
||||
@ -673,10 +673,10 @@ string Tars2Cpp::generateH(const StructPtr& pPtr, const string& namespaceId) con
|
||||
{
|
||||
s << readFrom(member[j]);
|
||||
}
|
||||
if (_unknownField)
|
||||
{
|
||||
s << readUnknown(member[member.size() - 1]);
|
||||
}
|
||||
// if (_unknownField)
|
||||
// {
|
||||
// s << readUnknown(member[member.size() - 1]);
|
||||
// }
|
||||
|
||||
DEL_TAB;
|
||||
s << TAB << "}" << endl;
|
||||
@ -771,10 +771,10 @@ string Tars2Cpp::generateH(const StructPtr& pPtr, const string& namespaceId) con
|
||||
s << TAB << tostr(member[j]->getTypePtr()) << " " << member[j]->getId() << toStrSuffix(member[j]) << ";" << endl;
|
||||
|
||||
}
|
||||
if (_unknownField)
|
||||
{
|
||||
s << TAB << "std::string sUnknownField;" << endl;
|
||||
}
|
||||
// if (_unknownField)
|
||||
// {
|
||||
// s << TAB << "std::string sUnknownField;" << endl;
|
||||
// }
|
||||
DEL_TAB;
|
||||
s << TAB << "};" << endl;
|
||||
|
||||
@ -1376,6 +1376,7 @@ string Tars2Cpp::generateServantDispatch(const OperationPtr& pPtr, const string&
|
||||
return s.str();
|
||||
}
|
||||
|
||||
/*
|
||||
string Tars2Cpp::promiseReadFrom(const TypeIdPtr &pPtr, bool bIsRequire) const
|
||||
{
|
||||
ostringstream s;
|
||||
@ -1442,6 +1443,7 @@ bool Tars2Cpp::isPromiseDispatchInitValue(const TypeIdPtr &pPtr) const
|
||||
}
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
string Tars2Cpp::generateHAsync(const OperationPtr& pPtr, const string& cn) const
|
||||
{
|
||||
ostringstream s;
|
||||
@ -1502,7 +1504,7 @@ string Tars2Cpp::generateHAsync(const OperationPtr& pPtr, const string& cn) cons
|
||||
DEL_TAB;
|
||||
s << TAB << "}" << endl;
|
||||
s << TAB << endl;
|
||||
|
||||
/*
|
||||
//promise异步的函数声明
|
||||
string sStruct = pPtr->getId();
|
||||
|
||||
@ -1559,7 +1561,7 @@ string Tars2Cpp::generateHAsync(const OperationPtr& pPtr, const string& cn) cons
|
||||
DEL_TAB;
|
||||
s << TAB << "}" << endl;
|
||||
s << endl;
|
||||
|
||||
*/
|
||||
//协程并行异步的函数声明
|
||||
s << TAB << "void coro_" << pPtr->getId() << "(";
|
||||
s << cn << "CoroPrxCallbackPtr callback,";
|
||||
@ -1811,6 +1813,7 @@ struct SortOperation {
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
string Tars2Cpp::generateHPromiseAsync(const InterfacePtr &pInter, const OperationPtr &pPtr) const
|
||||
{
|
||||
ostringstream s;
|
||||
@ -1972,6 +1975,7 @@ string Tars2Cpp::generateDispatchPromiseAsync(const OperationPtr &pPtr, const st
|
||||
|
||||
return s.str();
|
||||
}
|
||||
*/
|
||||
/******************************InterfacePtr***************************************/
|
||||
string Tars2Cpp::generateH(const InterfacePtr &pPtr, const NamespacePtr &nPtr) const
|
||||
{
|
||||
@ -2077,9 +2081,9 @@ string Tars2Cpp::generateH(const InterfacePtr &pPtr, const NamespacePtr &nPtr) c
|
||||
|
||||
s << TAB << "typedef tars::TC_AutoPtr<" << pPtr->getId() << "PrxCallback> " << pPtr->getId() << "PrxCallbackPtr;" << endl;
|
||||
s << endl;
|
||||
|
||||
/*
|
||||
//生成promise异步回调Proxy
|
||||
s << TAB << "/* callback of promise async proxy for client */" << endl;
|
||||
s << TAB << "//callback of promise async proxy for client" << endl;
|
||||
s << TAB << "class " << pPtr->getId() << "PrxCallbackPromise: public tars::ServantProxyCallback" << endl;
|
||||
s << TAB << "{" << endl;
|
||||
s << TAB << "public:" << endl;
|
||||
@ -2156,7 +2160,7 @@ string Tars2Cpp::generateH(const InterfacePtr &pPtr, const NamespacePtr &nPtr) c
|
||||
|
||||
s << TAB << "typedef tars::TC_AutoPtr<" << pPtr->getId() << "PrxCallbackPromise> " << pPtr->getId() << "PrxCallbackPromisePtr;" << endl;
|
||||
s << endl;
|
||||
|
||||
*/
|
||||
//生成协程异步回调类,用于并发请求
|
||||
s << TAB << "/* callback of coroutine async proxy for client */" << endl;
|
||||
s << TAB << "class " << pPtr->getId() << "CoroPrxCallback: public " << pPtr->getId() << "PrxCallback" << endl;
|
||||
@ -2542,7 +2546,7 @@ void Tars2Cpp::generateH(const ContextPtr &pPtr) const
|
||||
{
|
||||
s << "#include \"servant/ServantProxy.h\"" << endl;
|
||||
s << "#include \"servant/Servant.h\"" << endl;
|
||||
s << "#include \"promise/promise.h\"" << endl;
|
||||
// s << "#include \"promise/promise.h\"" << endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -64,7 +64,7 @@ public:
|
||||
/**
|
||||
* setUnknownField for UnknownField support
|
||||
*/
|
||||
void setUnknownField(bool bUnkownField) { _unknownField = bUnkownField; }
|
||||
// void setUnknownField(bool bUnkownField) { _unknownField = bUnkownField; }
|
||||
|
||||
/**
|
||||
* added for master info
|
||||
@ -113,7 +113,7 @@ protected:
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
string promiseReadFrom(const TypeIdPtr &pPtr, bool bIsRequire = true) const;
|
||||
// string promiseReadFrom(const TypeIdPtr &pPtr, bool bIsRequire = true) const;
|
||||
|
||||
/**
|
||||
*
|
||||
@ -121,14 +121,14 @@ protected:
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
string readUnknown(const TypeIdPtr &pPtr) const;
|
||||
// string readUnknown(const TypeIdPtr &pPtr) const;
|
||||
/**
|
||||
*
|
||||
* @param pPtr
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
string writeUnknown()const;
|
||||
// string writeUnknown()const;
|
||||
/**
|
||||
*
|
||||
* @param pPtr
|
||||
@ -354,7 +354,7 @@ protected:
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
string generateHPromiseAsync(const InterfacePtr &pInter, const OperationPtr &pPtr) const;
|
||||
// string generateHPromiseAsync(const InterfacePtr &pInter, const OperationPtr &pPtr) const;
|
||||
|
||||
/**
|
||||
* 生成操作函数调用分发的源码
|
||||
@ -363,7 +363,7 @@ protected:
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
string generateDispatchPromiseAsync(const OperationPtr &pPtr, const string &cn) const;
|
||||
// string generateDispatchPromiseAsync(const OperationPtr &pPtr, const string &cn) const;
|
||||
|
||||
/**
|
||||
* 生成操作的servant的头文件源码
|
||||
@ -440,7 +440,7 @@ protected:
|
||||
|
||||
string generateInitValue(const TypeIdPtr &pPtr) const;
|
||||
|
||||
bool isPromiseDispatchInitValue(const TypeIdPtr &pPtr) const;
|
||||
// bool isPromiseDispatchInitValue(const TypeIdPtr &pPtr) const;
|
||||
|
||||
private:
|
||||
std::string _baseDir;
|
||||
@ -453,7 +453,7 @@ private:
|
||||
|
||||
std::string _namespace ;
|
||||
|
||||
bool _unknownField;
|
||||
// bool _unknownField;
|
||||
|
||||
bool _tarsMaster;
|
||||
};
|
||||
|
@ -788,7 +788,7 @@ clean:
|
||||
TAF_THROW_EXCEPTION_SYSCODE(TC_Socket_Exception, "[TC_Socket::createPipe] error");
|
||||
}
|
||||
|
||||
#if TARGET_PLATFORM_LINUX||TARGET_PLATFORM_IOS
|
||||
#if TARGET_PLATFORM_LINUX
|
||||
vector<string> TC_Socket::getLocalHosts(int domain)
|
||||
{
|
||||
vector<string> result;
|
||||
@ -858,6 +858,35 @@ vector<string> TC_Socket::getLocalHosts(int domain)
|
||||
|
||||
return result;
|
||||
}
|
||||
#elif TARGET_PLATFORM_IOS
|
||||
vector<string> TC_Socket::getLocalHosts(int domain)
|
||||
{
|
||||
vector<string> hosts;
|
||||
char local[255] = { 0 };
|
||||
gethostname(local, sizeof(local));
|
||||
hostent* ph = gethostbyname(local);
|
||||
if (ph == NULL)
|
||||
{
|
||||
return hosts;
|
||||
}
|
||||
|
||||
in_addr addr;
|
||||
if (ph->h_addrtype == AF_INET)
|
||||
{
|
||||
int i = 0;
|
||||
while (ph->h_addr_list[i] != 0)
|
||||
{
|
||||
addr.s_addr = *(u_long*)ph->h_addr_list[i++];
|
||||
hosts.emplace_back(inet_ntoa(addr));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// unsupport AF_INET6 ...
|
||||
return hosts;
|
||||
}
|
||||
return hosts;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TARGET_PLATFORM_WINDOWS
|
||||
|
Loading…
Reference in New Issue
Block a user