mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-07-19 19:34:29 +08:00
Fix undefined behaviour caused by uncaught exceptions in OMP section
An OpenMP parallel section must have a single entry and a single point of exit. Leaving such a section by throwing an exception is undefined. This patch fixes this by catching possible exceptions on the parallel section and throwing right we left it.
This commit is contained in:
parent
b933946d63
commit
9f202c6f1e
@ -132,7 +132,8 @@ void parallelize_gemm(const Functor& func, Index rows, Index cols, Index depth,
|
||||
|
||||
ei_declare_aligned_stack_constructed_variable(GemmParallelInfo<Index>,info,threads,0);
|
||||
|
||||
#pragma omp parallel num_threads(threads)
|
||||
int errorCount = 0;
|
||||
#pragma omp parallel num_threads(threads) reduction(+: errorCount)
|
||||
{
|
||||
Index i = omp_get_thread_num();
|
||||
// Note that the actual number of threads might be lower than the number of request ones.
|
||||
@ -151,9 +152,14 @@ void parallelize_gemm(const Functor& func, Index rows, Index cols, Index depth,
|
||||
info[i].lhs_start = r0;
|
||||
info[i].lhs_length = actualBlockRows;
|
||||
|
||||
EIGEN_TRY {
|
||||
if(transpose) func(c0, actualBlockCols, 0, rows, info);
|
||||
else func(0, rows, c0, actualBlockCols, info);
|
||||
} EIGEN_CATCH(...) {
|
||||
++errorCount;
|
||||
}
|
||||
}
|
||||
if (errorCount) EIGEN_THROW_X(Eigen::eigen_assert_exception());
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -109,5 +109,7 @@ void memoryleak()
|
||||
|
||||
void test_exceptions()
|
||||
{
|
||||
EIGEN_TRY {
|
||||
CALL_SUBTEST( memoryleak() );
|
||||
} EIGEN_CATCH(...) {}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user