18 #ifndef INCLUDE_RCF_SERVEROBJECTSERVICE_HPP 19 #define INCLUDE_RCF_SERVEROBJECTSERVICE_HPP 21 #include <RCF/Any.hpp> 22 #include <RCF/Export.hpp> 23 #include <RCF/PeriodicTimer.hpp> 24 #include <RCF/Service.hpp> 25 #include <RCF/Tools.hpp> 31 class ServerObjectService;
32 typedef std::shared_ptr<ServerObjectService> ServerObjectServicePtr;
34 class RCF_EXPORT ServerObjectHolder
40 ServerObjectHolder(
const Any & serverObject, std::uint32_t timeoutMs);
42 std::uint32_t mTimeoutMs;
43 std::uint32_t mLastTouchMs;
48 class RCF_EXPORT ServerObjectService :
public I_Service, Noncopyable
51 ServerObjectService();
54 void onServerStart(RcfServer & server);
55 void onServerStop(RcfServer & server);
57 void customDeleter(
const std::string & objectKey,
void * pt);
59 typedef std::map<std::string, ServerObjectHolder> ServerObjectMap;
61 RcfServer * mpRcfServer;
62 PeriodicTimer mPeriodicTimer;
64 std::uint32_t mHarvestingIntervalS;
65 std::uint32_t mLastHarvestMs;
68 ServerObjectMap mServerObjectMap;
73 std::shared_ptr<T> getServerObjectImpl(
74 const std::string & objectKey,
75 std::uint32_t timeoutMs,
76 bool createIfDoesntExist)
78 typedef std::shared_ptr<T> TPtr;
82 ServerObjectMap::iterator iter = mServerObjectMap.find(objectKey);
83 if (iter != mServerObjectMap.end())
85 ServerObjectHolder & holder = iter->second;
86 Any & a = holder.mServerObject;
87 TPtr & tPtr = a.get<TPtr>();
92 holder.mLastTouchMs = getCurrentTimeMs();
93 RCF_ASSERT(holder.mUseCount >= 0);
96 RCF_LOG_2()(objectKey)(holder.mUseCount) <<
"ServerObjectService - returning reference to existing server object.";
98 TPtr ptr(pt, std::bind(&ServerObjectService::customDeleter,
this, objectKey, std::placeholders::_1));
101 else if (createIfDoesntExist)
105 mServerObjectMap[objectKey] = ServerObjectHolder(Any(tPtr), timeoutMs);
106 ServerObjectHolder & holder = mServerObjectMap[objectKey];
109 holder.mLastTouchMs = getCurrentTimeMs();
110 RCF_ASSERT(holder.mUseCount >= 0);
113 RCF_LOG_2()(objectKey)(holder.mUseCount) <<
"ServerObjectService - returning reference to new server object.";
115 TPtr ptr(pt, std::bind(&ServerObjectService::customDeleter,
this, objectKey, std::placeholders::_1));
120 RCF_LOG_2()(objectKey) <<
"ServerObjectService - could not find requested server object.";
129 std::shared_ptr<T> queryServerObject(
130 const std::string & objectKey)
132 return getServerObjectImpl<T>(objectKey, 0,
false);
136 std::shared_ptr<T> getServerObject(
137 const std::string & objectKey,
138 std::uint32_t timeoutMs)
140 return getServerObjectImpl<T>(objectKey, timeoutMs,
true);
143 void deleteServerObject(
const std::string & objectKey);
148 #endif // ! INCLUDE_RCF_SERVEROBJECTSERVICE_HPP
Definition: AmiIoHandler.hpp:23