fiber.monkey2 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. Namespace std.fiber
  2. #if __TARGET__<>"emscripten"
  3. #import "fcontext"
  4. #import "native/fcontext.cpp"
  5. #Import "native/fiber.cpp"
  6. #Import "native/fiber.h"
  7. Extern Private
  8. Function StartFiber:Int( entry:Void() )="bbFiber::startFiber"
  9. Function CreateFiber:Int( entry:Void() )="bbFiber::createFiber"
  10. Function ResumeFiber:Void( fiber:Int )="bbFiber::resumeFiber"
  11. Function TerminateFiber:Void( fiber:Int )="bbFiber::terminateFiber"
  12. Function SuspendCurrentFiber:Void()="bbFiber::suspendCurrentFiber"
  13. Function GetCurrentFiber:Int()="bbFiber::getCurrentFiber"
  14. Public
  15. #rem monkeydoc Fibers provides support for cooperative multitasking.
  16. A Fiber is a lightweight 'thread of execution' that can be used to achieve a form of cooperative multitasking.
  17. A fiber can be in one of 4 states:
  18. * Running. There is only ever one fiber in the running state at a time. This is the fiber returned by [[Current]].
  19. * Suspended. A fiber is in the suspended state if it has called [[Suspend]]. A suspended fiber can only be returned to the running state
  20. by some other fiber calling [[Resume]] on it.
  21. * Paused. A fiber is in the paused state after it has called [[Resume]] on another fiber and that fiber has resumed running. A paused
  22. fiber will continue running when the fiber it resumed calls [[Suspend]] or exits normally. A fiber is also paused after creating a new
  23. fiber, ie: creating a new fiber also implicty resumes the new fiber.
  24. * Terminated. The fiber has either returned from it's entry function, or has been explicitly terminated via a call to [[Terminate]].
  25. #end
  26. Struct Fiber
  27. #rem monkeydoc Creates a new fiber.
  28. Creates a new fiber and starts it running.
  29. #end
  30. Method New( entry:Void() )
  31. _fiber=StartFiber( entry )
  32. End
  33. #rem monkeydoc @hidden
  34. #end
  35. Property Debug:String()
  36. Return _fiber
  37. End
  38. #rem monkeydoc Resumes a suspended fiber.
  39. #end
  40. Method Resume()
  41. ResumeFiber( _fiber )
  42. End
  43. #rem monkeydoc Terminates a fiber.
  44. #end
  45. Method Terminate()
  46. TerminateFiber( _fiber )
  47. End
  48. #rem monkeydoc Suspends the current fiber.
  49. #end
  50. Function Suspend()
  51. SuspendCurrentFiber()
  52. End
  53. #rem monkeydoc Gets the main fiber.
  54. Suspending the main fiber will result in a runtime error.
  55. #end
  56. Function Main:Fiber()
  57. Return _main
  58. End
  59. #rem monkeydoc Gets the currently running fiber.
  60. #end
  61. Function Current:Fiber()
  62. Return New Fiber( GetCurrentFiber() )
  63. End
  64. #rem monkeydoc @hidden - not really needed?
  65. #end
  66. Function CreateSuspended:Fiber( entry:Void() )
  67. Return New Fiber( CreateFiber( entry ) )
  68. End
  69. Private
  70. Field _fiber:Int
  71. Global _main:=New Fiber( 0 )
  72. Method New( fiber:Int )
  73. _fiber=fiber
  74. End
  75. End
  76. #endif