[Haskell-cafe] Re: DevRandom

Yitzchak Gale gale at sefer.org
Wed Jan 31 04:55:30 EST 2007


Bryan Donlan wrote:
> This re-opens the device every time we need it.
> How about opening once, when it's first needed?

Good idea.

> hDevRandom :: Handle
> {-# NOINLINE hDevRandom  #-}
> hDevRandom = unsafePerformIO $ openFile "/dev/random" ReadMode
>
> hDevURandom :: Handle
> {-# NOINLINE hDevURandom  #-}
> hDevURandom = unsafePerformIO $ openFile "/dev/urandom" ReadMode

The NOINLINE guarantees that openFile is called only
once. But does it guarantee that openFile is NOT called
if we do not need it? We could check what the compilers
actually do, but I am not sure we have a guarantee here.

Perhaps we should do something like

data Dev = Dev String (IORef (Maybe Handle))

getDevHandle :: Dev -> IO Handle
getDevHandle (Dev path ref) = readIORef ref >>= maybe openDev return
  where
    openDev = do
      h <- openFile path ReadMode
      writeIORef ref h
      return h

hDevRandom :: Dev
{-# NOINLINE hDevRandom  #-}
hDevRandom = Dev "/dev/random" $ unsafePerformIO $ newIORef Nothing

hDevURandom :: Dev
{-# NOINLINE hDevURandom  #-}
hDevURandom = Dev "/dev/urandom" $ unsafePerformIO $ newIORef Nothing

-Yitz


More information about the Haskell-Cafe mailing list