Skip to content

Instantly share code, notes, and snippets.

@RyanGlScott
Last active November 16, 2016 01:24
Show Gist options
  • Save RyanGlScott/0e6ed613d9a94ee2bb76edc904ec972d to your computer and use it in GitHub Desktop.
Save RyanGlScott/0e6ed613d9a94ee2bb76edc904ec972d to your computer and use it in GitHub Desktop.

atomic-primops issues on Windows

atomic-primops is a package which has foreign imports of functions from the GHC runtime system, e.g.,

-- | Memory barrier implemented by the GHC rts (see SMP.h).
foreign import ccall  unsafe "store_load_barrier" storeLoadBarrier
  :: IO ()

For some reason, this causes GHC's runtime linker to choke.

Setup

  1. git clone https://github.com/rrnewton/haskell-lockfree (I'm using commit 0ea12fc141c6bd4762773a1adc2f005de068369c)
  2. cd atomic-primops/
  3. Apply the following change:
diff --git a/atomic-primops/Data/Atomics.hs b/atomic-primops/Data/Atomics.hs
index da0b790..8081b15 100644
--- a/atomic-primops/Data/Atomics.hs
+++ b/atomic-primops/Data/Atomics.hs
@@ -448,7 +448,7 @@ casMutVar2 mv tick new = IO$ \st ->

 -- GHC 7.8 consistently exposes these symbols while linking:

-#if MIN_VERSION_base(4,7,0) && !defined(mingw32_HOST_OS)
+#if MIN_VERSION_base(4,7,0)
 #warning "Assuming that store_load_barrier and friends are defined in the GHC RTS."

 -- | Memory barrier implemented by the GHC rts (see SMP.h).

By doing this, we expose the foreign import of storeLoadBarrier on Windows.

If you're on GHC HEAD, you'll also need this change:

diff --git a/atomic-primops/Setup.hs b/atomic-primops/Setup.hs
index ddf5a02..1a768a1 100644
--- a/atomic-primops/Setup.hs
+++ b/atomic-primops/Setup.hs
@@ -5,7 +5,7 @@ import Distribution.Simple                (defaultMainWithHooks, simpleUserHooks
 import Distribution.Simple.Utils          (cabalVersion)
 import Distribution.Simple.LocalBuildInfo
 import Distribution.Simple.Setup          (ConfigFlags)
-import Distribution.Version               (Version(..))
+import qualified Distribution.Version as Cabal
 import Distribution.PackageDescription    (PackageDescription)
 import Debug.Trace

@@ -13,10 +13,10 @@ import Debug.Trace
 -- here to do it instead:
 checkGoodVersion :: IO ()
 checkGoodVersion =
-  if   cabalVersion >= Version [1,17,0] []
+  if   cabalVersion >= Cabal.mkVersion [1,17,0]
   then putStrLn (" [Setup.hs] This version of Cabal is ok for profiling: "++show cabalVersion)
   else error (" [Setup.hs] This package should not be used in profiling mode with cabal version "++
-                        show (versionBranch cabalVersion)++" < 1.17.0\n"++
+                        show (Cabal.versionNumbers cabalVersion)++" < 1.17.0\n"++
                         " It will break, see cabal issue #1284")

 main :: IO ()

Then run cabal install .

The issue

If you have this program (SLB.hs):

module Main (main) where

import Data.Atomics

main :: IO ()
main = do
  putStrLn "1"
  storeLoadBarrier
  putStrLn "2"

And then runghc SLB.hs:

ghc.exe: C:\Users\RyanGlScott\AppData\Roaming\cabal\x86_64-windows-ghc-8.0.1\atomic-primops-0.8.0.4-CRx9AqVw5b495jOfQbTd3E\HSatomic-primops-0.8.0.4-CRx9AqVw5b495jOfQbTd3E.o: unknown symbol `store_load_barrier'

SLB.hs: SLB.hs: unable to load package `atomic-primops-0.8.0.4'

Compiling it with ghc SLB.hs and then running the executable works without issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment