coroutines.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #include "coroutines.h"
  2. #if __S3E__
  3. #define OXYGINE_COROUTINES
  4. #include "IwFibre.h"
  5. #elif OXYGINE_EDITOR
  6. #elif OXYGINE_SDL
  7. #ifndef __APPLE__
  8. //#include "greenlet.h"
  9. #else
  10. #endif
  11. #else
  12. #endif
  13. #define GREENLETS 0
  14. namespace oxygine
  15. {
  16. namespace coroutine
  17. {
  18. int fiberPassData = 0;
  19. void init()
  20. {
  21. #if __S3E__
  22. #elif GREENLETS
  23. greenlets_init();
  24. #else
  25. #endif
  26. }
  27. handle current()
  28. {
  29. #if __S3E__
  30. handle f = (handle)IwFibreGetCurrent();
  31. return f;
  32. #elif GREENLETS
  33. handle f = (handle)greenlet_getcurrent();
  34. return f;
  35. #else
  36. OX_ASSERT(!"not implemented");
  37. return 0;
  38. #endif
  39. }
  40. handle create(fiberFunc func, int stackSize, void* param)
  41. {
  42. #if __S3E__
  43. handle f = (handle)IwFibreCreate(func, stackSize, param, 0);
  44. return f;
  45. #elif GREENLETS
  46. handle f = (handle)greenlet_create((gr_callback)func);
  47. return f;
  48. #else
  49. #endif
  50. return 0;
  51. }
  52. void terminate(handle fiber, int data)
  53. {
  54. #if __S3E__
  55. if (data)
  56. resume(fiber, data);
  57. IwFibreJoin((IwFibre*)fiber);
  58. IwFibreDelete((IwFibre*)fiber);
  59. #elif GREENLETS
  60. greenlet_kill((greenlet*)fiber);
  61. #else
  62. //assert(0);
  63. #endif
  64. }
  65. int resume(handle fiber, int data)
  66. {
  67. fiberPassData = data;
  68. int r = 0;
  69. #if __S3E__
  70. IwFibreYield((IwFibre*)fiber);
  71. #elif GREENLETS
  72. if (!fiber)
  73. fiber = greenlet_getparent();
  74. r = greenlet_switch((greenlet*)fiber, data);
  75. #else
  76. #endif
  77. if (fiber == 0)
  78. {
  79. if (fiberPassData == 1)
  80. {
  81. throw FiberExit();
  82. }
  83. }
  84. return r;
  85. }
  86. bool isdead(handle fiber)
  87. {
  88. #if __S3E__
  89. return !IwFibreIsRunning((IwFibre*) fiber);
  90. #elif GREENLETS
  91. return greenlet_isdead((greenlet*) fiber) != 0;
  92. #else
  93. return false;
  94. #endif
  95. }
  96. }
  97. }