Index: managed_open_or_create_impl.hpp =================================================================== RCS file: /cvsroot/boost/boost/boost/interprocess/detail/managed_open_or_create_impl.hpp,v retrieving revision 1.2 diff -d -u -r1.2 managed_open_or_create_impl.hpp --- managed_open_or_create_impl.hpp 23 Mar 2007 16:05:01 -0000 1.2 +++ managed_open_or_create_impl.hpp 13 Apr 2007 17:55:21 -0000 @@ -301,28 +301,27 @@ volatile boost::uint32_t *addr = static_cast(region.get_address()); - boost::uint32_t value; + boost::uint32_t value; - switch(detail::atomic_read32(addr)){ - case UninitializedSegment: - case InitializingSegment: - do{ - detail::thread_yield(); - value = detail::atomic_read32(addr); - } - while(value == InitializingSegment || value == UninitializedSegment); - case CorruptedSegment: - throw interprocess_exception(error_info(corrupted_error)); - break; - case InitializedSegment: - construct_func((char*)region.get_address() + ManagedOpenOrCreateUserOffset, region.get_size(), false); - //All ok, just move resources to the external mapped region - mregion.swap(region); - break; - default: - throw interprocess_exception(error_info(corrupted_error)); - break; - } + value = detail::atomic_read32(addr); + + // wait if shared segment isn't initialized + do{ + detail::thread_yield(); + value = detail::atomic_read32(addr); + } + while(value == InitializingSegment || value == UninitializedSegment); + + if(value != InitializedSegment){ + throw interprocess_exception(error_info(corrupted_error)); + } + + // InitializedSegment + construct_func((char*)region.get_address() + ManagedOpenOrCreateUserOffset, region.get_size(), false); + + // All ok, just move resources to the external mapped region + mregion.swap(region); + } }