greenlet.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /* vim:set noet ts=8 sw=8 : */
  2. /* Greenlet object interface */
  3. #ifndef Py_GREENLETOBJECT_H
  4. #define Py_GREENLETOBJECT_H
  5. #ifdef __cplusplus
  6. extern "C" {
  7. #endif
  8. #include <Python.h>
  9. #define GREENLET_VERSION "0.3.1"
  10. typedef struct _greenlet {
  11. PyObject_HEAD
  12. char* stack_start;
  13. char* stack_stop;
  14. char* stack_copy;
  15. long stack_saved;
  16. struct _greenlet* stack_prev;
  17. struct _greenlet* parent;
  18. PyObject* run_info;
  19. struct _frame* top_frame;
  20. int recursion_depth;
  21. PyObject* weakreflist;
  22. } PyGreenlet;
  23. #define PyGreenlet_Check(op) PyObject_TypeCheck(op, &PyGreenlet_Type)
  24. #define PyGreenlet_STARTED(op) (((PyGreenlet*)(op))->stack_stop != NULL)
  25. #define PyGreenlet_ACTIVE(op) (((PyGreenlet*)(op))->stack_start != NULL)
  26. #define PyGreenlet_GET_PARENT(op) (((PyGreenlet*)(op))->parent)
  27. /* C API functions */
  28. /* Total number of symbols that are exported */
  29. #define PyGreenlet_API_pointers 8
  30. #define PyGreenlet_Type_NUM 0
  31. #define PyExc_GreenletError_NUM 1
  32. #define PyExc_GreenletExit_NUM 2
  33. #define PyGreenlet_New_NUM 3
  34. #define PyGreenlet_GetCurrent_NUM 4
  35. #define PyGreenlet_Throw_NUM 5
  36. #define PyGreenlet_Switch_NUM 6
  37. #define PyGreenlet_SetParent_NUM 7
  38. #ifndef GREENLET_MODULE
  39. /* This section is used by modules that uses the greenlet C API */
  40. static void **_PyGreenlet_API = NULL;
  41. #define PyGreenlet_Type (*(PyTypeObject *) _PyGreenlet_API[PyGreenlet_Type_NUM])
  42. #define PyExc_GreenletError \
  43. ((PyObject *) _PyGreenlet_API[PyExc_GreenletError_NUM])
  44. #define PyExc_GreenletExit \
  45. ((PyObject *) _PyGreenlet_API[PyExc_GreenletExit_NUM])
  46. /*
  47. * PyGreenlet_New(PyObject *args)
  48. *
  49. * greenlet.greenlet(run, parent=None)
  50. */
  51. #define PyGreenlet_New \
  52. (* (PyGreenlet * (*)(PyObject *run, PyGreenlet *parent)) \
  53. _PyGreenlet_API[PyGreenlet_New_NUM])
  54. /*
  55. * PyGreenlet_GetCurrent(void)
  56. *
  57. * greenlet.getcurrent()
  58. */
  59. #define PyGreenlet_GetCurrent \
  60. (* (PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM])
  61. /*
  62. * PyGreenlet_Throw(
  63. * PyGreenlet *greenlet,
  64. * PyObject *typ,
  65. * PyObject *val,
  66. * PyObject *tb)
  67. *
  68. * g.throw(...)
  69. */
  70. #define PyGreenlet_Throw \
  71. (* (PyObject * (*) \
  72. (PyGreenlet *self, PyObject *typ, PyObject *val, PyObject *tb)) \
  73. _PyGreenlet_API[PyGreenlet_Throw_NUM])
  74. /*
  75. * PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args)
  76. *
  77. * g.switch(*args, **kwargs)
  78. */
  79. #define PyGreenlet_Switch \
  80. (* (PyObject * (*)(PyGreenlet *greenlet, PyObject *args, PyObject *kwargs)) \
  81. _PyGreenlet_API[PyGreenlet_Switch_NUM])
  82. /*
  83. * PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent)
  84. *
  85. * g.parent = new_parent
  86. */
  87. #define PyGreenlet_SetParent \
  88. (* (PyObject * (*)(PyGreenlet *greenlet, PyGreenlet *nparent)) \
  89. _PyGreenlet_API[PyGreenlet_SetParent_NUM])
  90. /* Macro that imports greenlet and initializes C API */
  91. #define PyGreenlet_Import() \
  92. { \
  93. PyObject *module = PyImport_ImportModule("greenlet"); \
  94. if (module != NULL) { \
  95. PyObject *c_api_object = PyObject_GetAttrString( \
  96. module, "_C_API"); \
  97. if (c_api_object != NULL && PyCObject_Check(c_api_object)) { \
  98. _PyGreenlet_API = \
  99. (void **) PyCObject_AsVoidPtr(c_api_object); \
  100. Py_DECREF(c_api_object); \
  101. } \
  102. Py_DECREF(module); \
  103. } \
  104. }
  105. #endif /* GREENLET_MODULE */
  106. #ifdef __cplusplus
  107. }
  108. #endif
  109. #endif /* !Py_GREENLETOBJECT_H */