[Pkg-haskell-commits] [SCM] haskell-testpack branch, master, updated. debian/1.0.2-1-4-gb0d6b36
John Goerzen
jgoerzen at complete.org
Fri Apr 23 14:50:52 UTC 2010
The following commit has been merged in the master branch:
commit 0425d1944722cc5f81903d69300543c0d68942ca
Author: John Goerzen <jgoerzen at complete.org>
Date: Thu Dec 16 05:23:31 2004 +0100
Checkpointing
Keywords:
(jgoerzen at complete.org--projects/missingh--head--0.7--patch-77)
diff --git a/ChangeLog b/ChangeLog
index b9b81d5..1a53971 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,18 @@
# arch-tag: automatic-ChangeLog--jgoerzen at complete.org--projects/missingh--head--0.7
#
+2004-12-15 22:23:31 GMT John Goerzen <jgoerzen at complete.org> patch-77
+
+ Summary:
+ Checkpointing
+ Revision:
+ missingh--head--0.7--patch-77
+
+
+ modified files:
+ ChangeLog libsrc/MissingH/HVIO.hs
+
+
2004-12-15 20:45:05 GMT John Goerzen <jgoerzen at complete.org> patch-76
Summary:
diff --git a/libsrc/MissingH/HVIO.hs b/libsrc/MissingH/HVIO.hs
index ffc5d19..0d966ec 100644
--- a/libsrc/MissingH/HVIO.hs
+++ b/libsrc/MissingH/HVIO.hs
@@ -264,19 +264,87 @@ instance HVIOReader StreamReader where
return c
----------------------------------------------------------------------
+-- Buffers
+----------------------------------------------------------------------
+
+{- | Simulate true I\/O on a buffer.
+
+-}
+newtype MemoryVIO = MemoryVIO (VIOCloseSupport (Int, String))
+
+newMemoryVIO :: IO MemoryVIO
+newMemoryVIO = do ref <- newIORef (True, (0, ""))
+ return (MemoryVIO ref)
+
+vrv (MemoryVIO x) = x
+
+-- | Grab the entire contents of the buffer as a string.
+getMemoryVIOBuffer :: MemoryVIO -> IO String
+getMemoryVIOBuffer h = do c <- vioc_get (vrv h)
+ return (snd c)
+
+instance Show MemoryVIO where
+ show _ = "<MemoryVIO>"
+
+instance HVIOGeneric MemoryVIO where
+ vClose = vioc_close . vrv
+ vIsEOF h = do vTestOpen h
+ c <- vioc_get (vrv h)
+ return ((length (snd c)) == (fst c))
+ vIsOpen = vioc_isopen . vrv
+
+instance HVIOReader MemoryVIO where
+ vGetChar h = do vTestEOF h
+ c <- vioc_get (vrv h)
+ let retval = (snd c) !! (fst c)
+ vioc_set (vrv h) (succ (fst c), snd c)
+ return retval
+ vGetContents h = do vTestEOF h
+ v <- vioc_get (vrv h)
+ let retval = drop (fst v) (snd v)
+ vioc_set (vrv h) (-1, "")
+ vClose h
+ return retval
+
+instance HVIOWriter MemoryVIO where
+ vPutStr h s = do (pos, buf) <- vioc_get (vrv h)
+ let (pre, post) = splitAt pos buf
+ let newbuf = pre ++ s ++ (drop (length buf) post)
+ vioc_set (vrv h) (pos + (length buf), newbuf)
+ vPutChar h c = vPutStr h [c]
+
+instance HVIOSeeker MemoryVIO where
+ vTell h = do v <- vioc_get (vrv h)
+ return . fromIntegral $ (fst v)
+ vSeek h seekmode seekposp =
+ do (pos, buf) <- vioc_get (vrv h)
+ let seekpos = fromInteger seekposp
+ let newpos = case seekmode of
+ AbsoluteSeek -> seekpos
+ RelativeSeek -> pos + seekpos
+ SeekFromEnd -> (length buf) + seekpos
+ let buf2 = buf ++ if newpos > (length buf)
+ then replicate (newpos - (length buf)) '\0'
+ else []
+ vioc_set (vrv h) (newpos, buf2)
+
+----------------------------------------------------------------------
-- Pipes
----------------------------------------------------------------------
newPipe :: IO (PipeReader, PipeWriter)
newPipe = do mv <- newEmptyMVar
- return (PipeReader (True, mv), PipeWriter (True, mv))
+ readerref <- newIORef (True, mv)
+ let reader = PipeReader readerref
+ writerref <- newIORef (True, reader)
+ return (reader, PipeWriter writerref)
data PipeBit = PipeBit Char
| PipeEOF
deriving (Eq, Show)
newtype PipeReader = PipeReader (VIOCloseSupport (MVar PipeBit))
-newtype PipeWriter = PipeWriter (VIOCloseSupport (MVar PipeBit))
+newtype PipeWriter = PipeWriter (VIOCloseSupport PipeReader)
------------------------------
-- Pipe Reader
@@ -319,6 +387,9 @@ instance HVIOReader PipeReader where
------------------------------
pwv (PipeWriter x) = x
+pwmv (PipeWriter x) = do mv1 <- vioc_get x
+ vioc_get (prv mv1)
+
instance Show PipeWriter where
show x = "<PipeWriter>"
@@ -326,16 +397,20 @@ instance Show PipeWriter where
instance HVIOGeneric PipeWriter where
vClose h = do o <- vIsOpen h
if o then do
- mv <- vioc_get (pwv h)
+ mv <- pwmv h
putMVar mv PipeEOF
vioc_close (pwv h)
else return ()
vIsOpen = vioc_isopen . pwv
- vIsEOF h = vTestOpen h
- return False
+ vIsEOF h = do vTestOpen h
+ return False
instance HVIOWriter PipeWriter where
+ -- FIXME: race condition below (could be closed after testing)
vPutChar h c = do vTestOpen h
- mv <- voic_get (pwv h)
- putMVar mv (PipeBit c)
-
+ child <- vioc_get (pwv h)
+ copen <- vIsOpen child
+ if copen
+ then do mv <- pwmv h
+ putMVar mv (PipeBit c)
+ else fail "PipeWriter: Couldn't write to pipe because child end is closed"
--
haskell-testpack
More information about the Pkg-haskell-commits
mailing list