X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FScopeGuard.h;h=ad96afdc4c5a37a1a9944437d1b77a9b8daba591;hb=0e7c824d239f6668be1afb2ffd334f89ce294c80;hp=940a34855aa0602f3e5cc8ab2f7aa320088de3dd;hpb=64543f316205c32e421a2090a5d35d4c113498a5;p=folly.git diff --git a/folly/ScopeGuard.h b/folly/ScopeGuard.h index 940a3485..ad96afdc 100644 --- a/folly/ScopeGuard.h +++ b/folly/ScopeGuard.h @@ -1,5 +1,5 @@ /* - * Copyright 2016 Facebook, Inc. + * Copyright 2017 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -75,6 +76,17 @@ class ScopeGuardImplBase { dismissed_ = true; } + template + FOLLY_ALWAYS_INLINE static void runAndWarnAboutToCrashOnException( + T& function) noexcept { + try { + function(); + } catch (...) { + warnAboutToCrash(); + std::terminate(); + } + } + protected: ScopeGuardImplBase() noexcept : dismissed_(false) {} @@ -88,6 +100,9 @@ class ScopeGuardImplBase { } bool dismissed_; + + private: + static void warnAboutToCrash() noexcept; }; template @@ -151,7 +166,9 @@ class ScopeGuardImpl : public ScopeGuardImplBase { void* operator new(std::size_t) = delete; - void execute() noexcept { function_(); } + void execute() noexcept { + runAndWarnAboutToCrashOnException(function_); + } FunctionType function_; }; @@ -185,7 +202,7 @@ namespace detail { * If the parameter is false, then the function is executed if no new uncaught * exceptions are present at the end of the scope. * - * Used to implement SCOPE_FAIL and SCOPE_SUCCES below. + * Used to implement SCOPE_FAIL and SCOPE_SUCCESS below. */ template class ScopeGuardForNewException { @@ -205,7 +222,11 @@ class ScopeGuardForNewException { ~ScopeGuardForNewException() noexcept(executeOnException) { if (executeOnException == exceptionCounter_.isNewUncaughtException()) { - function_(); + if (executeOnException) { + ScopeGuardImplBase::runAndWarnAboutToCrashOnException(function_); + } else { + function_(); + } } }