@@ -34,6 +34,12 @@ import Data.Word (Word8)
3434
3535data ArenaManager s = ArenaManager (MutVar s [Arena s ])
3636
37+ {-# SPECIALISE
38+ newArenaManager :: ST s (ArenaManager s)
39+ #-}
40+ {-# SPECIALISE
41+ newArenaManager :: IO (ArenaManager RealWorld)
42+ #-}
3743newArenaManager :: PrimMonad m => m (ArenaManager (PrimState m ))
3844newArenaManager = do
3945 m <- newMutVar []
@@ -116,8 +122,12 @@ closeArena (ArenaManager arenas) arena = do
116122
117123 atomicModifyMutVar' arenas $ \ xs -> (arena : xs, () )
118124
119-
120-
125+ {-# SPECIALISE
126+ scrambleArena :: Arena s -> ST s ()
127+ #-}
128+ {-# SPECIALISE
129+ scrambleArena :: Arena RealWorld -> IO ()
130+ #-}
121131scrambleArena :: PrimMonad m => Arena (PrimState m ) -> m ()
122132#ifndef NO_IGNORE_ASSERTS
123133scrambleArena _ = return ()
@@ -127,6 +137,12 @@ scrambleArena Arena {..} = do
127137 readMutVar full >>= mapM_ scrambleBlock
128138 readMutVar free >>= mapM_ scrambleBlock
129139
140+ {-# SPECIALISE
141+ scrambleBlock :: Block s -> ST s ()
142+ #-}
143+ {-# SPECIALISE
144+ scrambleBlock :: Block RealWorld -> IO ()
145+ #-}
130146scrambleBlock :: PrimMonad m => Block (PrimState m ) -> m ()
131147scrambleBlock (Block _ mba) = do
132148 size <- getSizeofMutableByteArray mba
@@ -157,6 +173,12 @@ resetArena Arena {..} = do
157173-- | Create unmanaged arena.
158174--
159175-- Never use this in non-tests code.
176+ {-# SPECIALISE
177+ withUnmanagedArena :: (Arena s -> ST s a) -> ST s a
178+ #-}
179+ {-# SPECIALISE
180+ withUnmanagedArena :: (Arena RealWorld -> IO a) -> IO a
181+ #-}
160182withUnmanagedArena :: PrimMonad m => (Arena (PrimState m ) -> m a ) -> m a
161183withUnmanagedArena k = do
162184 mgr <- newArenaManager
@@ -165,6 +187,9 @@ withUnmanagedArena k = do
165187{-# SPECIALISE
166188 allocateFromArena :: Arena s -> Size -> Alignment -> ST s (Offset, MutableByteArray s)
167189 #-}
190+ {-# SPECIALISE
191+ allocateFromArena :: Arena RealWorld -> Size -> Alignment -> IO (Offset, MutableByteArray RealWorld)
192+ #-}
168193-- | Allocate a slice of mutable byte array from the arena.
169194allocateFromArena :: PrimMonad m => Arena (PrimState m )-> Size -> Alignment -> m (Offset , MutableByteArray (PrimState m ))
170195allocateFromArena ! arena ! size ! alignment =
@@ -175,6 +200,9 @@ allocateFromArena !arena !size !alignment =
175200{-# SPECIALISE
176201 allocateFromArena' :: Arena s -> Size -> Alignment -> ST s (Offset, MutableByteArray s)
177202 #-}
203+ {-# SPECIALISE
204+ allocateFromArena' :: Arena RealWorld -> Size -> Alignment -> IO (Offset, MutableByteArray RealWorld)
205+ #-}
178206-- TODO!? this is not async exception safe
179207allocateFromArena' :: PrimMonad m => Arena (PrimState m )-> Size -> Alignment -> m (Offset , MutableByteArray (PrimState m ))
180208allocateFromArena' arena@ Arena { .. } ! size ! alignment = do
@@ -206,7 +234,12 @@ allocateFromArena' arena@Arena { .. } !size !alignment = do
206234 -- * go again
207235 allocateFromArena' arena size alignment
208236
209- {-# SPECIALISE newBlockWithFree :: MutVar s [Block s] -> ST s (Block s) #-}
237+ {-# SPECIALISE
238+ newBlockWithFree :: MutVar s [Block s] -> ST s (Block s)
239+ #-}
240+ {-# SPECIALISE
241+ newBlockWithFree :: MutVar RealWorld [Block RealWorld] -> IO (Block RealWorld)
242+ #-}
210243-- | Allocate new block, possibly taking it from a free list
211244newBlockWithFree :: PrimMonad m => MutVar (PrimState m ) [Block (PrimState m )] -> m (Block (PrimState m ))
212245newBlockWithFree free = do
0 commit comments