TH: Use atomicModifyIORef' for fresh names
authorErik de Castro Lopo <erikd@mega-nerd.com>
Tue, 27 Sep 2016 21:37:33 +0000 (07:37 +1000)
committerErik de Castro Lopo <erikd@mega-nerd.com>
Tue, 27 Sep 2016 21:37:34 +0000 (07:37 +1000)
This prevents the possibility of race conditions when creating fresh
names.

Test Plan: validate

Reviewers: goldfire, austin, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D2548

libraries/template-haskell/Language/Haskell/TH/Syntax.hs

index 20c2396..00ac0b3 100644 (file)
@@ -112,9 +112,8 @@ class Monad m => Quasi m where
 -----------------------------------------------------
 
 instance Quasi IO where
-  qNewName s = do { n <- readIORef counter
-                 ; writeIORef counter (n+1)
-                 ; return (mkNameU s n) }
+  qNewName s = do { n <- atomicModifyIORef' counter (\x -> (x + 1, x))
+                  ; pure (mkNameU s n) }
 
   qReport True  msg = hPutStrLn stderr ("Template Haskell error: " ++ msg)
   qReport False msg = hPutStrLn stderr ("Template Haskell error: " ++ msg)