[LinuxVersion] Use "Construct on first use" idiom and add mutex
Compare changes
Files
2+ 22
− 10
@@ -35,19 +36,30 @@ static auto checked_strtol(const std::string& s) -> long {
Use the "Construct on first use" idom for UTS Release (aka Linux version) initialization. The previous implementation was fragle and could lead to segfaults like
__s2=0x7fffffffe480 "5.16.10-arch1-1", __s1=<optimized out>)
at /usr/include/c++/11.2.0/bits/char_traits.h:409
__n=<optimized out>, __s=0x7fffffffe480 "5.16.10-arch1-1", __d=<optimized out>)
at /usr/include/c++/11.2.0/bits/basic_string.h:359
__n=<optimized out>, __s=0x7fffffffe480 "5.16.10-arch1-1", __d=<optimized out>)
at /usr/include/c++/11.2.0/bits/basic_string.h:354
__str=..., this=0x7ffff7fbd2a0 <emper::lib::LinuxVersion::globalVersion[abi:cxx11]>)
at /usr/include/c++/11.2.0/bits/basic_string.h:739
at ../emper/lib/LinuxVersion.cpp:46
at /usr/include/c++/11.2.0/ext/new_allocator.h:79
if globalVersion's constructor was not yet called. This is the so called "static initialization order fiasco" in C++.
While the mutex may not be strictly requires, as we do not call LinuxVersion's non-argument constructor nor getUtsRelease() concurrently, it can not hurt to have one.
Closes !347 (closed).