[llvm] r236741 - Fix another hang caused by ManagedStatic in SignalHandler
Justin Bogner
mail at justinbogner.com
Thu May 7 11:29:11 PDT 2015
Steven Wu <stevenwu at apple.com> writes:
> Author: steven_wu
> Date: Thu May 7 11:20:51 2015
> New Revision: 236741
>
> URL: http://llvm.org/viewvc/llvm-project?rev=236741&view=rev
> Log:
> Fix another hang caused by ManagedStatic in SignalHandler
>
> Fix two other variables that might cause the same hang fixed in r235914.
> The hang is caused by constructing ManagedStatic in signalhandler. In
> this case, if FileToRemove or CallBacksToRun is not contructed, it means
> there is no work to do.
>
> Modified:
> llvm/trunk/lib/Support/Unix/Signals.inc
>
> Modified: llvm/trunk/lib/Support/Unix/Signals.inc
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Signals.inc?rev=236741&r1=236740&r2=236741&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Support/Unix/Signals.inc (original)
> +++ llvm/trunk/lib/Support/Unix/Signals.inc Thu May 7 11:20:51 2015
> @@ -139,6 +139,11 @@ static void UnregisterHandlers() {
> /// NB: This must be an async signal safe function. It cannot allocate or free
> /// memory, even in debug builds.
> static void RemoveFilesToRemove() {
> + // Avoid constructing ManagedStatic in the signal handler.
> + // If FilesToRemove is not constructed, there are no files to remove.
> + if (!FilesToRemove.isConstructed())
> + return;
> +
> // We avoid iterators in case of debug iterators that allocate or release
> // memory.
> std::vector<std::string>& FilesToRemoveRef = *FilesToRemove;
> @@ -200,10 +205,12 @@ static RETSIGTYPE SignalHandler(int Sig)
> }
>
> // Otherwise if it is a fault (like SEGV) run any handler.
> - std::vector<std::pair<void (*)(void *), void *>>& CallBacksToRunRef =
> - *CallBacksToRun;
> - for (unsigned i = 0, e = CallBacksToRun->size(); i != e; ++i)
> - CallBacksToRunRef[i].first(CallBacksToRunRef[i].second);
> + if (CallBacksToRun.isConstructed()) {
> + std::vector<std::pair<void (*)(void *), void *>>& CallBacksToRunRef =
> + *CallBacksToRun;
This looks like a job for "auto &".
> + for (unsigned i = 0, e = CallBacksToRun->size(); i != e; ++i)
> + CallBacksToRunRef[i].first(CallBacksToRunRef[i].second);
> + }
>
> #ifdef __s390__
> // On S/390, certain signals are delivered with PSW Address pointing to
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list