[lld] r287794 - Make log(), error() and fatal() thread-safe.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 24 09:19:40 PST 2016


I think we are okay with nondeterministic order of error messages, just
like if you have multiple errors in your repository, executing `ninja`
eventually prints them to the terminal in a nondeterministic order.

On Wed, Nov 23, 2016 at 8:17 PM, Sean Silva <chisophugis at gmail.com> wrote:

> 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/20161124/54c296c1/attachment.html>


More information about the llvm-commits mailing list