fiber.monkey2 2.8 KB

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