27#include <Ice/Initialize.h>
28#include <Ice/ObjectAdapter.h>
35#include <ArmarXCore/interface/core/SharedMemory.h>
50 template <
class MemoryObject,
class MemoryObjectMetaInfo = MetaInfoSizeBase>
53 virtual public SharedMemoryProviderInterface
68 std::string nameSuffix =
"")
71 memoryName =
object->getName() +
"Memory" + nameSuffix;
73 this->
object = object;
75 typename MemoryObjectMetaInfo::PointerType info =
new MemoryObjectMetaInfo();
80 info->capacity = capacity;
84 info->capacity = size;
88 initSharedMemory(
object, info);
92 typename MemoryObjectMetaInfo::PointerType info,
93 std::string nameSuffix =
"")
95 memoryName =
object->getName() +
"Memory" + nameSuffix;
97 this->
object = object;
101 initSharedMemory(
object, info);
120 if (object->getState() < eManagedIceObjectStarting)
124 "Started IceSharedMemoryProvider before component is in connected state.");
139 ::Ice::Identity
id = Ice::stringToIdentity(memoryName);
140 memoryAdapter->remove(
id);
141 object->getIceManager()->getIceGridSession()->getAdmin()->removeObject(
id);
142 memoryAdapter->destroy();
143 memoryAdapter = NULL;
157 return sharedMemoryProvider->getMemory();
168 auto prov = sharedMemoryProvider;
171 return sharedMemoryProvider->getScopedWriteLock();
182 auto prov = sharedMemoryProvider;
185 return sharedMemoryProvider->getScopedReadLock();
199 sharedMemoryProvider->lock();
208 sharedMemoryProvider->unlock();
215 getData(MetaInfoSizeBasePtr& info,
const Ice::Current&
c = Ice::emptyCurrent)
override
219 info =
new MemoryObjectMetaInfo(*sharedMemoryProvider->getMetaInfo());
223 memcpy(buffer.data(),
getBuffer(), info->size);
234 if (sharedMemoryProvider->getMetaInfo()->size)
236 memcpy(buffer.data(),
getBuffer(), sharedMemoryProvider->getMetaInfo()->size);
243 setMetaInfo(
const typename MemoryObjectMetaInfo::PointerType& info,
bool threadSafe =
true)
250 sharedMemoryProvider->setMetaInfo(info);
252 buffer.resize(info->size);
258 typename MemoryObjectMetaInfo::PointerType
266 return new MemoryObjectMetaInfo(*sharedMemoryProvider->getMetaInfo());
282 getSize(
const Ice::Current&
c = Ice::emptyCurrent)
override
284 return sharedMemoryProvider->getSize();
301 Ice::ObjectPrx thisProxy =
302 object->getIceManager()->getIceGridSession()->registerObjectWithNewAdapter(
303 this, memoryName, memoryAdapter);
305 buffer.resize(sharedMemoryProvider->getSize());
310 initSharedMemory(
ManagedIceObject*
object,
typename MemoryObjectMetaInfo::PointerType info)
313 sharedMemoryProvider.reset(
317 std::string memoryName;
323 ManagedIceObject* object;
329 sharedMemoryProvider;
to retreive a unique Hardware identifier
MetaInfoSizeBasePtr getMetaInfo(const Ice::Current &c) const override
getMetaInfo returns a copy of the memory object information
~IceSharedMemoryProvider() override
MemoryObjectMetaInfo::PointerType getMetaInfo(bool threadSafe=true) const
getMetaInfo returns a copy of the memory object information
int getSize(const Ice::Current &c=Ice::emptyCurrent) override
return memory size via ice.
void setMetaInfo(const typename MemoryObjectMetaInfo::PointerType &info, bool threadSafe=true)
IceUtil::Handle< IceSharedMemoryProvider< MemoryObject, MemoryObjectMetaInfo > > pointer_type
pointer type for convenience.
SharedMemoryScopedReadLockPtr getScopedReadLock() const
void start()
Starts the memory provider.
SharedMemoryScopedWriteLockPtr getScopedWriteLock() const
Retrieve scoped lock for writing to the memory.
IceSharedMemoryProvider(ManagedIceObject *object, int size, int capacity=0, std::string nameSuffix="")
Creates an ice shared memory provider which transparentely communicates using shared memory on local ...
void stop()
Removes this object from Ice.
void unlock()
unlock memory after writing
void lock()
lock memory for writing
Blob getData(MetaInfoSizeBasePtr &info, const Ice::Current &c=Ice::emptyCurrent) override
return data via ice.
IceSharedMemoryProvider(ManagedIceObject *object, typename MemoryObjectMetaInfo::PointerType info, std::string nameSuffix="")
MemoryObject * getBuffer()
Retrieve pointer to buffer.
The ManagedIceObject is the base class for all ArmarX objects.
The SharedMemoryProvider creates a shared memory segment for writing.
std::shared_ptr< SharedMemoryProvider< MemoryObject, MemoryObjectMetaInfo > > pointer_type
Pointer type for convenience.
::IceInternal::Handle<::Ice::ObjectAdapter > ObjectAdapterPtr
This file offers overloads of toIce() and fromIce() functions for STL container types.
std::shared_ptr< SharedMemoryScopedWriteLock > SharedMemoryScopedWriteLockPtr
std::shared_ptr< SharedMemoryScopedReadLock > SharedMemoryScopedReadLockPtr