Skip to content

Commit d0f13f3

Browse files
authored
Merge pull request #3406 from eseiler/fix/datarace
fix(bgzf): datarace
2 parents 9c6ed4c + 5e5c05a commit d0f13f3

File tree

1 file changed

+11
-10
lines changed

1 file changed

+11
-10
lines changed

include/seqan3/contrib/stream/bgzf_istream.hpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)