32 #include <ArmarXCore/interface/core/ManagedIceObjectDefinitions.h>
33 #include <ArmarXCore/interface/core/SharedMemory.h>
49 template <
class MemoryObject,
class MemoryObjectMetaInfo = MetaInfoSizeBase>
52 virtual public SharedMemoryConsumerInterface
65 std::string providerName,
66 std::string nameSuffix =
"")
69 this->
object = object;
70 this->providerName = providerName;
71 memoryName = providerName +
"Memory" + nameSuffix;
72 transferMode = eSharedMem;
74 object->usingProxy(providerName);
92 if (object->
getState() < eManagedIceObjectStarting)
102 if (transferMode == eIce)
104 ARMARX_INFO_S <<
"Transfer mode already set. Skipping autodetection";
110 <<
"Unable to determine hardware id. Using ice memory transfer as fallback.";
117 transferMode = eSharedMem;
120 catch (std::exception& e)
124 <<
"Initialization of shared memory '" << providerName
125 <<
"' failed - failing back to Ice memory transfer - reason: " << e.what();
138 typename MemoryObjectMetaInfo::PointerType info;
148 getData(std::vector<MemoryObject>&
data,
typename MemoryObjectMetaInfo::PointerType& info)
150 if (transferMode == eSharedMem)
152 return getDataSharedMemory(
data, info);
156 return getDataIce(
data, info);
160 typename MemoryObjectMetaInfo::PointerType
163 if (transferMode == eSharedMem)
166 typename MemoryObjectMetaInfo::PointerType info =
167 sharedMemoryConsumer->getMetaInfo();
172 return memoryProxy->getMetaInfo();
184 if (transferMode == eSharedMem)
186 return sharedMemoryConsumer->getSize();
190 return memoryProxy->getSize();
227 initIce(Ice::ObjectPrx providerProxy)
231 memoryProxy =
object->getProxy<SharedMemoryProviderInterfacePrx>(memoryName,
true);
233 catch (std::exception& e)
237 "Error retrieving shared memory proxy. An exception occured when calling "
238 "object->getProxy<SharedMemoryProviderInterfacePrx>():")
239 <<
"\nOriginal exception: " << e.what();
245 "Error retrieving shared memory proxy. An exception occured when calling "
246 "object->getProxy<SharedMemoryProviderInterfacePrx>().");
253 "Error retrieving shared memory proxy: The returned memory proxy is NULL.");
264 sharedMemoryConsumer.reset(
272 getDataSharedMemory(std::vector<MemoryObject>&
data,
273 typename MemoryObjectMetaInfo::PointerType& info)
278 auto p = this->sharedMemoryConsumer->getMetaInfo(
false);
282 using Ptr =
typename MemoryObjectMetaInfo::PointerType;
283 info = Ptr::dynamicCast(
new typename SharedMemoryType::Wrapper(*p));
287 throw exceptions::local::SharedMemoryConnectionFailure(memoryName,
288 "Info pointer is null.");
293 memcpy(
data.data(), sharedMemoryConsumer->getMemory(), size);
300 getDataIce(std::vector<MemoryObject>&
data,
301 typename MemoryObjectMetaInfo::PointerType& info)
304 auto baseInfo = MetaInfoSizeBasePtr::dynamicCast(info);
306 if (!baseInfo && info)
308 throw exceptions::local::SharedMemoryConnectionFailure(
309 memoryName,
"Error casting info var to base type.");
315 blob = memoryProxy->getData(baseInfo);
320 data.resize(baseInfo->size);
324 throw exceptions::local::SharedMemoryConnectionFailure(
326 "Error retrieving data from shared memory proxy: " +
330 using Ptr =
typename MemoryObjectMetaInfo::PointerType;
331 info = Ptr::dynamicCast(baseInfo);
333 if (!info && baseInfo)
335 throw exceptions::local::SharedMemoryConnectionFailure(
336 memoryName,
"Error casting back info var to desired type.");
339 memcpy(
data.data(), blob.data(), info->size);
345 SharedMemoryProviderInterfacePrx memoryProxy;
346 std::string memoryName;
347 std::string providerName;
350 using SharedMemoryType = SharedMemoryConsumer<MemoryObject, MemoryObjectMetaInfo>;
354 TransferMode transferMode;
355 ManagedIceObject* object;