#include <tbb/tbb.h>
#include <iostream>
tbb::atomic<bool> caused_exception; // we want to cause an exception only once
struct seh_exception {};
void sehExceptionTranslator(unsigned int code, struct _EXCEPTION_POINTERS *ep)
{
throw seh_exception();
}
void causeSehException()
{
// ensure that we have an exception translator even in sub_tasks
_set_se_translator(sehExceptionTranslator);
// cause the exception exactly once
if (!caused_exception.compare_and_swap(true, false))
{
volatile int *pInt = 0x00000000;
*pInt = 20;
}
}
void causeSehExceptionInTbbThread()
{
tbb::parallel_for(0, 8, [&](int i)
{
tbb::this_tbb_thread::sleep(tbb::tick_count::interval_t( 0.5 ));
causeSehException();
});
}
int main()
{
caused_exception = false;
_set_se_translator(sehExceptionTranslator);
try
{
causeSehExceptionInTbbThread();
}
catch (seh_exception&)
{
std::cout << "seh exception caught" << std::endl;
}
}
I2luY2x1ZGUgPHRiYi90YmIuaD4KCiNpbmNsdWRlIDxpb3N0cmVhbT4KCnRiYjo6YXRvbWljPGJvb2w+IGNhdXNlZF9leGNlcHRpb247IC8vIHdlIHdhbnQgdG8gY2F1c2UgYW4gZXhjZXB0aW9uIG9ubHkgb25jZQoKc3RydWN0IHNlaF9leGNlcHRpb24ge307Cgp2b2lkIHNlaEV4Y2VwdGlvblRyYW5zbGF0b3IodW5zaWduZWQgaW50IGNvZGUsIHN0cnVjdCBfRVhDRVBUSU9OX1BPSU5URVJTICplcCkKewogIHRocm93IHNlaF9leGNlcHRpb24oKTsKfQoKdm9pZCBjYXVzZVNlaEV4Y2VwdGlvbigpCnsKICAvLyBlbnN1cmUgdGhhdCB3ZSBoYXZlIGFuIGV4Y2VwdGlvbiB0cmFuc2xhdG9yIGV2ZW4gaW4gc3ViX3Rhc2tzCiAgX3NldF9zZV90cmFuc2xhdG9yKHNlaEV4Y2VwdGlvblRyYW5zbGF0b3IpOwoKICAvLyBjYXVzZSB0aGUgZXhjZXB0aW9uIGV4YWN0bHkgb25jZQogIGlmICghY2F1c2VkX2V4Y2VwdGlvbi5jb21wYXJlX2FuZF9zd2FwKHRydWUsIGZhbHNlKSkKICB7CiAgICB2b2xhdGlsZSBpbnQgKnBJbnQgPSAweDAwMDAwMDAwOwogICAgKnBJbnQgPSAyMDsKICB9Cn0KCnZvaWQgY2F1c2VTZWhFeGNlcHRpb25JblRiYlRocmVhZCgpCnsgIAogIHRiYjo6cGFyYWxsZWxfZm9yKDAsIDgsIFsmXShpbnQgaSkKICB7ICAgIAogICAgdGJiOjp0aGlzX3RiYl90aHJlYWQ6OnNsZWVwKHRiYjo6dGlja19jb3VudDo6aW50ZXJ2YWxfdCggMC41ICkpOwogICAgY2F1c2VTZWhFeGNlcHRpb24oKTsKICB9KTsKfQoKaW50IG1haW4oKQp7CiAgY2F1c2VkX2V4Y2VwdGlvbiA9IGZhbHNlOwoKICBfc2V0X3NlX3RyYW5zbGF0b3Ioc2VoRXhjZXB0aW9uVHJhbnNsYXRvcik7CiAgdHJ5CiAgewogICAgY2F1c2VTZWhFeGNlcHRpb25JblRiYlRocmVhZCgpOwogIH0KICBjYXRjaCAoc2VoX2V4Y2VwdGlvbiYpIAogIHsKICAgIHN0ZDo6Y291dCA8PCAic2VoIGV4Y2VwdGlvbiBjYXVnaHQiIDw8IHN0ZDo6ZW5kbDsKICB9Cn0K