@@ -122,6 +122,10 @@ newtype Stripe = Stripe { stripeD :: Distrib }
122122
123123data Distrib = Distrib (MutableByteArray ## RealWorld )
124124
125+ unI :: Int -> Int ##
126+ unI (I ## x) = x
127+ {-# INLINE unI #-}
128+
125129distribLen :: Int
126130distribLen = (# size struct distrib)
127131
@@ -155,24 +159,16 @@ maxPos = div (#offset struct distrib, max)
155159
156160newDistrib :: IO Distrib
157161newDistrib = IO $ \ s ->
158- case distribLen of { (I ## distribLen') ->
159- case newByteArray## distribLen' s of { (## s1, mba ## ) ->
160- case lockPos of { (I ## lockPos') ->
161- -- probably unecessary
162- case atomicWriteIntArray## mba lockPos' 0 ## s1 of { s2 ->
163- case countPos of { (I ## countPos') ->
164- case writeInt64Array mba countPos' (intToInt64 0 ## ) s2 of { s3 ->
165- case meanPos of { (I ## meanPos') ->
166- case writeDoubleArray## mba meanPos' 0.0 #### s3 of { s4 ->
167- case sumSqDeltaPos of { (I ## sumSqDeltaPos') ->
168- case writeDoubleArray## mba sumSqDeltaPos' 0.0 #### s4 of { s5 ->
169- case sumPos of { (I ## sumPos') ->
170- case writeDoubleArray## mba sumPos' 0.0 #### s5 of { s6 ->
171- case minPos of { (I ## minPos') ->
172- case writeDoubleArray## mba minPos' 0.0 #### s6 of { s7 ->
173- case maxPos of { (I ## maxPos') ->
174- case writeDoubleArray## mba maxPos' 0.0 #### s7 of { s8 ->
175- (## s8, Distrib mba ## ) }}}}}}}}}}}}}}}}
162+ case newByteArray## (unI distribLen) s of { (## s1, mba ## ) ->
163+ -- probably unnecessary
164+ case atomicWriteIntArray## mba (unI lockPos) 0 ## s1 of { s2 ->
165+ case writeInt64Array mba (unI countPos) (intToInt64 0 ## ) s2 of { s3 ->
166+ case writeDoubleArray## mba (unI meanPos) 0.0 #### s3 of { s4 ->
167+ case writeDoubleArray## mba (unI sumSqDeltaPos) 0.0 #### s4 of { s5 ->
168+ case writeDoubleArray## mba (unI sumPos) 0.0 #### s5 of { s6 ->
169+ case writeDoubleArray## mba (unI minPos) 0.0 #### s6 of { s7 ->
170+ case writeDoubleArray## mba (unI maxPos) 0.0 #### s7 of { s8 ->
171+ (## s8, Distrib mba ## ) }}}}}}}}
176172
177173newStripe :: IO Stripe
178174newStripe = do
@@ -207,17 +203,14 @@ add distrib val = addN distrib val 1
207203{-# INLINE spinLock #-}
208204spinLock :: MutableByteArray ## RealWorld -> State ## RealWorld -> State ## RealWorld
209205spinLock mba = \ s ->
210- case lockPos of { (I ## lockPos') ->
211- case casIntArray## mba lockPos' 0 ## 1 ## s of { (## s1, r ## ) ->
206+ case casIntArray## mba (unI lockPos) 0 ## 1 ## s of { (## s1, r ## ) ->
212207 case r ==## 0 ## of { 0 ## ->
213- spinLock mba s1; _ -> s1 }}}
208+ spinLock mba s1; _ -> s1 }}
214209
215210{-# INLINE spinUnlock #-}
216211spinUnlock :: MutableByteArray ## RealWorld -> State ## RealWorld -> State ## RealWorld
217212spinUnlock mba = \ s ->
218- case lockPos of { (I ## lockPos') ->
219- case writeIntArray## mba lockPos' 0 ## s of { s2 ->
220- s2 }}
213+ case writeIntArray## mba (unI lockPos) 0 ## s of { s2 -> s2 }
221214
222215
223216-- | Add the same value to the distribution N times.
@@ -228,32 +221,26 @@ addN distribution (D## val) (I64## n) = IO $ \s ->
228221 case myStripe distribution of { (IO myStripe') ->
229222 case myStripe' s of { (## s1, (Stripe (Distrib mba)) ## ) ->
230223 case spinLock mba s1 of { s2 ->
231- case countPos of { (I ## countPos') ->
232- case readInt64Array mba countPos' s2 of { (## s3, count ## ) ->
233- case meanPos of { (I ## meanPos') ->
234- case readDoubleArray## mba meanPos' s3 of { (## s4, mean ## ) ->
235- case sumSqDeltaPos of { (I ## sumSqDeltaPos') ->
236- case readDoubleArray## mba sumSqDeltaPos' s4 of { (## s5, sumSqDelta ## ) ->
237- case sumPos of { (I ## sumPos') ->
238- case readDoubleArray## mba sumPos' s5 of { (## s6, dSum ## ) ->
239- case minPos of { (I ## minPos') ->
240- case readDoubleArray## mba minPos' s6 of { (## s7, dMin ## ) ->
241- case maxPos of { (I ## maxPos') ->
242- case readDoubleArray## mba maxPos' s7 of { (## s8, dMax ## ) ->
224+ case readInt64Array mba (unI countPos) s2 of { (## s3, count ## ) ->
225+ case readDoubleArray## mba (unI meanPos) s3 of { (## s4, mean ## ) ->
226+ case readDoubleArray## mba (unI sumSqDeltaPos) s4 of { (## s5, sumSqDelta ## ) ->
227+ case readDoubleArray## mba (unI sumPos) s5 of { (## s6, dSum ## ) ->
228+ case readDoubleArray## mba (unI minPos) s6 of { (## s7, dMin ## ) ->
229+ case readDoubleArray## mba (unI maxPos) s7 of { (## s8, dMax ## ) ->
243230 case plusInt64 count n of { count' ->
244231 case val -#### mean of { delta ->
245232 case mean +#### ((int64ToDouble n) *#### delta /#### (int64ToDouble count')) of { mean' ->
246233 case sumSqDelta +#### (delta *#### (val -#### mean') *#### (int64ToDouble n)) of { sumSqDelta' ->
247- case writeInt64Array mba countPos' count' s8 of { s9 ->
248- case writeDoubleArray## mba meanPos' mean' s9 of { s10 ->
249- case writeDoubleArray## mba sumSqDeltaPos' sumSqDelta' s10 of { s11 ->
250- case writeDoubleArray## mba sumPos' (dSum +#### val) s11 of { s12 ->
234+ case writeInt64Array mba (unI countPos) count' s8 of { s9 ->
235+ case writeDoubleArray## mba (unI meanPos) mean' s9 of { s10 ->
236+ case writeDoubleArray## mba (unI sumSqDeltaPos) sumSqDelta' s10 of { s11 ->
237+ case writeDoubleArray## mba (unI sumPos) (dSum +#### val) s11 of { s12 ->
251238 case (case val <#### dMin of { 0 ## -> dMin; _ -> val }) of { dMin' ->
252239 case (case val >#### dMax of { 0 ## -> dMax; _ -> val }) of { dMax' ->
253- case writeDoubleArray## mba minPos' dMin' s12 of { s13 ->
254- case writeDoubleArray## mba maxPos' dMax' s13 of { s14 ->
240+ case writeDoubleArray## mba (unI minPos) dMin' s12 of { s13 ->
241+ case writeDoubleArray## mba (unI maxPos) dMax' s13 of { s14 ->
255242 case spinUnlock mba s14 of { s15 ->
256- (## s15, () ## ) }}}}}}}}}}}}}}}}}}}}}}}}}}}}
243+ (## s15, () ## ) }}}}}}}}}}}}}}}}}}}}}}
257244
258245-- | Combine 'b' with 'a', writing the result in 'a'. Takes the lock of
259246-- 'b' while combining, but doesn't otherwise modify 'b'. 'a' is
@@ -263,20 +250,17 @@ addN distribution (D## val) (I64## n) = IO $ \s ->
263250combine :: Distrib -> Distrib -> IO ()
264251combine (Distrib bMBA) (Distrib aMBA) = IO $ \ s ->
265252 case spinLock bMBA s of { s1 ->
266- case countPos of { (I ## countPos') ->
267- case readInt64Array aMBA countPos' s1 of { (## s2, aCount ## ) ->
268- case readInt64Array bMBA countPos' s2 of { (## s3, bCount ## ) ->
253+ case readInt64Array aMBA (unI countPos) s1 of { (## s2, aCount ## ) ->
254+ case readInt64Array bMBA (unI countPos) s2 of { (## s3, bCount ## ) ->
269255 case plusInt64 aCount bCount of { count' ->
270- case meanPos of { (I ## meanPos' ) ->
271- case readDoubleArray## aMBA meanPos' s3 of { (## s4, aMean ## ) ->
272- case readDoubleArray## bMBA meanPos' s4 of { (## s5, bMean ## ) ->
256+ case readDoubleArray## aMBA (unI meanPos) s3 of { (## s4, aMean ## ) ->
257+ case readDoubleArray## bMBA (unI meanPos) s4 of { (## s5, bMean ## ) ->
273258 case bMean -#### aMean of { delta ->
274259 case ( (((int64ToDouble aCount) *#### aMean) +#### ((int64ToDouble bCount) *#### bMean))
275260 /#### (int64ToDouble count')
276261 ) of { mean' ->
277- case sumSqDeltaPos of { (I ## sumSqDeltaPos') ->
278- case readDoubleArray## aMBA sumSqDeltaPos' s5 of { (## s6, aSumSqDelta ## ) ->
279- case readDoubleArray## bMBA sumSqDeltaPos' s6 of { (## s7, bSumSqDelta ## ) ->
262+ case readDoubleArray## aMBA (unI sumSqDeltaPos) s5 of { (## s6, aSumSqDelta ## ) ->
263+ case readDoubleArray## bMBA (unI sumSqDeltaPos) s6 of { (## s7, bSumSqDelta ## ) ->
280264 case ( aSumSqDelta
281265 +#### bSumSqDelta
282266 +#### ( delta
@@ -286,24 +270,21 @@ combine (Distrib bMBA) (Distrib aMBA) = IO $ \s ->
286270 )
287271 )
288272 ) of { sumSqDelta' ->
289- case writeInt64Array aMBA countPos' count' s7 of { s8 ->
273+ case writeInt64Array aMBA (unI countPos) count' s7 of { s8 ->
290274 case (case eqInt64 count' (intToInt64 0 ## ) of { 0 ## -> mean'; _ -> 0.0 #### }) of { writeMean ->
291- case writeDoubleArray## aMBA meanPos' writeMean s8 of { s9 ->
292- case writeDoubleArray## aMBA sumSqDeltaPos' sumSqDelta' s9 of { s10 ->
293- case sumPos of { (I ## sumPos') ->
294- case readDoubleArray## aMBA sumPos' s10 of { (## s11, aSum ## ) ->
295- case readDoubleArray## bMBA sumPos' s11 of { (## s12, bSum ## ) ->
296- case writeDoubleArray## aMBA sumPos' (aSum +#### bSum) s12 of { s13 ->
297- case minPos of { (I ## minPos') ->
298- case readDoubleArray## bMBA minPos' s13 of { (## s14, bMin ## ) ->
299- case writeDoubleArray## aMBA minPos' bMin s14 of { s15 ->
300- case maxPos of { (I ## maxPos') ->
275+ case writeDoubleArray## aMBA (unI meanPos) writeMean s8 of { s9 ->
276+ case writeDoubleArray## aMBA (unI sumSqDeltaPos) sumSqDelta' s9 of { s10 ->
277+ case readDoubleArray## aMBA (unI sumPos) s10 of { (## s11, aSum ## ) ->
278+ case readDoubleArray## bMBA (unI sumPos) s11 of { (## s12, bSum ## ) ->
279+ case writeDoubleArray## aMBA (unI sumPos) (aSum +#### bSum) s12 of { s13 ->
280+ case readDoubleArray## bMBA (unI minPos) s13 of { (## s14, bMin ## ) ->
281+ case writeDoubleArray## aMBA (unI minPos) bMin s14 of { s15 ->
301282 -- This is slightly hacky, but ok: see
302283 -- 813aa426be78e8abcf1c7cdd43433bcffa07828e
303- case readDoubleArray## bMBA maxPos' s15 of { (## s16, bMax ## ) ->
304- case writeDoubleArray## aMBA maxPos' bMax s16 of { s17 ->
284+ case readDoubleArray## bMBA (unI maxPos) s15 of { (## s16, bMax ## ) ->
285+ case writeDoubleArray## aMBA (unI maxPos) bMax s16 of { s17 ->
305286 case spinUnlock bMBA s17 of { s18 ->
306- (## s18, () ## ) }}}}}}}}}}}}}}}}}}}}}}}}}}}}}
287+ (## s18, () ## ) }}}}}}}}}}}}}}}}}}}}}}}
307288
308289-- | Get the current statistical summary for the event being tracked.
309290read :: Distribution -> IO Stats
@@ -312,18 +293,12 @@ read distrib = do
312293 forM_ (toList $ unD distrib) $ \ (Stripe d) ->
313294 combine d result
314295 IO $ \ s ->
315- case meanPos of { (I ## meanPos') ->
316- case countPos of { (I ## countPos') ->
317- case sumSqDeltaPos of { (I ## sumSqDeltaPos') ->
318- case sumPos of { (I ## sumPos') ->
319- case minPos of { (I ## minPos') ->
320- case maxPos of { (I ## maxPos') ->
321- case readInt64Array mba countPos' s of { (## s1, count ## ) ->
322- case readDoubleArray## mba meanPos' s1 of { (## s2, mean ## ) ->
323- case readDoubleArray## mba sumSqDeltaPos' s2 of { (## s3, sumSqDelta ## ) ->
324- case readDoubleArray## mba sumPos' s3 of { (## s4, dSum ## ) ->
325- case readDoubleArray## mba minPos' s4 of { (## s5, dMin ## ) ->
326- case readDoubleArray## mba maxPos' s5 of { (## s6, dMax ## ) ->
296+ case readInt64Array mba (unI countPos) s of { (## s1, count ## ) ->
297+ case readDoubleArray## mba (unI meanPos) s1 of { (## s2, mean ## ) ->
298+ case readDoubleArray## mba (unI sumSqDeltaPos) s2 of { (## s3, sumSqDelta ## ) ->
299+ case readDoubleArray## mba (unI sumPos) s3 of { (## s4, dSum ## ) ->
300+ case readDoubleArray## mba (unI minPos) s4 of { (## s5, dMin ## ) ->
301+ case readDoubleArray## mba (unI maxPos) s5 of { (## s6, dMax ## ) ->
327302 (## s6
328303 , Stats { mean = (D ## mean)
329304 , variance = if (I64 ## count) == 0 then 0.0
@@ -333,4 +308,4 @@ read distrib = do
333308 , min = (D ## dMin)
334309 , max = (D ## dMax)
335310 }
336- ## ) }}}}}}}}}}}}
311+ ## ) }}}}}}
0 commit comments