Token ObjectFactoryService::addObjectImpl(RcfClientPtr rcfClientPtr) { Token myToken; bool ok = mTokenFactory.requestToken(myToken); RCF_VERIFY(ok, Exception(_RcfError_TokenRequestFailed())); WriteLock writeLock(mStubMapMutex); RCF_UNUSED_VARIABLE(writeLock); RCF_ASSERT(mStubMap.find(myToken) != mStubMap.end())(myToken); StubEntryPtr stubEntryPtr(new StubEntry(rcfClientPtr)); mStubMap[myToken].second = stubEntryPtr; return myToken; }
// remotely accessible boost::int32_t ObjectFactoryService::CreateObject( const std::string &objectName, Token &token) { RCF_LOG_3()(objectName); { Lock lock(mCleanupThresholdMutex); if (!mLazyStarted) { mTaskEntries[0].start(); mLazyStarted = true; } } // TODO: seems unnecessary to be triggering a sweep here std::size_t nAvail = mTokenFactory->getAvailableTokenCount(); std::size_t nTotal = mTokenFactory->getTokenSpace().size(); float used = float(nTotal - nAvail) / float(nTotal); if (used > mCleanupThreshold) { Lock lock(mCleanupThresholdMutex); mCleanupThresholdCondition.notify_all(lock); } boost::int32_t ret = RcfError_Ok; StubFactoryPtr stubFactoryPtr( getStubFactory( objectName)); if (stubFactoryPtr.get()) { RcfClientPtr rcfClientPtr( stubFactoryPtr->makeServerStub()); StubEntryPtr stubEntryPtr( new StubEntry(rcfClientPtr)); ret = addObject(TokenMappedPtr(stubEntryPtr), token); if (ret == RcfError_Ok) { getTlsRcfSession().setCachedStubEntryPtr(stubEntryPtr); RCF_LOG_3()(objectName)(token) << "Dynamically bound object created."; } } else { ret = RcfError_ObjectFactoryNotFound; } return ret; }