Intel® oneAPI Threading Building Blocks
Ask questions and share information about adding parallelism to your applications when using this threading library.
2466 Discussions

Installing an SEH (structured exception handler) in every thread

Hauke_H_
Beginner
713 Views

Hi all,

I tried to install my own handler for structured exceptions in every thread using the following code:

/// Translates strucutred exceptions to C++ exceptions
void structuredExceptionTranslator(unsigned int code, _EXCEPTION_POINTERS *ep)/// Translates strucutred exceptions to C++ exceptions by throwing a
void structuredExceptionTranslator(unsigned int code, _EXCEPTION_POINTERS *ep)
{
  throw std::exception();
}

/// Installs a handler for structured exceptions in every thread.
class StructuredExceptionHandlerInstaller : public tbb::task_scheduler_observer
{
public:
  StructuredExceptionHandlerInstaller()
  {
    observe(true);
  }
  void on_scheduler_entry(bool is_worker)
  {
    if (is_worker)
      _set_se_translator(structuredExceptionTranslator);
  }
};

/// main program
int main(int argc, char *argv[])
{
  // set translator function in order to translate strucutred exceptions to C++ exceptions
  _set_se_translator(structuredExceptionTranslator);
  StructuredExceptionHandlerInstaller g_SEHHandler;

  // execute the main program in a guarded section in order to catch all exceptions and log them before exiting
  try
  {
    // do stuff, including using tbb::parallel_for
    return EXIT_SUCCESS;
  }
  catch (...)
  {
    // log the exception
    // return a failure code
    return EXIT_FAILURE;
  }
}

However, some structured exceptions originating from inside parallel_for loops are still not handled by my custom SEH. This seems to be the case whenever I generate a parallel_for loop with more iterations than CPUs and with the context tbb::task_group_context(tbb::task_group_context::isolated) given to parallel_for. I am guessing that my handler does not get installed for all threads but I have no clue why that could be the case.

On the other hand, even if my SEH is called, it sometimes ends up failing an assertion:

Assertion p >= 0 && p < num_priority_levels failed on line 103 of file z:\itt\branch_tbb41\tbb\1.0\s
rc\tbb\scheduler_common.h

I found the related piece of code online:
inline void assert_priority_valid ( intptr_t& p ) {    __TBB_ASSERT_EX( p >= 0 && p < num_priority_levels, NULL );}
But again, I have no idea as to why this happens.

I'd be greatful to any hints, esp. since I am a novice w.r.t. TBB.

Thanks,
Andreas.

0 Kudos
1 Reply
Hauke_H_
Beginner
713 Views

I have devised a more simple and self contained example and posted it here: http://ideone.com/2kgMZu

The issue I have is that I do not deterministically get the output "seh exception caught". Sometimes the program simply crashes without catching any exceptions, i.e. I experience the old school behavior for SEH exceptions.

I tested with Visual Studio 2012, VC11 Update 3 and TBB 4.1 Update 3 (and 4, also the commercial version). The compiler switch /EHa is enabled and I am working with 64bit executables.

Any suggestions what I might be doing wrong would be highly welcome.

Regards, Hauke

p.s. The last post has been submitted by a colleague of mine with my consent and I hope that we did not violate any forum rules.

0 Kudos
Reply