on master help sign in
Revert "Only use atomic-primops on GHC 7.8"
bc7f421Michael Snoyman
warp/Network/Wai/Handler/Warp/Counter.hs−21
@@ -1,4 +1,3 @@
1−{-# LANGUAGE CPP #-}
2module Network.Wai.Handler.Warp.Counter (
1module Network.Wai.Handler.Warp.Counter (
3 Counter
2 Counter
4 , newCounter
3 , newCounter
@@ -7,7 +6,6 @@ module Network.Wai.Handler.Warp.Counter (
7 , decrease
6 , decrease
8 ) where
7 ) where
9
8
10−#if USE_ATOMIC_PRIMOPS
11import qualified Data.Atomics.Counter.Unboxed as C
9import qualified Data.Atomics.Counter.Unboxed as C
12import Control.Applicative ((<$>))
10import Control.Applicative ((<$>))
13
11
@@ -24,22 +22,3 @@ increase (Counter ref) = C.incrCounter_ 1 ref
24
22
25decrease :: Counter -> IO ()
23decrease :: Counter -> IO ()
26decrease (Counter ref) = C.incrCounter_ (-1) ref
24decrease (Counter ref) = C.incrCounter_ (-1) ref
27−#else
28−
29−import Network.Wai.Handler.Warp.IORef
30−import Control.Applicative ((<$>))
31−
32−newtype Counter = Counter (IORef Int)
33−
34−newCounter :: IO Counter
35−newCounter = Counter <$> newIORef 0
36−
37−isZero :: Counter -> IO Bool
38−isZero (Counter ref) = (== 0) <$> readIORef ref
39−
40−increase :: Counter -> IO ()
41−increase (Counter ref) = atomicModifyIORef' ref (\x -> (x + 1, ()))
42−
43−decrease :: Counter -> IO ()
44−decrease (Counter ref) = atomicModifyIORef' ref (\x -> (x - 1, ()))
45−#endif
warp/Network/Wai/Handler/Warp/Timeout.hs+5−35
@@ -59,12 +59,7 @@ import GHC.Weak (Weak (..))
59import System.Mem.Weak (deRefWeak)
59import System.Mem.Weak (deRefWeak)
60import Data.Typeable (Typeable)
60import Data.Typeable (Typeable)
61import Control.Reaper
61import Control.Reaper
62−#if USE_ATOMIC_PRIMOPS
63import qualified Data.Atomics.Counter.Unboxed as C
62import qualified Data.Atomics.Counter.Unboxed as C
64−import Data.Atomics.Counter.Unboxed (casCounter)
65−#else
66−import Network.Wai.Handler.Warp.IORef
67−#endif
68
63
69----------------------------------------------------------------
64----------------------------------------------------------------
70
65
@@ -75,12 +70,7 @@ type Manager = Reaper [Handle] Handle
75type TimeoutAction = IO ()
70type TimeoutAction = IO ()
76
71
77-- | A handle used by 'Manager'
72-- | A handle used by 'Manager'
78−data Handle = Handle TimeoutAction
73+data Handle = Handle TimeoutAction {-# UNPACK #-} !C.AtomicCounter
79−#if USE_ATOMIC_PRIMOPS
80− {-# UNPACK #-} !C.AtomicCounter
81−#else
82− {-# UNPACK #-} !(IORef Int)
83−#endif
84
74
85-- Four states for the AtomicCounter:
75-- Four states for the AtomicCounter:
86--
76--
@@ -101,7 +91,7 @@ initialize timeout = mkReaper defaultReaperSettings
101 where
91 where
102 prune m@(Handle onTimeout iactive) = do
92 prune m@(Handle onTimeout iactive) = do
103 -- Try to change from active to inactive
93 -- Try to change from active to inactive
104− (wasActive, newState) <- casCounter iactive 1 2
94+ (wasActive, newState) <- C.casCounter iactive 1 2
105 case newState of
95 case newState of
106 2 | not wasActive -> do -- inactive
96 2 | not wasActive -> do -- inactive
107 onTimeout `E.catch` ignoreAll
97 onTimeout `E.catch` ignoreAll
@@ -109,14 +99,6 @@ initialize timeout = mkReaper defaultReaperSettings
109 4 -> return Nothing -- canceled
99 4 -> return Nothing -- canceled
110 _ -> return $ Just m
100 _ -> return $ Just m
111
101
112−#if !USE_ATOMIC_PRIMOPS
113−casCounter :: IORef Int -> Int -> Int -> IO (Bool, Int)
114−casCounter ref old new = atomicModifyIORef' ref $ \curr ->
115− if old == curr
116− then (new, (True, new))
117− else (old, (False, old))
118−#endif
119−
120----------------------------------------------------------------
102----------------------------------------------------------------
121
103
122-- | Stopping timeout manager.
104-- | Stopping timeout manager.
@@ -133,11 +115,7 @@ ignoreAll _ = return ()
133-- | Registering a timeout action.
115-- | Registering a timeout action.
134register :: Manager -> TimeoutAction -> IO Handle
116register :: Manager -> TimeoutAction -> IO Handle
135register mgr onTimeout = do
117register mgr onTimeout = do
136−#if USE_ATOMIC_PRIMOPS
137 iactive <- C.newCounter 1
118 iactive <- C.newCounter 1
138−#else
139− iactive <- newIORef 1
140−#endif
141 let h = Handle onTimeout iactive
119 let h = Handle onTimeout iactive
142 reaperAdd mgr h
120 reaperAdd mgr h
143 return h
121 return h
@@ -171,28 +149,20 @@ mkWeakThreadId t@(ThreadId t#) = IO $ \s ->
171
149
172----------------------------------------------------------------
150----------------------------------------------------------------
173
151
174−writeCounter :: Int -> Handle -> IO ()
175−#if USE_ATOMIC_PRIMOPS
176−writeCounter i (Handle _ iactive) = C.writeCounter iactive i
177−#else
178−writeCounter i (Handle _ iactive) = writeIORef iactive i
179−#endif
180−{-# INLINE writeCounter #-}
181−
182-- | Setting the state to active.
152-- | Setting the state to active.
183-- 'Manager' turns active to inactive repeatedly.
153-- 'Manager' turns active to inactive repeatedly.
184tickle :: Handle -> IO ()
154tickle :: Handle -> IO ()
185−tickle = writeCounter 1
155+tickle (Handle _ iactive) = C.writeCounter iactive 1
186
156
187-- | Setting the state to canceled.
157-- | Setting the state to canceled.
188-- 'Manager' eventually removes this without timeout action.
158-- 'Manager' eventually removes this without timeout action.
189cancel :: Handle -> IO ()
159cancel :: Handle -> IO ()
190−cancel = writeCounter 4
160+cancel (Handle _ iactive) = C.writeCounter iactive 4
191
161
192-- | Setting the state to paused.
162-- | Setting the state to paused.
193-- 'Manager' does not change the value.
163-- 'Manager' does not change the value.
194pause :: Handle -> IO ()
164pause :: Handle -> IO ()
195−pause = writeCounter 3
165+pause (Handle _ iactive) = C.writeCounter iactive 3
196
166
197-- | Setting the paused state to active.
167-- | Setting the paused state to active.
198-- This is an alias to 'tickle'.
168-- This is an alias to 'tickle'.
warp/warp.cabal+3−9
@@ -1,5 +1,5 @@
1Name: warp
1Name: warp
2−Version: 3.0.2.2
2+Version: 3.0.2.1
3Synopsis: A fast, light-weight web server for WAI applications.
3Synopsis: A fast, light-weight web server for WAI applications.
4License: MIT
4License: MIT
5License-file: LICENSE
5License-file: LICENSE
@@ -52,10 +52,7 @@ Library
52 , wai >= 3.0 && < 3.1
52 , wai >= 3.0 && < 3.1
53 , text
53 , text
54 , streaming-commons >= 0.1.2
54 , streaming-commons >= 0.1.2
55−
56− if impl(ghc >= 7.8)
57− Build-Depends: atomic-primops >= 0.6
55+ , atomic-primops >= 0.6
58− cpp-options: -DUSE_ATOMIC_PRIMOPS
59 if flag(network-bytestring)
56 if flag(network-bytestring)
60 Build-Depends: network >= 2.2.1.5 && < 2.2.3
57 Build-Depends: network >= 2.2.1.5 && < 2.2.3
61 , network-bytestring >= 0.1.3 && < 0.1.4
58 , network-bytestring >= 0.1.3 && < 0.1.4
@@ -147,10 +144,7 @@ Test-Suite spec
147 , text
144 , text
148 , streaming-commons >= 0.1.1
145 , streaming-commons >= 0.1.1
149 , async
146 , async
150−
151− if impl(ghc >= 7.8)
152− Build-Depends: atomic-primops >= 0.6
147+ , atomic-primops
153− cpp-options: -DUSE_ATOMIC_PRIMOPS
154
148
155 if (os(linux) || os(freebsd) || os(darwin)) && flag(allow-sendfilefd)
149 if (os(linux) || os(freebsd) || os(darwin)) && flag(allow-sendfilefd)
156 Cpp-Options: -DSENDFILEFD
150 Cpp-Options: -DSENDFILEFD