@@ -100,7 +100,7 @@ class basic_bgzf_istreambuf : public std::basic_streambuf<Elem, Tr>
100100
101101 std::mutex cs;
102102 std::condition_variable readyEvent;
103- bool ready;
103+ std::atomic< bool > ready;
104104 bool bgzfEofMarker;
105105
106106 DecompressionJob () :
@@ -121,7 +121,7 @@ class basic_bgzf_istreambuf : public std::basic_streambuf<Elem, Tr>
121121 size (other.size),
122122 cs (),
123123 readyEvent (),
124- ready (other.ready),
124+ ready (other.ready.load() ),
125125 bgzfEofMarker (other.bgzfEofMarker)
126126 {}
127127 };
@@ -168,7 +168,7 @@ class basic_bgzf_istreambuf : public std::basic_streambuf<Elem, Tr>
168168 job.readyEvent .wait (lock,
169169 [&job]
170170 {
171- return job.ready ;
171+ return job.ready . load () ;
172172 });
173173 assert (job.ready == true );
174174 }
@@ -262,15 +262,16 @@ class basic_bgzf_istreambuf : public std::basic_streambuf<Elem, Tr>
262262 if (!job.ready )
263263 {
264264 // decompress block
265- job. size = _decompressBlock (&job.buffer [0 ] + MAX_PUTBACK,
266- job.buffer .capacity (),
267- &job.inputBuffer [0 ],
268- job.compressedSize ,
269- compressionCtx);
265+ auto decompressed_size = _decompressBlock (&job.buffer [0 ] + MAX_PUTBACK,
266+ job.buffer .capacity (),
267+ &job.inputBuffer [0 ],
268+ job.compressedSize ,
269+ compressionCtx);
270270
271271 // signal that job is ready
272272 {
273273 std::unique_lock<std::mutex> lock (job.cs );
274+ job.size = decompressed_size;
274275 job.ready = true ;
275276 }
276277 job.readyEvent .notify_all ();
@@ -366,7 +367,7 @@ class basic_bgzf_istreambuf : public std::basic_streambuf<Elem, Tr>
366367 job.readyEvent .wait (lock,
367368 [&job]
368369 {
369- return job.ready ;
370+ return job.ready . load () ;
370371 });
371372 }
372373
@@ -492,7 +493,7 @@ class basic_bgzf_istreambuf : public std::basic_streambuf<Elem, Tr>
492493 job.readyEvent .wait (lock,
493494 [&job]
494495 {
495- return job.ready ;
496+ return job.ready . load () ;
496497 });
497498 }
498499
0 commit comments