fix shared mem warnings

This commit is contained in:
Emil Tin 2014-06-27 23:01:19 +02:00 committed by Emil Tin
parent 7817384e3c
commit 7eb810c34a

View File

@ -60,6 +60,43 @@ typedef StaticGraph<QueryEdge::EdgeData> QueryGraph;
#include <fstream> #include <fstream>
#include <string> #include <string>
// delete a shared memory region. report warning if it could not be deleted
void delete_region(const SharedDataType region)
{
if (SharedMemory::RegionExists(region) )
{
if( !SharedMemory::Remove(region))
{
const std::string name = [&]
{
switch (region)
{
case CURRENT_REGIONS: return "CURRENT_REGIONS";
case LAYOUT_1: return "LAYOUT_1";
case DATA_1: return "DATA_1";
case LAYOUT_2: return "LAYOUT_2";
case DATA_2: return "DATA_2";
case LAYOUT_NONE: return "LAYOUT_NONE";
case DATA_NONE: return "DATA_NONE";
}
}();
SimpleLogger().Write(logWARNING) << "could not delete shared memory region " << name;
}
}
}
// find all existing shmem regions and remove them.
void springclean()
{
SimpleLogger().Write() << "spring-cleaning all shared memory regions";
delete_region(DATA_1);
delete_region(LAYOUT_1);
delete_region(DATA_2);
delete_region(LAYOUT_2);
delete_region(CURRENT_REGIONS);
}
int main(const int argc, const char *argv[]) int main(const int argc, const char *argv[])
{ {
LogPolicy::GetInstance().Unmute(); LogPolicy::GetInstance().Unmute();
@ -96,36 +133,14 @@ int main(const int argc, const char *argv[])
SimpleLogger().Write(logDEBUG) << "Checking input parameters"; SimpleLogger().Write(logDEBUG) << "Checking input parameters";
ServerPaths server_paths; ServerPaths server_paths;
bool springclean = false; bool should_springclean = false;
if (!GenerateDataStoreOptions(argc, argv, server_paths, springclean)) if (!GenerateDataStoreOptions(argc, argv, server_paths, should_springclean))
{ {
return 0; return 0;
} }
if (springclean) if (should_springclean)
{ {
SimpleLogger().Write() << "spring-cleaning all shared memory regions"; springclean();
// find all existing shmem regions and remove them.
if (SharedMemory::RegionExists(DATA_1) && !SharedMemory::Remove(DATA_1))
{
SimpleLogger().Write(logWARNING) << "could not delete DATA_1";
}
if (SharedMemory::RegionExists(LAYOUT_1) && !SharedMemory::Remove(LAYOUT_1))
{
SimpleLogger().Write(logWARNING) << "could not delete LAYOUT_1";
}
if (SharedMemory::RegionExists(DATA_2) && !SharedMemory::Remove(DATA_2))
{
SimpleLogger().Write(logWARNING) << "could not delete DATA_2";
}
if (SharedMemory::RegionExists(LAYOUT_2) && !SharedMemory::Remove(LAYOUT_2))
{
SimpleLogger().Write(logWARNING) << "could not delete LAYOUT_2";
}
if (SharedMemory::RegionExists(CURRENT_REGIONS) &&
!SharedMemory::Remove(CURRENT_REGIONS))
{
SimpleLogger().Write(logWARNING) << "could not delete CURRENT_REGIONS";
}
return 0; return 0;
} }
@ -193,27 +208,27 @@ int main(const int argc, const char *argv[])
BOOST_ASSERT(!paths_iterator->second.empty()); BOOST_ASSERT(!paths_iterator->second.empty());
const boost::filesystem::path &geometries_data_path = paths_iterator->second; const boost::filesystem::path &geometries_data_path = paths_iterator->second;
// get the shared memory segment to use // determine segment to use
bool use_first_segment = SharedMemory::RegionExists(LAYOUT_2); bool segment2_in_use = SharedMemory::RegionExists(LAYOUT_2);
const SharedDataType LAYOUT = [&] const SharedDataType layout_region = [&]
{ {
if (use_first_segment) return segment2_in_use ? LAYOUT_1 : LAYOUT_2;
{
return LAYOUT_1;
}
return LAYOUT_2;
}(); }();
const SharedDataType DATA = [&] const SharedDataType data_region = [&]
{ {
if (use_first_segment) return segment2_in_use ? DATA_1 : DATA_2;
{ }();
return DATA_1; const SharedDataType previous_layout_region = [&]
} {
return DATA_2; return segment2_in_use ? LAYOUT_2 : LAYOUT_1;
}();
const SharedDataType previous_data_region = [&]
{
return segment2_in_use ? DATA_2 : DATA_1;
}(); }();
// Allocate a memory layout in shared memory, deallocate previous // Allocate a memory layout in shared memory, deallocate previous
SharedMemory *layout_memory = SharedMemoryFactory::Get(LAYOUT, sizeof(SharedDataLayout)); SharedMemory *layout_memory = SharedMemoryFactory::Get(layout_region, sizeof(SharedDataLayout));
SharedDataLayout *shared_layout_ptr = static_cast<SharedDataLayout *>(layout_memory->Ptr()); SharedDataLayout *shared_layout_ptr = static_cast<SharedDataLayout *>(layout_memory->Ptr());
shared_layout_ptr = new (layout_memory->Ptr()) SharedDataLayout(); shared_layout_ptr = new (layout_memory->Ptr()) SharedDataLayout();
@ -344,7 +359,7 @@ int main(const int argc, const char *argv[])
SimpleLogger().Write() << "allocating shared memory of " SimpleLogger().Write() << "allocating shared memory of "
<< shared_layout_ptr->GetSizeOfLayout() << " bytes"; << shared_layout_ptr->GetSizeOfLayout() << " bytes";
SharedMemory *shared_memory = SharedMemory *shared_memory =
SharedMemoryFactory::Get(DATA, shared_layout_ptr->GetSizeOfLayout()); SharedMemoryFactory::Get(data_region, shared_layout_ptr->GetSizeOfLayout());
char *shared_memory_ptr = static_cast<char *>(shared_memory->Ptr()); char *shared_memory_ptr = static_cast<char *>(shared_memory->Ptr());
// read actual data into shared memory object // // read actual data into shared memory object //
@ -533,35 +548,11 @@ int main(const int argc, const char *argv[])
barrier.no_running_queries_condition.wait(query_lock); barrier.no_running_queries_condition.wait(query_lock);
} }
data_timestamp_ptr->layout = LAYOUT; data_timestamp_ptr->layout = layout_region;
data_timestamp_ptr->data = DATA; data_timestamp_ptr->data = data_region;
data_timestamp_ptr->timestamp += 1; data_timestamp_ptr->timestamp += 1;
if (use_first_segment) delete_region(previous_data_region);
{ delete_region(previous_layout_region);
BOOST_ASSERT(DATA == DATA_1);
BOOST_ASSERT(LAYOUT == LAYOUT_1);
if (!SharedMemory::Remove(DATA_2))
{
SimpleLogger().Write(logWARNING) << "could not delete DATA_2";
}
if (!SharedMemory::Remove(LAYOUT_2))
{
SimpleLogger().Write(logWARNING) << "could not delete LAYOUT_2";
}
}
else
{
BOOST_ASSERT(DATA == DATA_2);
BOOST_ASSERT(LAYOUT == LAYOUT_2);
if (!SharedMemory::Remove(DATA_1))
{
SimpleLogger().Write(logWARNING) << "could not delete DATA_1";
}
if (!SharedMemory::Remove(LAYOUT_1))
{
SimpleLogger().Write(logWARNING) << "could not delete LAYOUT_1";
}
}
SimpleLogger().Write() << "all data loaded"; SimpleLogger().Write() << "all data loaded";
shared_layout_ptr->PrintInformation(); shared_layout_ptr->PrintInformation();