newIOLoop :: String -> MVar [[B.ByteString]] -> BoundedChan ([B.ByteString], IO Bool) -> Socket a -> IO (IOLoop a)
newIOLoop name qsrc qdst fh = do
  ctrl  <- newEmptyMVar
  lock  <- newMVar fh
  return (IOLoop name qsrc qdst lock ctrl)
newIOLoop :: String -> MVar [[B.ByteString]] -> BoundedChan ([B.ByteString], IO Bool) -> Socket a -> IO (IOLoop a)
newIOLoop name qsrc qdst fh = do
  ctrl  <- newEmptyMVar
  lock  <- newMVar fh
  return (IOLoop name qsrc qdst lock ctrl)
newIOLoop name qsrc qdst fh = do
  ctrl  <- newEmptyMVar
  lock  <- newMVar fh
  return (IOLoop name qsrc qdst lock ctrl)