[Haskell-cafe] Non-STM bounded queue

Joel Reymont joelr1 at gmail.com
Fri Dec 16 06:11:57 EST 2005


I need to move away from STM (unfortunately) until I profile my  
program to my satisfaction. Profiling is somewhat crippled with STM  
in 6.4.1. I cannot do void and drag profiling, for examplel. I  
decided to abstract my mailboxes in a Queue module so that I could  
switch between STM and non-STM as needed. Please let me know what you  
think of this bounded queue implementation.

module Queue where

import Control.Monad
import Control.Concurrent

data Queue a = Queue !QSem !(Chan a)

newQ :: Int -> IO (Queue a)
newQ size =
     do sem <- newQSem size
        q <- newChan
        return $! Queue sem q

writeQ :: Queue a -> a -> IO ()
writeQ (Queue sem q) x =
     do waitQSem sem
        writeChan q x

readQ :: Queue a -> IO a
readQ (Queue sem q) =
     do x <- readChan q
        signalQSem sem
        return x

	Thank, Joel


More information about the Haskell-Cafe mailing list