aboutsummaryrefslogtreecommitdiff
path: root/libbutl/builtin.ixx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2022-07-14 17:01:18 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2022-07-14 17:01:18 +0200
commitf07a6606e44d7bba88efa55615075a917704bde1 (patch)
tree2cd1a002188fcae9bc0797dc6f58b46546d13bdc /libbutl/builtin.ixx
parentfd02ec768ea360ca8d1a4a1da33bd0fef42d0653 (diff)
Set builtin result while holding mutex
While the original code was probably correct, there is suspicion this is causing a TSAN false-positive.
Diffstat (limited to 'libbutl/builtin.ixx')
-rw-r--r--libbutl/builtin.ixx12
1 files changed, 7 insertions, 5 deletions
diff --git a/libbutl/builtin.ixx b/libbutl/builtin.ixx
index 24fbae3..d77590b 100644
--- a/libbutl/builtin.ixx
+++ b/libbutl/builtin.ixx
@@ -47,13 +47,14 @@ namespace butl
//
template <typename F>
inline builtin::async_state::
- async_state (F f)
- : thread ([f = std::move (f), this] () mutable noexcept
+ async_state (uint8_t& r, F f)
+ : thread ([this, &r, f = std::move (f)] () mutable noexcept
{
- f ();
+ uint8_t t (f ());
{
unique_lock l (this->mutex);
+ r = t;
finished = true;
}
@@ -68,9 +69,10 @@ namespace butl
{
std::unique_ptr<builtin::async_state> s (
new builtin::async_state (
- [f = std::move (f), &r] () mutable noexcept
+ r,
+ [f = std::move (f)] () mutable noexcept -> uint8_t
{
- r = f ();
+ return f ();
}));
return builtin (r, move (s));