[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