Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes15kdownloads
PyGreenletUnswitchable.cpp151 linesDownload Raw Back to greenlet
1/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */
2/**
3   Implementation of the Python slots for PyGreenletUnswitchable_Type
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;
30using greenlet::LockInitError;
31using greenlet::PyErrOccurred;
32using greenlet::Require;
33
34using greenlet::g_handle_exit;
35using greenlet::single_result;
36
37using greenlet::Greenlet;
38using greenlet::UserGreenlet;
39using greenlet::MainGreenlet;
40using greenlet::BrokenGreenlet;
41using greenlet::ThreadState;
42using greenlet::PythonState;
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=nullptr
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,
132    .tp_flags = G_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
133    .tp_doc = "Undocumented internal class for testing error conditions",
134    .tp_traverse = (traverseproc)green_traverse,
135    .tp_clear = (inquiry)green_clear,
136
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#ifndef Py_GIL_DISABLED
144    // See comments in the base type
145    .tp_is_gc = (inquiry)green_is_gc,
146#endif
147};
148
149
150#endif
151 
codekingpro/portable-devtools · Team Ai