|
|
@@ -1,110 +0,0 @@
|
|
|
-#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
|
|
|
- }
|
|
|
- }
|
|
|
-}
|