[llvm] r239566 - [Support] Fix a race initializing a static local in MSVC
David Majnemer
david.majnemer at gmail.com
Fri Jun 12 09:42:10 PDT 2015
On Fri, Jun 12, 2015 at 7:56 AM, Mehdi Amini <mehdi.amini at apple.com> wrote:
> Hi Reid,
>
> Can you explain how the change makes it thread safe? It’s not obvious to
> me right now.
>
In the MSVC world, loads marked volatile have acquire semantics and stores
marked volatile have release semantics. We actually don't need such strong
semantics here, just a monotonic guarantee on the loads and stores which
volatile will more or less give us on GCC (for mingw builds and the like).
It contains a benign race but we are OK with that (two threads might both
compute the allocation granularity but they will both produce the same
result.)
>
> Thanks,
>
> Mehdi
>
> > On Jun 11, 2015, at 3:22 PM, Reid Kleckner <reid at kleckner.net> wrote:
> >
> > Author: rnk
> > Date: Thu Jun 11 17:22:45 2015
> > New Revision: 239566
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=239566&view=rev
> > Log:
> > [Support] Fix a race initializing a static local in MSVC
> >
> > static local initialization isn't thread safe with MSVC and a race was
> > reported in PR23817. We can't use std::atomic because it's not trivially
> > constructible, so instead do some lame volatile global integer
> > manipulation.
> >
> > Modified:
> > llvm/trunk/lib/Support/Windows/Memory.inc
> >
> > Modified: llvm/trunk/lib/Support/Windows/Memory.inc
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Memory.inc?rev=239566&r1=239565&r2=239566&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/Support/Windows/Memory.inc (original)
> > +++ llvm/trunk/lib/Support/Windows/Memory.inc Thu Jun 11 17:22:45 2015
> > @@ -78,7 +78,15 @@ MemoryBlock Memory::allocateMappedMemory
> > // While we'd be happy to allocate single pages, the Windows allocation
> > // granularity may be larger than a single page (in practice, it is
> 64K)
> > // so mapping less than that will create an unreachable fragment of
> memory.
> > - static const size_t Granularity = getAllocationGranularity();
> > + // Avoid using one-time initialization of static locals here, since
> they
> > + // aren't thread safe with MSVC.
> > + static volatile size_t GranularityCached;
> > + size_t Granularity = GranularityCached;
> > + if (Granularity == 0) {
> > + Granularity = getAllocationGranularity();
> > + GranularityCached = Granularity;
> > + }
> > +
> > const size_t NumBlocks = (NumBytes+Granularity-1)/Granularity;
> >
> > uintptr_t Start = NearBlock ?
> reinterpret_cast<uintptr_t>(NearBlock->base()) +
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150612/bd1b6bd1/attachment.html>
More information about the llvm-commits
mailing list