{-# LINE 1 "src/Network/Riak/Connection/NoPush.hsc" #-} {-# LANGUAGE ForeignFunctionInterface #-} {-# LINE 2 "src/Network/Riak/Connection/NoPush.hsc" #-} -- | -- Module: Network.Riak.Connection.NoPush -- Copyright: (c) 2011 MailRank, Inc. -- License: Apache -- Maintainer: Mark Hibberd <mark@hibberd.id.au>, Nathan Hunter <nhunter@janrain.com> -- Stability: experimental -- Portability: portable -- -- TCP madness. module Network.Riak.Connection.NoPush (setNoPush) where {-# LINE 16 "src/Network/Riak/Connection/NoPush.hsc" #-} {-# LINE 17 "src/Network/Riak/Connection/NoPush.hsc" #-} {-# LINE 18 "src/Network/Riak/Connection/NoPush.hsc" #-} import Foreign.C.Error (throwErrnoIfMinus1_) import Foreign.C.Types (CInt(..)) import Foreign.Marshal.Utils (with) import Foreign.Ptr (Ptr) import Foreign.Storable (sizeOf) import Network.Socket (Socket(..)) noPush :: CInt {-# LINE 28 "src/Network/Riak/Connection/NoPush.hsc" #-} -- TCP_NOPUSH is utterly fucked on OS X 10.6. It introduces a delay -- of about 4.5 seconds per outbound packet train. What. The. Fuck. noPush = 0 --noPush = #const TCP_NOPUSH {-# LINE 37 "src/Network/Riak/Connection/NoPush.hsc" #-} setNoPush :: Socket -> Bool -> IO () setNoPush _ _ | noPush == 0 = return () setNoPush (MkSocket fd _ _ _ _) onOff = do let v = if onOff then 1 else 0 with v $ \ptr -> throwErrnoIfMinus1_ "setNoPush" $ c_setsockopt fd (6) noPush ptr (fromIntegral (sizeOf v)) {-# LINE 45 "src/Network/Riak/Connection/NoPush.hsc" #-} foreign import ccall unsafe "setsockopt" c_setsockopt :: CInt -> CInt -> CInt -> Ptr CInt -> CInt -> IO CInt