Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Alex D
GHC
Commits
25ad1147
Commit
25ad1147
authored
Jun 01, 2007
by
Isaac Dupree
Browse files
implement FastMutInt in non-GHC using IORefs (#1405)
ghc still works, also the module was tested in hugs and ghc
parent
9bbcd77c
Changes
1
Hide whitespace changes
Inline
Side-by-side
compiler/utils/FastMutInt.lhs
View file @
25ad1147
...
...
@@ -10,36 +10,61 @@ module FastMutInt(
readFastMutInt, writeFastMutInt
) where
#include "MachDeps.h"
#include "HsVersions.h"
#ifdef __GLASGOW_HASKELL__
#include "MachDeps.h"
#ifndef SIZEOF_HSINT
#define SIZEOF_HSINT INT_SIZE_IN_BYTES
#endif
import GHC.Base
import GHC.IOBase
#else /* ! __GLASGOW_HASKELL__ */
import Data.IORef
#endif
newFastMutInt :: IO FastMutInt
readFastMutInt :: FastMutInt -> IO Int
writeFastMutInt :: FastMutInt -> Int -> IO ()
\end{code}
\begin{code}
#ifdef __GLASGOW_HASKELL__
data FastMutInt = FastMutInt (MutableByteArray# RealWorld)
newFastMutInt :: IO FastMutInt
newFastMutInt = IO $ \s ->
case newByteArray# size s of { (# s, arr #) ->
(# s, FastMutInt arr #) }
where I# size = SIZEOF_HSINT
readFastMutInt :: FastMutInt -> IO Int
readFastMutInt (FastMutInt arr) = IO $ \s ->
case readIntArray# arr 0# s of { (# s, i #) ->
(# s, I# i #) }
writeFastMutInt :: FastMutInt -> Int -> IO ()
writeFastMutInt (FastMutInt arr) (I# i) = IO $ \s ->
case writeIntArray# arr 0# i s of { s ->
(# s, () #) }
#else /* ! __GLASGOW_HASKELL__ */
newtype FastMutInt = FastMutInt (IORef Int)
-- If any default value was chosen, it surely would be 0,
-- so we will use that since IORef requires a default value.
-- Or maybe it would be more interesting to package an error,
-- assuming nothing relies on being able to read a bogus Int?
-- That could interfere with its strictness for smart optimizers
-- (are they allowed to optimize a 'newtype' that way?) ...
-- Well, maybe that can be added (in DEBUG?) later.
newFastMutInt = fmap FastMutInt (newIORef 0)
readFastMutInt (FastMutInt ioRefInt) = readIORef ioRefInt
-- FastMutInt is strict in the value it contains.
writeFastMutInt (FastMutInt ioRefInt) i = i `seq` writeIORef ioRefInt i
#endif
\end{code}
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment