diff options
author | Simon Marlow <marlowsd@gmail.com> | 2008-05-28 12:52:58 +0000 |
---|---|---|
committer | Simon Marlow <marlowsd@gmail.com> | 2008-05-28 12:52:58 +0000 |
commit | 526c3af1dc98987b6949f4df73c0debccf9875bd (patch) | |
tree | e9dd06d73e2f4281cec06d1f46ae63f1063799e6 /compiler/utils/FastMutInt.lhs | |
parent | 842e9d6628a27cf1f420d53f6a5901935dc50c54 (diff) | |
download | haskell-526c3af1dc98987b6949f4df73c0debccf9875bd.tar.gz |
Use MD5 checksums for recompilation checking (fixes #1372, #1959)
This is a much more robust way to do recompilation checking. The idea
is to create a fingerprint of the ABI of an interface, and track
dependencies by recording the fingerprints of ABIs that a module
depends on. If any of those ABIs have changed, then we need to
recompile.
In bug #1372 we weren't recording dependencies on package modules,
this patch fixes that by recording fingerprints of package modules
that we depend on. Within a package there is still fine-grained
recompilation avoidance as before.
We currently use MD5 for fingerprints, being a good compromise between
efficiency and security. We're not worried about attackers, but we
are worried about accidental collisions.
All the MD5 sums do make interface files a bit bigger, but compile
times on the whole are about the same as before. Recompilation
avoidance should be a bit more accurate than in 6.8.2 due to fixing
#1959, especially when using -O.
Diffstat (limited to 'compiler/utils/FastMutInt.lhs')
-rw-r--r-- | compiler/utils/FastMutInt.lhs | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/compiler/utils/FastMutInt.lhs b/compiler/utils/FastMutInt.lhs index 2039ee5df9..00aba34bba 100644 --- a/compiler/utils/FastMutInt.lhs +++ b/compiler/utils/FastMutInt.lhs @@ -7,7 +7,10 @@ \begin{code} module FastMutInt( FastMutInt, newFastMutInt, - readFastMutInt, writeFastMutInt + readFastMutInt, writeFastMutInt, + + FastMutPtr, newFastMutPtr, + readFastMutPtr, writeFastMutPtr ) where #ifdef __GLASGOW_HASKELL__ @@ -19,6 +22,7 @@ module FastMutInt( import GHC.Base import GHC.IOBase +import GHC.Ptr #else /* ! __GLASGOW_HASKELL__ */ @@ -29,6 +33,10 @@ import Data.IORef newFastMutInt :: IO FastMutInt readFastMutInt :: FastMutInt -> IO Int writeFastMutInt :: FastMutInt -> Int -> IO () + +newFastMutPtr :: IO FastMutPtr +readFastMutPtr :: FastMutPtr -> IO (Ptr a) +writeFastMutPtr :: FastMutPtr -> Ptr a -> IO () \end{code} \begin{code} @@ -47,6 +55,21 @@ readFastMutInt (FastMutInt arr) = IO $ \s -> writeFastMutInt (FastMutInt arr) (I# i) = IO $ \s -> case writeIntArray# arr 0# i s of { s -> (# s, () #) } + +data FastMutPtr = FastMutPtr (MutableByteArray# RealWorld) + +newFastMutPtr = IO $ \s -> + case newByteArray# size s of { (# s, arr #) -> + (# s, FastMutPtr arr #) } + where I# size = SIZEOF_VOID_P + +readFastMutPtr (FastMutPtr arr) = IO $ \s -> + case readAddrArray# arr 0# s of { (# s, i #) -> + (# s, Ptr i #) } + +writeFastMutPtr (FastMutPtr arr) (Ptr i) = IO $ \s -> + case writeAddrArray# arr 0# i s of { s -> + (# s, () #) } #else /* ! __GLASGOW_HASKELL__ */ --maybe someday we could use --http://haskell.org/haskellwiki/Library/ArrayRef @@ -67,6 +90,23 @@ readFastMutInt (FastMutInt ioRefInt) = readIORef ioRefInt -- FastMutInt is strict in the value it contains. writeFastMutInt (FastMutInt ioRefInt) i = i `seq` writeIORef ioRefInt i + + +newtype FastMutPtr = FastMutPtr (IORef (Ptr ())) + +-- 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 Ptr? +-- 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. +newFastMutPtr = fmap FastMutPtr (newIORef (castPtr nullPtr)) + +readFastMutPtr (FastMutPtr ioRefPtr) = readIORef ioRefPtr + +-- FastMutPtr is strict in the value it contains. +writeFastMutPtr (FastMutPtr ioRefPtr) i = i `seq` writeIORef ioRefPtr i #endif \end{code} |