Make SharedDataFacade try to cleanup
This commit is contained in:
parent
847f530c8e
commit
caa7c994a0
@ -3,9 +3,9 @@
|
|||||||
|
|
||||||
#include "engine/datafacade/shared_datafacade.hpp"
|
#include "engine/datafacade/shared_datafacade.hpp"
|
||||||
|
|
||||||
|
#include "storage/shared_barriers.hpp"
|
||||||
#include "storage/shared_datatype.hpp"
|
#include "storage/shared_datatype.hpp"
|
||||||
#include "storage/shared_memory.hpp"
|
#include "storage/shared_memory.hpp"
|
||||||
#include "storage/shared_barriers.hpp"
|
|
||||||
|
|
||||||
#include <boost/interprocess/sync/named_upgradable_mutex.hpp>
|
#include <boost/interprocess/sync/named_upgradable_mutex.hpp>
|
||||||
#include <boost/thread/lock_types.hpp>
|
#include <boost/thread/lock_types.hpp>
|
||||||
@ -102,8 +102,10 @@ class DataWatchdog
|
|||||||
boost::upgrade_to_unique_lock<boost::upgrade_mutex> unique_facade_lock(facade_lock);
|
boost::upgrade_to_unique_lock<boost::upgrade_mutex> unique_facade_lock(facade_lock);
|
||||||
|
|
||||||
current_timestamp = *shared_timestamp;
|
current_timestamp = *shared_timestamp;
|
||||||
facade = std::make_shared<datafacade::SharedDataFacade>(
|
facade = std::make_shared<datafacade::SharedDataFacade>(shared_barriers,
|
||||||
current_timestamp.layout, current_timestamp.data, current_timestamp.timestamp);
|
current_timestamp.layout,
|
||||||
|
current_timestamp.data,
|
||||||
|
current_timestamp.timestamp);
|
||||||
|
|
||||||
return get_locked_facade();
|
return get_locked_facade();
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include "storage/shared_datatype.hpp"
|
#include "storage/shared_datatype.hpp"
|
||||||
#include "storage/shared_memory.hpp"
|
#include "storage/shared_memory.hpp"
|
||||||
|
#include "storage/shared_barriers.hpp"
|
||||||
#include "engine/datafacade/datafacade_base.hpp"
|
#include "engine/datafacade/datafacade_base.hpp"
|
||||||
|
|
||||||
#include "extractor/compressed_edge_container.hpp"
|
#include "extractor/compressed_edge_container.hpp"
|
||||||
@ -65,6 +66,7 @@ class SharedDataFacade final : public BaseDataFacade
|
|||||||
storage::SharedDataLayout *data_layout;
|
storage::SharedDataLayout *data_layout;
|
||||||
char *shared_memory;
|
char *shared_memory;
|
||||||
|
|
||||||
|
std::shared_ptr<storage::SharedBarriers> shared_barriers;
|
||||||
storage::SharedDataType layout_region;
|
storage::SharedDataType layout_region;
|
||||||
storage::SharedDataType data_region;
|
storage::SharedDataType data_region;
|
||||||
unsigned shared_timestamp;
|
unsigned shared_timestamp;
|
||||||
@ -379,13 +381,44 @@ class SharedDataFacade final : public BaseDataFacade
|
|||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~SharedDataFacade() {}
|
|
||||||
|
|
||||||
SharedDataFacade(storage::SharedDataType layout_region_,
|
// this function handle the deallocation of the shared memory it we can prove it will not be used anymore
|
||||||
|
virtual ~SharedDataFacade()
|
||||||
|
{
|
||||||
|
boost::interprocess::scoped_lock<boost::interprocess::named_sharable_mutex>
|
||||||
|
exclusive_lock(data_region == storage::DATA_1 ? shared_barriers->regions_1_mutex
|
||||||
|
: shared_barriers->regions_2_mutex,
|
||||||
|
boost::interprocess::defer_lock);
|
||||||
|
|
||||||
|
// if this returns false this is still in use
|
||||||
|
if (exclusive_lock.try_lock())
|
||||||
|
{
|
||||||
|
// Now check if this is still the newest dataset
|
||||||
|
const boost::interprocess::sharable_lock<boost::interprocess::named_upgradable_mutex> lock(
|
||||||
|
shared_barriers->current_regions_mutex);
|
||||||
|
|
||||||
|
auto shared_regions = storage::makeSharedMemory(storage::CURRENT_REGIONS);
|
||||||
|
const auto current_timestamp =
|
||||||
|
static_cast<const storage::SharedDataTimestamp *>(shared_regions->Ptr());
|
||||||
|
|
||||||
|
if (current_timestamp->timestamp == shared_timestamp)
|
||||||
|
{
|
||||||
|
util::SimpleLogger().Write(logDEBUG) << "Retaining data with shared timestamp " << shared_timestamp;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
storage::SharedMemory::Remove(data_region);
|
||||||
|
storage::SharedMemory::Remove(layout_region);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SharedDataFacade(const std::shared_ptr<storage::SharedBarriers> &shared_barriers_,
|
||||||
|
storage::SharedDataType layout_region_,
|
||||||
storage::SharedDataType data_region_,
|
storage::SharedDataType data_region_,
|
||||||
unsigned shared_timestamp_)
|
unsigned shared_timestamp_)
|
||||||
: layout_region(layout_region_), data_region(data_region_),
|
: shared_barriers(shared_barriers_), layout_region(layout_region_),
|
||||||
shared_timestamp(shared_timestamp_)
|
data_region(data_region_), shared_timestamp(shared_timestamp_)
|
||||||
{
|
{
|
||||||
util::SimpleLogger().Write(logDEBUG) << "Loading new data with shared timestamp "
|
util::SimpleLogger().Write(logDEBUG) << "Loading new data with shared timestamp "
|
||||||
<< shared_timestamp;
|
<< shared_timestamp;
|
||||||
|
Loading…
Reference in New Issue
Block a user