fiber.monkey2 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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 provide support for asynchronous programming.
  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 [[Fiber.Current]].
  20. * Suspended. A fiber is in the suspended state if it has called [[Fiber.Suspend]]. A suspended fiber can only be returned to the running state 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 fiber will continue running when the fiber it resumed calls [[Suspend]] or exits normally.
  22. * Terminated. The fiber has either returned from i's entry function, or has been explicitly terminated via a call to [[Terminate]].
  23. #end
  24. Struct Fiber
  25. #rem monkeydoc Creates a new fiber.
  26. Creates a new fiber and starts it running.
  27. #end
  28. Method New( entry:Void() )
  29. _fiber=StartFiber( entry )
  30. End
  31. #rem monkeydoc @hidden
  32. #end
  33. Property Debug:String()
  34. Return _fiber
  35. End
  36. #rem monkeydoc Resumes a suspended fiber.
  37. #end
  38. Method Resume()
  39. ResumeFiber( _fiber )
  40. End
  41. #rem monkeydoc Terminates a fiber.
  42. #end
  43. Method Terminate()
  44. TerminateFiber( _fiber )
  45. End
  46. #rem monkeydoc Suspends the current fiber.
  47. #end
  48. Function Suspend()
  49. SuspendCurrentFiber()
  50. End
  51. #rem monkeydoc Gets the main fiber.
  52. Suspending the main fiber will result in a runtime error.
  53. #end
  54. Function Main:Fiber()
  55. Return _main
  56. End
  57. #rem monkeydoc Gets the currently running fiber.
  58. #end
  59. Function Current:Fiber()
  60. Return New Fiber( GetCurrentFiber() )
  61. End
  62. #rem monkeydoc Puts current fiber to sleep.
  63. #end
  64. Function Sleep( seconds:Double )
  65. CurrentFiberSleep( seconds )
  66. End
  67. #rem monkeydoc @hidden - not really needed?
  68. #end
  69. Function CreateSuspended:Fiber( entry:Void() )
  70. Return New Fiber( CreateFiber( entry ) )
  71. End
  72. Private
  73. Field _fiber:Int
  74. Global _main:=New Fiber( 0 )
  75. Method New( fiber:Int )
  76. _fiber=fiber
  77. End
  78. End
  79. #endif