aboutsummaryrefslogtreecommitdiffstats
path: root/python/gevent/__greenlet_primitives.pxd
blob: 18381f1bfad53b6e54eded11a702150fe955664c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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)