|
37 | 37 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
38 | 38 | # SOFTWARE.
|
39 | 39 | import gc
|
| 40 | +import os |
40 | 41 | import time
|
41 | 42 |
|
42 | 43 | from . import CPyExtTestCase, CPyExtFunction, unhandled_error_compare, CPyExtType
|
@@ -114,31 +115,32 @@ class TestPyCapsule(CPyExtTestCase):
|
114 | 115 | cmpfunc=unhandled_error_compare
|
115 | 116 | )
|
116 | 117 |
|
117 |
| - def test_capsule_destructor(self): |
118 |
| - Tester = CPyExtType( |
119 |
| - "CapsuleDestructorTester", |
120 |
| - code=""" |
121 |
| - static void capsule_destructor(PyObject* capsule) { |
122 |
| - PyObject* contents = (PyObject*) PyCapsule_GetPointer(capsule, "capsule"); |
123 |
| - assert(PyDict_Check(contents)); |
124 |
| - PyDict_SetItemString(contents, "destructor_was_here", Py_NewRef(Py_True)); |
125 |
| - Py_DECREF(contents); |
126 |
| - } |
127 |
| - |
128 |
| - static PyObject* create_capsule(PyObject* unused, PyObject* contents) { |
129 |
| - return PyCapsule_New(Py_NewRef(contents), "capsule", capsule_destructor); |
130 |
| - } |
131 |
| - """, |
132 |
| - tp_methods='{"create_capsule", (PyCFunction)create_capsule, METH_O | METH_STATIC, NULL}', |
133 |
| - ) |
134 |
| - d = {} |
135 |
| - capsule = Tester.create_capsule(d) |
136 |
| - assert capsule |
137 |
| - assert not d |
138 |
| - del capsule |
139 |
| - start = time.time() |
140 |
| - while "destructor_was_here" not in d: |
141 |
| - if time.time() - start > 60: |
142 |
| - raise AssertionError("Capsule destructor didn't execute within timeout") |
143 |
| - gc.collect() |
144 |
| - time.sleep(0.01) |
| 118 | + if os.environ.get('GRAALPYTEST_RUN_GC_TESTS'): |
| 119 | + def test_capsule_destructor(self): |
| 120 | + Tester = CPyExtType( |
| 121 | + "CapsuleDestructorTester", |
| 122 | + code=""" |
| 123 | + static void capsule_destructor(PyObject* capsule) { |
| 124 | + PyObject* contents = (PyObject*) PyCapsule_GetPointer(capsule, "capsule"); |
| 125 | + assert(PyDict_Check(contents)); |
| 126 | + PyDict_SetItemString(contents, "destructor_was_here", Py_NewRef(Py_True)); |
| 127 | + Py_DECREF(contents); |
| 128 | + } |
| 129 | + |
| 130 | + static PyObject* create_capsule(PyObject* unused, PyObject* contents) { |
| 131 | + return PyCapsule_New(Py_NewRef(contents), "capsule", capsule_destructor); |
| 132 | + } |
| 133 | + """, |
| 134 | + tp_methods='{"create_capsule", (PyCFunction)create_capsule, METH_O | METH_STATIC, NULL}', |
| 135 | + ) |
| 136 | + d = {} |
| 137 | + capsule = Tester.create_capsule(d) |
| 138 | + assert capsule |
| 139 | + assert not d |
| 140 | + del capsule |
| 141 | + start = time.time() |
| 142 | + while "destructor_was_here" not in d: |
| 143 | + if time.time() - start > 60: |
| 144 | + raise AssertionError("Capsule destructor didn't execute within timeout") |
| 145 | + gc.collect() |
| 146 | + time.sleep(0.01) |
0 commit comments