19 #ifndef INCLUDE_RCF_SERVEROBJECTSERVICE_HPP
20 #define INCLUDE_RCF_SERVEROBJECTSERVICE_HPP
22 #include <boost/any.hpp>
24 #include <RCF/Export.hpp>
25 #include <RCF/PeriodicTimer.hpp>
26 #include <RCF/Service.hpp>
31 class ServerObjectService;
32 typedef boost::shared_ptr<ServerObjectService> ServerObjectServicePtr;
34 class ServerObjectHolder
38 ServerObjectHolder() :
45 ServerObjectHolder(
const boost::any & serverObject, boost::uint32_t timeoutMs) :
46 mTimeoutMs(timeoutMs),
49 mServerObject(serverObject)
53 boost::uint32_t mTimeoutMs;
54 boost::uint32_t mLastTouchMs;
56 boost::any mServerObject;
59 class RCF_EXPORT ServerObjectService :
public I_Service, boost::noncopyable
62 ServerObjectService();
65 void onServerStart(RcfServer & server);
66 void onServerStop(RcfServer & server);
68 void customDeleter(
const std::string & objectKey,
void * pt);
70 typedef std::map<std::string, ServerObjectHolder> ServerObjectMap;
72 RcfServer * mpRcfServer;
73 PeriodicTimer mPeriodicTimer;
75 boost::uint32_t mHarvestingIntervalS;
76 boost::uint32_t mLastHarvestMs;
79 ServerObjectMap mServerObjectMap;
84 boost::shared_ptr<T> getServerObjectImpl(
85 const std::string & objectKey,
86 boost::uint32_t timeoutMs,
87 bool createIfDoesntExist)
89 typedef boost::shared_ptr<T> TPtr;
93 ServerObjectMap::iterator iter = mServerObjectMap.find(objectKey);
94 if (iter != mServerObjectMap.end())
96 ServerObjectHolder & holder = iter->second;
97 boost::any & a = holder.mServerObject;
98 TPtr * ptPtr = boost::any_cast<TPtr>(&a);
105 holder.mLastTouchMs = getCurrentTimeMs();
106 RCF_ASSERT(holder.mUseCount >= 0);
108 TPtr ptr(pt, boost::bind(&ServerObjectService::customDeleter,
this, objectKey, _1));
111 else if (createIfDoesntExist)
115 mServerObjectMap[objectKey] = ServerObjectHolder(boost::any(tPtr), timeoutMs);
116 ServerObjectHolder & holder = mServerObjectMap[objectKey];
119 holder.mLastTouchMs = getCurrentTimeMs();
120 RCF_ASSERT(holder.mUseCount >= 0);
122 TPtr ptr(pt, boost::bind(&ServerObjectService::customDeleter,
this, objectKey, _1));
134 boost::shared_ptr<T> queryServerObject(
135 const std::string & objectKey)
137 return getServerObjectImpl<T>(objectKey, 0,
false);
141 boost::shared_ptr<T> getServerObject(
142 const std::string & objectKey,
143 boost::uint32_t timeoutMs)
145 return getServerObjectImpl<T>(objectKey, timeoutMs,
true);
148 void deleteServerObject(
const std::string & objectKey);
153 #endif // ! INCLUDE_RCF_SERVEROBJECTSERVICE_HPP