mirror of
https://github.com/FairRootGroup/FairMQ.git
synced 2025-10-15 09:31:45 +00:00
FairMQ: Introduce callbacks for the FairMQUnmanagedRegion.
Callbacks are called when the data buffer of the message assiciated with the corresponding region is no longer needed by the transport. Example in examples/advanced/Region/
This commit is contained in:
committed by
Mohammad Al-Turany
parent
378c47c5e5
commit
58a312b730
@@ -7,26 +7,21 @@
|
||||
********************************************************************************/
|
||||
|
||||
#include "FairMQUnmanagedRegionSHM.h"
|
||||
#include "FairMQShmManager.h"
|
||||
#include "FairMQShmCommon.h"
|
||||
#include "Common.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace fair::mq::shmem;
|
||||
|
||||
namespace bipc = boost::interprocess;
|
||||
|
||||
atomic<bool> FairMQUnmanagedRegionSHM::fInterrupted(false);
|
||||
unordered_map<uint64_t, RemoteRegion> FairMQUnmanagedRegionSHM::fRemoteRegionMap;
|
||||
|
||||
FairMQUnmanagedRegionSHM::FairMQUnmanagedRegionSHM(const size_t size)
|
||||
: fRegion(nullptr)
|
||||
FairMQUnmanagedRegionSHM::FairMQUnmanagedRegionSHM(Manager& manager, const size_t size, FairMQRegionCallback callback)
|
||||
: fManager(manager)
|
||||
, fRegion(nullptr)
|
||||
, fRegionId(0)
|
||||
, fRegionIdStr()
|
||||
, fRemote(false)
|
||||
{
|
||||
try
|
||||
{
|
||||
RegionCounter* rc = Manager::Instance().ManagementSegment().find<RegionCounter>(bipc::unique_instance).first;
|
||||
RegionCounter* rc = fManager.ManagementSegment().find<RegionCounter>(bipc::unique_instance).first;
|
||||
if (rc)
|
||||
{
|
||||
LOG(DEBUG) << "shmem: region counter found, with value of " << rc->fCount << ". incrementing.";
|
||||
@@ -36,29 +31,13 @@ FairMQUnmanagedRegionSHM::FairMQUnmanagedRegionSHM(const size_t size)
|
||||
else
|
||||
{
|
||||
LOG(DEBUG) << "shmem: no region counter found, creating one and initializing with 1";
|
||||
rc = Manager::Instance().ManagementSegment().construct<RegionCounter>(bipc::unique_instance)(1);
|
||||
rc = fManager.ManagementSegment().construct<RegionCounter>(bipc::unique_instance)(1);
|
||||
LOG(DEBUG) << "shmem: initialized region counter with: " << rc->fCount;
|
||||
}
|
||||
|
||||
fRegionId = rc->fCount;
|
||||
fRegionIdStr = "fairmq_shmem_region_" + to_string(fRegionId);
|
||||
|
||||
auto it = fRemoteRegionMap.find(fRegionId);
|
||||
if (it != fRemoteRegionMap.end())
|
||||
{
|
||||
LOG(ERROR) << "Trying to create a region that already exists";
|
||||
}
|
||||
else
|
||||
{
|
||||
string regionIdStr = "fairmq_shmem_region_" + to_string(fRegionId);
|
||||
|
||||
LOG(DEBUG) << "creating region with id " << fRegionId;
|
||||
|
||||
auto r = fRemoteRegionMap.emplace(fRegionId, RemoteRegion{regionIdStr, size});
|
||||
fRegion = &(r.first->second.fRegion);
|
||||
|
||||
LOG(DEBUG) << "created region with id " << fRegionId;
|
||||
}
|
||||
fRegion = fManager.CreateRegion(size, fRegionId, callback);
|
||||
}
|
||||
catch (bipc::interprocess_exception& e)
|
||||
{
|
||||
@@ -78,22 +57,7 @@ size_t FairMQUnmanagedRegionSHM::GetSize() const
|
||||
return fRegion->get_size();
|
||||
}
|
||||
|
||||
bipc::mapped_region* FairMQUnmanagedRegionSHM::GetRemoteRegion(uint64_t regionId)
|
||||
{
|
||||
auto it = fRemoteRegionMap.find(regionId);
|
||||
if (it != fRemoteRegionMap.end())
|
||||
{
|
||||
return &(it->second.fRegion);
|
||||
}
|
||||
else
|
||||
{
|
||||
string regionIdStr = "fairmq_shmem_region_" + to_string(regionId);
|
||||
|
||||
auto r = fRemoteRegionMap.emplace(regionId, RemoteRegion{regionIdStr, 0});
|
||||
return &(r.first->second.fRegion);
|
||||
}
|
||||
}
|
||||
|
||||
FairMQUnmanagedRegionSHM::~FairMQUnmanagedRegionSHM()
|
||||
{
|
||||
fManager.RemoveRegion(fRegionId);
|
||||
}
|
||||
|
Reference in New Issue
Block a user