cimport cython

# This file must not cimport anything from gevent.

cdef wref

cdef BlockingSwitchOutError


cdef extern from "greenlet/greenlet.h":

    ctypedef class greenlet.greenlet [object PyGreenlet]:
        pass

    # These are actually macros and so much be included
    # (defined) in each .pxd, as are the two functions
    # that call them.
    greenlet PyGreenlet_GetCurrent()
    object PyGreenlet_Switch(greenlet self, void* args, void* kwargs)
    void PyGreenlet_Import()

@cython.final
cdef inline greenlet getcurrent():
    return PyGreenlet_GetCurrent()

cdef bint _greenlet_imported

cdef inline void greenlet_init():
    global _greenlet_imported
    if not _greenlet_imported:
        PyGreenlet_Import()
        _greenlet_imported = True

cdef inline object _greenlet_switch(greenlet self):
    return PyGreenlet_Switch(self, NULL, NULL)

cdef class TrackedRawGreenlet(greenlet):
    pass

cdef class SwitchOutGreenletWithLoop(TrackedRawGreenlet):
    cdef public loop

    cpdef switch(self)
    cpdef switch_out(self)