[lld] r287794 - Make log(), error() and fatal() thread-safe.
Sean Silva via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 23 20:17:30 PST 2016
Even with locking, the output will not be deterministic. Is that something
we are okay with? I think we should avoid it.
-- Sean Silva
On Wed, Nov 23, 2016 at 10:34 AM, Rui Ueyama via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: ruiu
> Date: Wed Nov 23 12:34:28 2016
> New Revision: 287794
>
> URL: http://llvm.org/viewvc/llvm-project?rev=287794&view=rev
> Log:
> Make log(), error() and fatal() thread-safe.
>
> Modified:
> lld/trunk/ELF/Error.cpp
>
> Modified: lld/trunk/ELF/Error.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Error.
> cpp?rev=287794&r1=287793&r2=287794&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/Error.cpp (original)
> +++ lld/trunk/ELF/Error.cpp Wed Nov 23 12:34:28 2016
> @@ -14,6 +14,7 @@
> #include "llvm/Support/Error.h"
> #include "llvm/Support/ManagedStatic.h"
> #include "llvm/Support/raw_ostream.h"
> +#include <mutex>
>
> #if !defined(_MSC_VER) && !defined(__MINGW32__)
> #include <unistd.h>
> @@ -28,19 +29,28 @@ uint64_t elf::ErrorCount;
> raw_ostream *elf::ErrorOS;
> StringRef elf::Argv0;
>
> +// The functions defined in this file can be called from multiple threads,
> +// but outs() or errs() are not thread-safe. We protect them using a
> mutex.
> +static std::mutex Mu;
> +
> void elf::log(const Twine &Msg) {
> + std::lock_guard<std::mutex> Lock(Mu);
> if (Config->Verbose)
> outs() << Argv0 << ": " << Msg << "\n";
> }
>
> void elf::warn(const Twine &Msg) {
> - if (Config->FatalWarnings)
> + if (Config->FatalWarnings) {
> error(Msg);
> - else
> - *ErrorOS << Argv0 << ": warning: " << Msg << "\n";
> + return;
> + }
> + std::lock_guard<std::mutex> Lock(Mu);
> + *ErrorOS << Argv0 << ": warning: " << Msg << "\n";
> }
>
> void elf::error(const Twine &Msg) {
> + std::lock_guard<std::mutex> Lock(Mu);
> +
> if (Config->ErrorLimit == 0 || ErrorCount < Config->ErrorLimit) {
> *ErrorOS << Argv0 << ": error: " << Msg << "\n";
> } else if (ErrorCount == Config->ErrorLimit) {
> @@ -69,6 +79,7 @@ void elf::exitLld(int Val) {
> }
>
> void elf::fatal(const Twine &Msg) {
> + std::lock_guard<std::mutex> Lock(Mu);
> *ErrorOS << Argv0 << ": error: " << Msg << "\n";
> exitLld(1);
> }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161123/c37d1977/attachment.html>
More information about the llvm-commits
mailing list