1
+ {-# LANGUAGE DefaultSignatures #-}
1
2
{-# LANGUAGE FlexibleContexts #-}
2
3
{-# LANGUAGE MultiParamTypeClasses #-}
3
4
{-# LANGUAGE TypeFamilies #-}
4
5
{-# LANGUAGE TypeFamilyDependencies #-}
5
6
module Control.Monad.Class.MonadSTM
6
7
( MonadSTM (.. )
7
8
, MonadSTMTx (.. )
9
+ , MonadLabelledSTM (.. )
10
+ , MonadLabelledSTMTx (.. )
8
11
, LazyTVar
9
12
, LazyTMVar
10
13
, TVar
@@ -14,6 +17,7 @@ module Control.Monad.Class.MonadSTM
14
17
15
18
-- * Default 'TMVar' implementation
16
19
, TMVarDefault (.. )
20
+ , labelTMVarDefault
17
21
, newTMVarDefault
18
22
, newTMVarIODefault
19
23
, newEmptyTMVarDefault
@@ -29,6 +33,7 @@ module Control.Monad.Class.MonadSTM
29
33
30
34
-- * Default 'TBQueue' implementation
31
35
, TQueueDefault (.. )
36
+ , labelTQueueDefault
32
37
, newTQueueDefault
33
38
, readTQueueDefault
34
39
, tryReadTQueueDefault
@@ -37,6 +42,7 @@ module Control.Monad.Class.MonadSTM
37
42
38
43
-- * Default 'TBQueue' implementation
39
44
, TBQueueDefault (.. )
45
+ , labelTBQueueDefault
40
46
, newTBQueueDefault
41
47
, readTBQueueDefault
42
48
, tryReadTBQueueDefault
@@ -184,6 +190,37 @@ newEmptyTMVarM :: MonadSTM m => m (TMVar m a)
184
190
newEmptyTMVarM = newEmptyTMVarIO
185
191
{-# DEPRECATED newEmptyTMVarM "Use newEmptyTMVarIO" #-}
186
192
193
+
194
+ -- | Labelled 'TVar's, 'TMVar's, 'TQueue's and 'TBQueue's.
195
+ --
196
+ class MonadSTMTx stm => MonadLabelledSTMTx stm where
197
+ labelTVar :: TVar_ stm a -> String -> stm ()
198
+ labelTMVar :: TMVar_ stm a -> String -> stm ()
199
+ labelTQueue :: TQueue_ stm a -> String -> stm ()
200
+ labelTBQueue :: TBQueue_ stm a -> String -> stm ()
201
+
202
+ -- | A convenience class which provides 'MonadSTM' and 'MonadLabelledSTMTx'
203
+ -- constraints.
204
+ --
205
+ class (MonadSTM m , MonadLabelledSTMTx (STM m ))
206
+ => MonadLabelledSTM m where
207
+ labelTVarIO :: TVar m a -> String -> m ()
208
+ labelTMVarIO :: TMVar m a -> String -> m ()
209
+ labelTQueueIO :: TQueue m a -> String -> m ()
210
+ labelTBQueueIO :: TBQueue m a -> String -> m ()
211
+
212
+ default labelTVarIO :: TVar m a -> String -> m ()
213
+ labelTVarIO = \ v l -> atomically (labelTVar v l)
214
+
215
+ default labelTMVarIO :: TMVar m a -> String -> m ()
216
+ labelTMVarIO = \ v l -> atomically (labelTMVar v l)
217
+
218
+ default labelTQueueIO :: TQueue m a -> String -> m ()
219
+ labelTQueueIO = \ v l -> atomically (labelTQueue v l)
220
+
221
+ default labelTBQueueIO :: TBQueue m a -> String -> m ()
222
+ labelTBQueueIO = \ v l -> atomically (labelTBQueue v l)
223
+
187
224
--
188
225
-- Instance for IO uses the existing STM library implementations
189
226
--
@@ -237,12 +274,28 @@ instance MonadSTM IO where
237
274
newTMVarIO = STM. newTMVarIO
238
275
newEmptyTMVarIO = STM. newEmptyTMVarIO
239
276
277
+ -- | noop instance
278
+ --
279
+ instance MonadLabelledSTMTx STM. STM where
280
+ labelTVar = \ _ _ -> return ()
281
+ labelTMVar = \ _ _ -> return ()
282
+ labelTQueue = \ _ _ -> return ()
283
+ labelTBQueue = \ _ _ -> return ()
284
+
285
+ -- | noop instance
286
+ --
287
+ instance MonadLabelledSTM IO where
288
+ labelTVarIO = \ _ _ -> return ()
289
+ labelTMVarIO = \ _ _ -> return ()
290
+ labelTQueueIO = \ _ _ -> return ()
291
+ labelTBQueueIO = \ _ _ -> return ()
292
+
240
293
-- | Wrapper around 'BlockedIndefinitelyOnSTM' that stores a call stack
241
294
data BlockedIndefinitely = BlockedIndefinitely {
242
295
blockedIndefinitelyCallStack :: CallStack
243
296
, blockedIndefinitelyException :: BlockedIndefinitelyOnSTM
244
297
}
245
- deriving ( Show )
298
+ deriving Show
246
299
247
300
instance Exception BlockedIndefinitely where
248
301
displayException (BlockedIndefinitely cs e) = unlines [
@@ -270,6 +323,11 @@ instance MonadSTM m => MonadSTM (ReaderT r m) where
270
323
271
324
newtype TMVarDefault m a = TMVar (TVar m (Maybe a ))
272
325
326
+ labelTMVarDefault
327
+ :: MonadLabelledSTM m
328
+ => TMVarDefault m a -> String -> STM m ()
329
+ labelTMVarDefault (TMVar tvar) = labelTVar tvar
330
+
273
331
newTMVarDefault :: MonadSTM m => a -> STM m (TMVarDefault m a )
274
332
newTMVarDefault a = do
275
333
t <- newTVar (Just a)
@@ -291,7 +349,7 @@ newEmptyTMVarDefault = do
291
349
292
350
newEmptyTMVarIODefault :: MonadSTM m => m (TMVarDefault m a )
293
351
newEmptyTMVarIODefault = do
294
- t <- newTVarM Nothing
352
+ t <- newTVarIO Nothing
295
353
return (TMVar t)
296
354
297
355
newEmptyTMVarMDefault :: MonadSTM m => m (TMVarDefault m a )
@@ -357,6 +415,13 @@ isEmptyTMVarDefault (TMVar t) = do
357
415
data TQueueDefault m a = TQueue ! (TVar m [a ])
358
416
! (TVar m [a ])
359
417
418
+ labelTQueueDefault
419
+ :: MonadLabelledSTM m
420
+ => TQueueDefault m a -> String -> STM m ()
421
+ labelTQueueDefault (TQueue read write) label = do
422
+ labelTVar read (label ++ " -read" )
423
+ labelTVar write (label ++ " -write" )
424
+
360
425
newTQueueDefault :: MonadSTM m => STM m (TQueueDefault m a )
361
426
newTQueueDefault = do
362
427
read <- newTVar []
@@ -408,6 +473,15 @@ data TBQueueDefault m a = TBQueue
408
473
! (TVar m [a ]) -- written elements
409
474
! Natural
410
475
476
+ labelTBQueueDefault
477
+ :: MonadLabelledSTM m
478
+ => TBQueueDefault m a -> String -> STM m ()
479
+ labelTBQueueDefault (TBQueue rsize read wsize write _size) label = do
480
+ labelTVar rsize (label ++ " -rsize" )
481
+ labelTVar read (label ++ " -read" )
482
+ labelTVar wsize (label ++ " -wsize" )
483
+ labelTVar write (label ++ " -write" )
484
+
411
485
newTBQueueDefault :: MonadSTM m => Natural -> STM m (TBQueueDefault m a )
412
486
newTBQueueDefault size = do
413
487
rsize <- newTVar 0
0 commit comments