import qualified Data.Vector.Storable.ByteString as S
import qualified Data.Vector.Storable.ByteString.Char8 as S8
import qualified Data.Vector.Storable.ByteString.Lazy as L
import qualified Data.Vector.Storable.ByteString.Lazy.Char8 as L8
import Control.Monad
import System.Directory
import System.Mem
import System.IO
import Data.Vector.Storable.ByteString.Internal
import Foreign.ForeignPtr
main = do
writeFile "a" "x"
------------------------------------------------------------------------
-- readFile tests
print "Testing resource leaks for Strict.readFile"
forM_ [1..n] $ const $ do
r <- S.readFile "a"
S.writeFile "b" (S8.pack "abc")
renameFile "b" "a"
print "Testing resource leaks for Lazy.readFile"
forM_ [1..n] $ const $ do
r <- L.readFile "a"
L.length r `seq` return () -- force the input, and done with 'r' now.
L.writeFile "b" (L8.pack "abc") -- but we still need the finalizers to run
renameFile "b" "a"
-- manage the resources explicitly.
print "Testing resource leaks when converting lazy to strict"
forM_ [1..n] $ const $ do
let release c = finalizeForeignPtr fp where (fp,_,_) = toForeignPtr c
r <- L.readFile "a"
mapM_ release (L.toChunks r) -- should close it.
L.writeFile "b" (L8.pack "abc")
renameFile "b" "a"
------------------------------------------------------------------------
-- hGetContents tests
-- works now
print "Testing strict hGetContents"
forM_ [1..n] $ const $ do
h <- openFile "a" ReadMode
r <- S.hGetContents h -- should be strict, and hClosed.
S.last r `seq` return ()
S.writeFile "b" (S8.pack "abc")
renameFile "b" "a"
-- works now
print "Testing lazy hGetContents"
forM_ [1..n] $ const $ do
h <- openFile "a" ReadMode
r <- L.hGetContents h -- should be strict, and hClosed.
L.last r `seq` return ()
L.writeFile "b" (L8.pack "abc")
renameFile "b" "a"
n = 1000