Qucs-S S-parameter Viewer & RF Synthesis Tools
Loading...
Searching...
No Matches
PyGreenletUnswitchable.cpp
1/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */
5#ifndef PY_GREENLET_UNSWITCHABLE_CPP
6#define PY_GREENLET_UNSWITCHABLE_CPP
7
8
9
10#define PY_SSIZE_T_CLEAN
11#include <Python.h>
12#include "structmember.h" // PyMemberDef
13
14#include "greenlet_internal.hpp"
15// Code after this point can assume access to things declared in stdint.h,
16// including the fixed-width types. This goes for the platform-specific switch functions
17// as well.
18#include "greenlet_refs.hpp"
19#include "greenlet_slp_switch.hpp"
20
21#include "greenlet_thread_support.hpp"
22#include "TGreenlet.hpp"
23
24#include "TGreenlet.cpp"
25#include "TGreenletGlobals.cpp"
26#include "TThreadStateDestroy.cpp"
27
28
29using greenlet::LockGuard;
32using greenlet::Require;
33
34using greenlet::g_handle_exit;
35using greenlet::single_result;
36
43
44
45#include "PyGreenlet.hpp"
46
47static PyGreenlet*
48green_unswitchable_new(PyTypeObject* type, PyObject* UNUSED(args), PyObject* UNUSED(kwds))
49{
50 PyGreenlet* o =
51 (PyGreenlet*)PyBaseObject_Type.tp_new(type, mod_globs->empty_tuple, mod_globs->empty_dict);
52 if (o) {
53 new BrokenGreenlet(o, GET_THREAD_STATE().state().borrow_current());
54 assert(Py_REFCNT(o) == 1);
55 }
56 return o;
57}
58
59static PyObject*
60green_unswitchable_getforce(PyGreenlet* self, void* UNUSED(context))
61{
62 BrokenGreenlet* broken = dynamic_cast<BrokenGreenlet*>(self->pimpl);
63 return PyBool_FromLong(broken->_force_switch_error);
64}
65
66static int
67green_unswitchable_setforce(PyGreenlet* self, PyObject* nforce, void* UNUSED(context))
68{
69 if (!nforce) {
70 PyErr_SetString(
71 PyExc_AttributeError,
72 "Cannot delete force_switch_error"
73 );
74 return -1;
75 }
76 BrokenGreenlet* broken = dynamic_cast<BrokenGreenlet*>(self->pimpl);
77 int is_true = PyObject_IsTrue(nforce);
78 if (is_true == -1) {
79 return -1;
80 }
81 broken->_force_switch_error = is_true;
82 return 0;
83}
84
85static PyObject*
86green_unswitchable_getforceslp(PyGreenlet* self, void* UNUSED(context))
87{
88 BrokenGreenlet* broken = dynamic_cast<BrokenGreenlet*>(self->pimpl);
89 return PyBool_FromLong(broken->_force_slp_switch_error);
90}
91
92static int
93green_unswitchable_setforceslp(PyGreenlet* self, PyObject* nforce, void* UNUSED(context))
94{
95 if (!nforce) {
96 PyErr_SetString(
97 PyExc_AttributeError,
98 "Cannot delete force_slp_switch_error"
99 );
100 return -1;
101 }
102 BrokenGreenlet* broken = dynamic_cast<BrokenGreenlet*>(self->pimpl);
103 int is_true = PyObject_IsTrue(nforce);
104 if (is_true == -1) {
105 return -1;
106 }
107 broken->_force_slp_switch_error = is_true;
108 return 0;
109}
110
111static PyGetSetDef green_unswitchable_getsets[] = {
112 /* name, getter, setter, doc, closure (context pointer) */
113 {
114 .name="force_switch_error",
115 .get=(getter)green_unswitchable_getforce,
116 .set=(setter)green_unswitchable_setforce,
117 .doc=NULL
118 },
119 {
120 .name="force_slp_switch_error",
121 .get=(getter)green_unswitchable_getforceslp,
122 .set=(setter)green_unswitchable_setforceslp,
123 .doc=nullptr
124 },
125 {.name=nullptr}
126};
127
128PyTypeObject PyGreenletUnswitchable_Type = {
129 .ob_base=PyVarObject_HEAD_INIT(NULL, 0)
130 .tp_name="greenlet._greenlet.UnswitchableGreenlet",
131 .tp_dealloc= (destructor)green_dealloc, /* tp_dealloc */
132 .tp_flags=G_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
133 .tp_doc="Undocumented internal class", /* tp_doc */
134 .tp_traverse=(traverseproc)green_traverse, /* tp_traverse */
135 .tp_clear=(inquiry)green_clear, /* tp_clear */
136
137 .tp_getset=green_unswitchable_getsets, /* tp_getset */
138 .tp_base=&PyGreenlet_Type, /* tp_base */
139 .tp_init=(initproc)green_init, /* tp_init */
140 .tp_alloc=PyType_GenericAlloc, /* tp_alloc */
141 .tp_new=(newfunc)green_unswitchable_new, /* tp_new */
142 .tp_free=PyObject_GC_Del, /* tp_free */
143 .tp_is_gc=(inquiry)green_is_gc, /* tp_is_gc */
144};
145
146
147#endif
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
Definition greenlet.h:22