5#ifndef PY_GREENLET_UNSWITCHABLE_CPP
6#define PY_GREENLET_UNSWITCHABLE_CPP
10#define PY_SSIZE_T_CLEAN
12#include "structmember.h"
14#include "greenlet_internal.hpp"
18#include "greenlet_refs.hpp"
19#include "greenlet_slp_switch.hpp"
21#include "greenlet_thread_support.hpp"
22#include "TGreenlet.hpp"
24#include "TGreenlet.cpp"
25#include "TGreenletGlobals.cpp"
26#include "TThreadStateDestroy.cpp"
29using greenlet::LockGuard;
32using greenlet::Require;
34using greenlet::g_handle_exit;
35using greenlet::single_result;
45#include "PyGreenlet.hpp"
48green_unswitchable_new(PyTypeObject* type, PyObject* UNUSED(args), PyObject* UNUSED(kwds))
51 (
PyGreenlet*)PyBaseObject_Type.tp_new(type, mod_globs->empty_tuple, mod_globs->empty_dict);
53 new BrokenGreenlet(o, GET_THREAD_STATE().state().borrow_current());
54 assert(Py_REFCNT(o) == 1);
60green_unswitchable_getforce(
PyGreenlet* self,
void* UNUSED(context))
63 return PyBool_FromLong(broken->_force_switch_error);
67green_unswitchable_setforce(
PyGreenlet* self, PyObject* nforce,
void* UNUSED(context))
72 "Cannot delete force_switch_error"
77 int is_true = PyObject_IsTrue(nforce);
81 broken->_force_switch_error = is_true;
86green_unswitchable_getforceslp(
PyGreenlet* self,
void* UNUSED(context))
89 return PyBool_FromLong(broken->_force_slp_switch_error);
93green_unswitchable_setforceslp(
PyGreenlet* self, PyObject* nforce,
void* UNUSED(context))
98 "Cannot delete force_slp_switch_error"
103 int is_true = PyObject_IsTrue(nforce);
107 broken->_force_slp_switch_error = is_true;
111static PyGetSetDef green_unswitchable_getsets[] = {
114 .name=
"force_switch_error",
115 .get=(getter)green_unswitchable_getforce,
116 .set=(setter)green_unswitchable_setforce,
120 .name=
"force_slp_switch_error",
121 .get=(getter)green_unswitchable_getforceslp,
122 .set=(setter)green_unswitchable_setforceslp,
128PyTypeObject PyGreenletUnswitchable_Type = {
129 .ob_base=PyVarObject_HEAD_INIT(NULL, 0)
130 .tp_name=
"greenlet._greenlet.UnswitchableGreenlet",
131 .tp_dealloc= (destructor)green_dealloc,
132 .tp_flags=G_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
133 .tp_doc=
"Undocumented internal class",
134 .tp_traverse=(traverseproc)green_traverse,
135 .tp_clear=(inquiry)green_clear,
137 .tp_getset=green_unswitchable_getsets,
138 .tp_base=&PyGreenlet_Type,
139 .tp_init=(initproc)green_init,
140 .tp_alloc=PyType_GenericAlloc,
141 .tp_new=(newfunc)green_unswitchable_new,
142 .tp_free=PyObject_GC_Del,
143 .tp_is_gc=(inquiry)green_is_gc,
Definition TGreenlet.hpp:731
Definition TGreenlet.hpp:343
Definition greenlet_thread_support.hpp:23
Definition TGreenlet.hpp:752
Definition greenlet_exceptions.hpp:17
Definition TGreenlet.hpp:105
Definition TThreadState.hpp:87
Definition TGreenlet.hpp:675