Skip to content
Snippets Groups Projects

Fix hang in slices with only run number 0

Merged Roel Aaij requested to merge fix_run_number_0 into master
All threads resolved!
2 files
+ 21
11
Compare changes
  • Side-by-side
  • Inline
Files
2
@@ -1653,28 +1653,37 @@ void MEPProvider::transpose( int thread_id ) {
break;
}
// Notify any threads waiting in get_slice that a slice is available
{
if ( have_odin ) {
std::scoped_lock lock{m_transpose_mut, m_buffer_mutex};
// Update transposed status
if ( have_odin ) {
transpose_it->slice_index = *slice_index;
transpose_it->n_transposed = n_transposed;
} else {
m_transposed.erase( transpose_it );
m_slice_to_buffer[*slice_index] = {};
}
transpose_it->slice_index = *slice_index;
transpose_it->n_transposed = n_transposed;
if ( n_transposed != std::get<1>( interval ) - std::get<0>( interval ) && have_odin ) {
// If not all events were transposed, some extra work is needed.
if ( n_transposed != std::get<1>( interval ) - std::get<0>( interval ) ) {
auto& status = m_buffer_status[i_buffer];
status.work_counter += 1;
status.intervals.emplace_back( std::get<0>( interval ) + n_transposed, std::get<1>( interval ) );
} else if ( m_input_done && no_intervals() && m_transposed.empty() ) {
}
// Check if we're done
else if ( m_input_done && no_intervals() && m_transposed.empty() ) {
m_transpose_done = true;
}
} else {
// Discard the slice if there is no valid ODIN
{
std::scoped_lock lock{m_transpose_mut, m_buffer_mutex};
m_transposed.erase( transpose_it );
}
if ( msgLevel( MSG::DEBUG ) ) {
debug() << "Transpose " << thread_id << ": No ODIN; discard slice " << *slice_index << endmsg;
}
++m_slice_without_odin;
slice_free( *slice_index );
}
// The slice is good, Notify any threads waiting in get_slice that a slice is available
if ( m_transpose_done ) {
m_transpose_cond.notify_all();
} else if ( have_odin ) {
Loading