@@ -35,11 +35,15 @@ import Control.Distributed.Process.ManagedProcess
35
35
, setProcessState
36
36
, processState
37
37
)
38
- import qualified Control.Distributed.Process.ManagedProcess.Internal.Types as MP (lift , liftIO )
39
- import Control.Distributed.Process.ManagedProcess.Server.Priority
40
- ( push
41
- , act
38
+ import qualified Control.Distributed.Process.ManagedProcess.Internal.GenProcess as Gen (enqueue , push )
39
+ import Control.Distributed.Process.ManagedProcess.Internal.Types
40
+ ( Priority (.. )
42
41
)
42
+ import qualified Control.Distributed.Process.ManagedProcess.Internal.Types as MP
43
+ ( lift
44
+ , liftIO
45
+ )
46
+ import Control.Distributed.Process.ManagedProcess.Server.Priority (act )
43
47
import Control.Distributed.Process.Serializable (Serializable )
44
48
import Control.Monad.Fix (MonadFix )
45
49
import Control.Monad.IO.Class (MonadIO )
@@ -65,13 +69,14 @@ import Data.Typeable (Typeable, typeOf)
65
69
import Data.Tuple (swap , uncurry )
66
70
-- import GHC.Generics
67
71
68
- data State s d = State { stName :: s
72
+ data State s d = (Show s , Eq s ) =>
73
+ State { stName :: s
69
74
, stData :: d
70
75
, stProg :: Step s d -- original program
71
- , stInstr :: Step s d -- current step in the program
72
76
, stInput :: Maybe P. Message
73
77
, stReply :: (P. Message -> Process () )
74
78
, stTrans :: Seq (Transition s d )
79
+ , stQueue :: Seq P. Message
75
80
}
76
81
77
82
instance forall s d . (Show s ) => Show (State s d ) where
@@ -80,24 +85,42 @@ instance forall s d . (Show s) => Show (State s d) where
80
85
81
86
data Transition s d = Remain
82
87
| PutBack
88
+ | Push P. Message
89
+ | Enqueue P. Message
90
+ | Postpone
83
91
| Enter s
84
92
| Stop ExitReason
85
93
| Eval (GenProcess (State s d ) () )
86
94
87
95
instance forall s d . (Show s ) => Show (Transition s d ) where
88
96
show Remain = " Remain"
89
97
show PutBack = " PutBack"
98
+ show Postpone = " Postpone"
99
+ show (Push m) = " Push " ++ (show m)
100
+ show (Enqueue m) = " Enqueue " ++ (show m)
90
101
show (Enter s) = " Enter " ++ (show s)
91
102
show (Stop er) = " Stop " ++ (show er)
92
103
show (Eval _) = " Eval"
93
104
94
105
data Event m where
95
- Wait :: (Serializable m ) => Event m
96
- Event :: (Serializable m ) => m -> Event m
106
+ Wait :: (Serializable m ) => Event m
107
+ WaitP :: (Serializable m ) => Priority () -> Event m
108
+ Event :: (Serializable m ) => m -> Event m
109
+
110
+ resolveEvent :: forall s d m . (Serializable m )
111
+ => Event m
112
+ -> P. Message
113
+ -> State s d
114
+ -> m
115
+ -> Process (Int , P. Message )
116
+ resolveEvent ev m _ _
117
+ | WaitP p <- ev = return (getPrio p, m)
118
+ | otherwise = return (0 , m)
97
119
98
120
instance forall m . (Typeable m ) => Show (Event m ) where
99
- show ev@ Wait = show $ " Wait::" ++ (show $ typeOf ev)
100
- show ev = show $ typeOf ev
121
+ show ev@ Wait = show $ " Wait::" ++ (show $ typeOf ev)
122
+ show ev@ (WaitP _) = show $ " WaitP::" ++ (show $ typeOf ev)
123
+ show ev = show $ typeOf ev
101
124
102
125
data Step s d where
103
126
Init :: Step s d -> Step s d -> Step s d
@@ -171,9 +194,13 @@ seqEnqueue s a = a <| s
171
194
seqPush :: Seq a -> a -> Seq a
172
195
seqPush s a = s |> a
173
196
197
+ {-# INLINE seqPop #-}
198
+ seqPop :: Seq a -> Maybe (a , Seq a )
199
+ seqPop s = maybe Nothing (\ (s' :> a) -> Just (a, s')) $ getR s
200
+
174
201
{-# INLINE seqDequeue #-}
175
202
seqDequeue :: Seq a -> Maybe (a , Seq a )
176
- seqDequeue s = maybe Nothing ( \ (s' :> a) -> Just (a, s')) $ getR s
203
+ seqDequeue = seqPop
177
204
178
205
{-# INLINE peek #-}
179
206
peek :: Seq a -> Maybe a
@@ -198,7 +225,7 @@ apply st msg step
198
225
P. liftIO $ putStrLn " Init _ _"
199
226
st' <- apply st msg is
200
227
case st' of
201
- Just s -> apply (s { stProg = ns, stInstr = ns }) msg ns
228
+ Just s -> apply (s { stProg = ns }) msg ns
202
229
Nothing -> die $ ExitOther $ baseErr ++ " :InitFailed"
203
230
| Yield sn sd <- step = do
204
231
P. liftIO $ putStrLn " Yield s d"
@@ -255,28 +282,38 @@ applyTransitions st@State{..} evals
255
282
MP. liftIO $ putStrLn $ " ProcessState: " ++ (show stName)
256
283
mapM_ id evals
257
284
| (tr, st2) <- next
258
- , Enter s <- tr = let st' = st2 { stName = s }
259
- in do P. liftIO $ putStrLn $ " NEWSTATE: " ++ (show st')
260
- applyTransitions st' evals
285
+ , PutBack <- tr = applyTransitions st2 ((Gen. enqueue $ fromJust stInput) : evals)
286
+ | isJust stInput
287
+ , input <- fromJust stInput
288
+ , (tr, st2) <- next
289
+ , Postpone <- tr = applyTransitions (st2 { stQueue = seqEnqueue stQueue input }) evals
261
290
| (tr, st2) <- next
262
- , PutBack <- tr = applyTransitions st2 ((push $ fromJust stInput) : evals)
263
- {- let act' = setProcessState $ fsmSt { fsmName = stName, fsmData = stData }
264
- push stInput -}
291
+ , Enqueue m <- tr = applyTransitions st2 ((Gen. enqueue m) : evals)
292
+ | (tr, st2) <- next
293
+ , Push m <- tr = applyTransitions st2 (( Gen. push m) : evals)
265
294
| (tr, st2) <- next
266
295
, Eval proc <- tr = applyTransitions st2 (proc : evals)
267
296
| (tr, st2) <- next
268
297
, Remain <- tr = applyTransitions st2 evals
269
298
| (tr, _) <- next
270
299
, Stop er <- tr = stopWith st er
271
- | otherwise = error $ baseErr ++ " .Internal.Process.applyTransitions:InvalidState"
300
+ | (tr, st2) <- next
301
+ , Enter s <- tr =
302
+ if s == stName then applyTransitions st2 evals
303
+ else do let st' = st2 { stName = s }
304
+ let evals' = if Q. null stQueue then evals
305
+ else (mapM_ Gen. push stQueue) : evals
306
+ applyTransitions st' evals'
307
+ | otherwise = error $ baseErr ++ " .Internal.Process.applyTransitions:InvalidTransition"
272
308
where
273
309
-- don't call if Q.null!
274
- next = let (t, q) = fromJust $ seqDequeue stTrans
310
+ next = let (t, q) = fromJust $ seqPop stTrans
275
311
in (t, st { stTrans = q })
276
312
277
313
baseErr :: String
278
314
baseErr = " Control.Distributed.Process.FSM"
279
315
280
316
decodeToEvent :: Serializable m => Event m -> P. Message -> Maybe (Event m )
281
317
decodeToEvent Wait msg = unwrapMessage msg >>= fmap Event
318
+ decodeToEvent (WaitP _) msg = unwrapMessage msg >>= fmap Event
282
319
decodeToEvent ev@ (Event _) _ = Just ev -- it's a bit odd that we'd end up here....
0 commit comments