/server/thread_state.ml

http://github.com/hhughes/ocaml-frui · OCaml · 49 lines · 44 code · 5 blank · 0 comment · 31 complexity · 1b3c53a15394ea4f8b91ac65e98ea38a MD5 · raw file

  1. let seed = 0
  2. let _ = Random.init seed
  3. let latest_tid = ref 0
  4. let next_tid () = let tid = !latest_tid in latest_tid := tid+1; tid
  5. type thread_state = Started | Running | FunEnter | FunExit | Msg | Finished | Stop
  6. class thread =
  7. object (self)
  8. val tid = next_tid ()
  9. val mutable in_fun = false
  10. val mutable state = Started
  11. val mutable fid = 0
  12. method enterexit = if in_fun then FunExit else FunEnter
  13. method stopexit = if in_fun then FunExit else Finished (* dont let us stop when in a function *)
  14. method next_state p = function
  15. | Started -> if p < 80 then Running else if p < 90 then self#enterexit else Msg
  16. | Running -> if p < 40 then Running else if p < 60 then self#enterexit else if p < 90 then Msg else self#stopexit
  17. | FunEnter -> if p < 50 then Running else if p < 70 then FunExit else Msg
  18. | FunExit -> if p < 40 then Running else if p < 50 then self#enterexit else if p < 80 then Msg else self#stopexit
  19. | Msg -> if p < 60 then Running else if p < 80 then self#enterexit else if p < 90 then Msg else self#stopexit
  20. | Finished -> Stop
  21. | Stop -> Stop
  22. method get_event a = function
  23. | Started -> (Events.create tid fid Events.TStart) :: a
  24. | Running -> a
  25. | FunEnter -> in_fun <- true; (Events.create tid fid Events.FunStart) :: a
  26. | FunExit -> let i = fid in fid <- i+1; in_fun <- false; (Events.create tid i Events.FunEnd) :: a
  27. | Msg -> (Events.create tid fid Events.Msg) :: a
  28. | Finished -> (Events.create tid fid Events.TEnd) :: a
  29. | Stop -> a
  30. method next_event a =
  31. let e = self#get_event a state in
  32. state <- self#next_state (Random.int 100) state;
  33. e
  34. method state = state
  35. end
  36. let threads = ref []
  37. let reset () =
  38. threads := [];
  39. latest_tid := 0
  40. let get_events () =
  41. threads := List.filter (fun t -> t#state <> Stop) !threads;
  42. if (Random.int 100) < 10 then threads := (new thread) :: !threads;
  43. let events = List.fold_right (fun t -> t#next_event) !threads [] in
  44. Json_io.string_of_json (Events.jsonify events)