typedef struct {
+ PyTypeObject *excepthook_type;
PyTypeObject *lock_type;
PyTypeObject *local_type;
PyTypeObject *local_dummy_type;
\n\
Type used to pass arguments to threading.excepthook.");
-static PyTypeObject ExceptHookArgsType;
-
static PyStructSequence_Field ExceptHookArgs_fields[] = {
{"exc_type", "Exception type"},
{"exc_value", "Exception value"},
static PyObject *
-thread_excepthook(PyObject *self, PyObject *args)
+thread_excepthook(PyObject *module, PyObject *args)
{
- if (!Py_IS_TYPE(args, &ExceptHookArgsType)) {
+ thread_module_state *state = get_thread_state(module);
+
+ if (!Py_IS_TYPE(args, state->excepthook_type)) {
PyErr_SetString(PyExc_TypeError,
"_thread.excepthook argument type "
"must be ExceptHookArgs");
return -1;
}
- if (ExceptHookArgsType.tp_name == NULL) {
- if (PyStructSequence_InitType2(&ExceptHookArgsType,
- &ExceptHookArgs_desc) < 0) {
- return -1;
- }
- }
-
// Add module attributes
if (PyDict_SetItemString(d, "error", ThreadError) < 0) {
return -1;
}
- if (PyModule_AddType(module, &ExceptHookArgsType) < 0) {
+
+ // _ExceptHookArgs type
+ state->excepthook_type = PyStructSequence_NewType(&ExceptHookArgs_desc);
+ if (state->excepthook_type == NULL) {
+ return -1;
+ }
+ if (PyModule_AddType(module, state->excepthook_type) < 0) {
return -1;
}
thread_module_traverse(PyObject *module, visitproc visit, void *arg)
{
thread_module_state *state = get_thread_state(module);
+ Py_VISIT(state->excepthook_type);
Py_VISIT(state->lock_type);
Py_VISIT(state->local_type);
Py_VISIT(state->local_dummy_type);
thread_module_clear(PyObject *module)
{
thread_module_state *state = get_thread_state(module);
+ Py_CLEAR(state->excepthook_type);
Py_CLEAR(state->lock_type);
Py_CLEAR(state->local_type);
Py_CLEAR(state->local_dummy_type);