Opened 5 years ago
Last modified 5 years ago
#13309 new Bugs
function_address_holder::get_module/::get implementations are not thread-safe
| Reported by: | Owned by: | Ion Gaztañaga | |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | interprocess |
| Version: | Boost 1.63.0 | Severity: | Problem |
| Keywords: | Cc: |
Description
The discussion in the git review https://github.com/boostorg/filesystem/pull/59#discussion_r152524074 showed that the implementations of function_address_holder::get_module and function_address_holder::get are not completely atomic, because the loop conditions
for(unsigned i = 0; ModuleStates[id] < 2; ++i){
and
for(unsigned i = 0; FunctionStates[id] < 2; ++i){
are not using a read barrier for the variables ModuleStates[id] and FunctionStates[id].
It seems that proper thread-safety using interlocked operations could be realized by emulating an interlocked read-acquire operation via the BOOST_INTERLOCKED_COMPARE_EXCHANGE(&N, 0, 0) idiom.
I can make a concrete pull request if agreement exists on the approach

The relevant file is
boost/interprocess/detail/win32_api.hpp