| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- #include "coroutines.h"
- #if __S3E__
- #define OXYGINE_COROUTINES
- #include "IwFibre.h"
- #elif OXYGINE_EDITOR
- #elif OXYGINE_SDL
- #ifndef __APPLE__
- //#include "greenlet.h"
- #else
- #endif
- #else
- #endif
- #define GREENLETS 0
- namespace oxygine
- {
- namespace coroutine
- {
- int fiberPassData = 0;
- void init()
- {
- #if __S3E__
- #elif GREENLETS
- greenlets_init();
- #else
- #endif
- }
- handle current()
- {
- #if __S3E__
- handle f = (handle)IwFibreGetCurrent();
- return f;
- #elif GREENLETS
- handle f = (handle)greenlet_getcurrent();
- return f;
- #else
- OX_ASSERT(!"not implemented");
- return 0;
- #endif
- }
- handle create(fiberFunc func, int stackSize, void* param)
- {
- #if __S3E__
- handle f = (handle)IwFibreCreate(func, stackSize, param, 0);
- return f;
- #elif GREENLETS
- handle f = (handle)greenlet_create((gr_callback)func);
- return f;
- #else
- #endif
- return 0;
- }
- void terminate(handle fiber, int data)
- {
- #if __S3E__
- if (data)
- resume(fiber, data);
- IwFibreJoin((IwFibre*)fiber);
- IwFibreDelete((IwFibre*)fiber);
- #elif GREENLETS
- greenlet_kill((greenlet*)fiber);
- #else
- //assert(0);
- #endif
- }
- int resume(handle fiber, int data)
- {
- fiberPassData = data;
- int r = 0;
- #if __S3E__
- IwFibreYield((IwFibre*)fiber);
- #elif GREENLETS
- if (!fiber)
- fiber = greenlet_getparent();
- r = greenlet_switch((greenlet*)fiber, data);
- #else
- #endif
- if (fiber == 0)
- {
- if (fiberPassData == 1)
- {
- throw FiberExit();
- }
- }
- return r;
- }
- bool isdead(handle fiber)
- {
- #if __S3E__
- return !IwFibreIsRunning((IwFibre*) fiber);
- #elif GREENLETS
- return greenlet_isdead((greenlet*) fiber) != 0;
- #else
- return false;
- #endif
- }
- }
- }
|