Subject: [Boost-bugs] [Boost C++ Libraries] #10180: shared_memory_object assertion when used with boost unit test
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2014-07-07 05:00:56
#10180: shared_memory_object assertion when used with boost unit test
---------------------------+------------------------------
Reporter: andrew.lang@⦠| Type: Bugs
Status: new | Milestone: To Be Determined
Component: None | Version: Boost 1.55.0
Severity: Problem | Keywords:
---------------------------+------------------------------
I am running with Visual Studio 2010, and boost 1.55.
When I run a simple unit test with shared_memory_object, I get an
assertion on shutdown.
The test itself creates a shared memory object, maps it to memory, and
writes to it; it then opens a shared memory object of the same name and
reads from it. This works fine.
On exit, the fini_atomic_func functor in intermodule_singleton_common is
run to clean up. This does the following:
{{{
ref_count_ptr *rcount =
intermodule_singleton_helpers::thread_safe_global_map_dependant
<ThreadSafeGlobalMap>::find(m_map, typeid(C).name());
//The object must exist
BOOST_ASSERT(rcount);
}}}
The assertion fails. In the debugger I can see that typeid(C).name() has
returned a rubbish string, and therefore no map entry is found. When that
same code is executed in init_atomic_func, typeid(C).name() returns
"struct boost::interprocess::ipcdetail::windows_bootstamp" as expected.
Following the relevant memory address in the debugger, I see that the
typeid string is erased in the unit test's framework::shutdown() function.
This is done deliberately to eliminate fake memory leak reports from the
typeid strings. See boost\test\impl\framework.ipp.
Unfortunately the interprocess cleanup is done via a handler registered
with std::atexit, which guarantees it will be after framework has run
shutdown. I don't see any options on either side (boost unit test or boost
interprocess) which would allow the order to be fixed up.
Simplest code to reproduce:
{{{
#include <boost/test/unit_test.hpp>
#include <boost/interprocess/shared_memory_object.hpp>
namespace IP = boost::interprocess;
BOOST_AUTO_TEST_SUITE( TestSharedMemory )
BOOST_AUTO_TEST_CASE( CauseAssertionFailure )
{
IP::shared_memory_object lShared( IP::open_only, "test_string",
IP::read_only );
BOOST_REQUIRE( lShared.get_name() != 0 );
}
BOOST_AUTO_TEST_SUITE_END()
}}}
-- Ticket URL: <https://svn.boost.org/trac/boost/ticket/10180> Boost C++ Libraries <http://www.boost.org/> Boost provides free peer-reviewed portable C++ source libraries.
This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:16 UTC