diff --git a/include/seqan3/contrib/stream/bgzf_istream.hpp b/include/seqan3/contrib/stream/bgzf_istream.hpp index 0f01139363..e2b89d3977 100644 --- a/include/seqan3/contrib/stream/bgzf_istream.hpp +++ b/include/seqan3/contrib/stream/bgzf_istream.hpp @@ -100,7 +100,7 @@ class basic_bgzf_istreambuf : public std::basic_streambuf std::mutex cs; std::condition_variable readyEvent; - bool ready; + std::atomic ready; bool bgzfEofMarker; DecompressionJob() : @@ -121,7 +121,7 @@ class basic_bgzf_istreambuf : public std::basic_streambuf size(other.size), cs(), readyEvent(), - ready(other.ready), + ready(other.ready.load()), bgzfEofMarker(other.bgzfEofMarker) {} }; @@ -168,7 +168,7 @@ class basic_bgzf_istreambuf : public std::basic_streambuf job.readyEvent.wait(lock, [&job] { - return job.ready; + return job.ready.load(); }); assert(job.ready == true); } @@ -262,15 +262,16 @@ class basic_bgzf_istreambuf : public std::basic_streambuf if (!job.ready) { // decompress block - job.size = _decompressBlock(&job.buffer[0] + MAX_PUTBACK, - job.buffer.capacity(), - &job.inputBuffer[0], - job.compressedSize, - compressionCtx); + auto decompressed_size = _decompressBlock(&job.buffer[0] + MAX_PUTBACK, + job.buffer.capacity(), + &job.inputBuffer[0], + job.compressedSize, + compressionCtx); // signal that job is ready { std::unique_lock lock(job.cs); + job.size = decompressed_size; job.ready = true; } job.readyEvent.notify_all(); @@ -366,7 +367,7 @@ class basic_bgzf_istreambuf : public std::basic_streambuf job.readyEvent.wait(lock, [&job] { - return job.ready; + return job.ready.load(); }); } @@ -492,7 +493,7 @@ class basic_bgzf_istreambuf : public std::basic_streambuf job.readyEvent.wait(lock, [&job] { - return job.ready; + return job.ready.load(); }); }