File onboard-1.4.1-GIL-for-obj-alloc.patch of Package onboard
--- onboard-1.4.1/Onboard/osk/osk_devices.c.org 2017-02-15 09:42:04.000000000 +0100
+++ onboard-1.4.1/Onboard/osk/osk_devices.c 2023-12-03 11:43:02.675569565 +0100
@@ -50,6 +50,13 @@
#define OSK_SLAVE_ATTACHED_EVENT 1102
#define OSK_SLAVE_DETACHED_EVENT 1103
+#define GIL_PROTECTED(op) { \
+ PyGILState_STATE gstate; \
+ gstate = PyGILState_Ensure(); \
+ op; \
+ PyGILState_Release(gstate); \
+ }
+
typedef struct {
PyObject_HEAD
@@ -90,14 +97,19 @@
static void
osk_device_event_dealloc (OskDeviceEvent* self)
{
- Py_DECREF(self->source_device);
+ GIL_PROTECTED( Py_DECREF(self->source_device); )
OSK_FINISH_DEALLOC (self);
}
static OskDeviceEvent*
new_device_event (void)
{
- OskDeviceEvent *ev = PyObject_New(OskDeviceEvent, &osk_device_event_type);
+ OskDeviceEvent *ev;
+
+ GIL_PROTECTED(
+ ev = PyObject_New(OskDeviceEvent, &osk_device_event_type);
+ )
+
if (ev)
{
osk_device_event_type.tp_init((PyObject*) ev, NULL, NULL);
@@ -129,9 +141,11 @@
ev->sequence = self->sequence;
ev->time = self->time;
- Py_DECREF(ev->source_device);
- ev->source_device = self->source_device;
- Py_INCREF(ev->source_device);
+ GIL_PROTECTED(
+ Py_DECREF(ev->source_device);
+ ev->source_device = self->source_device;
+ Py_INCREF(ev->source_device);
+ )
}
return (PyObject*) ev;
}
@@ -145,16 +159,18 @@
static PyObject *
osk_device_event_set_source_device (OskDeviceEvent* self, PyObject* value)
{
- Py_DECREF(self->source_device);
- self->source_device = value;
- Py_INCREF(self->source_device);
+ GIL_PROTECTED(
+ Py_DECREF(self->source_device);
+ self->source_device = value;
+ Py_INCREF(self->source_device);
+ )
Py_RETURN_NONE;
}
static PyObject *
osk_device_event_get_source_device (OskDeviceEvent* self, PyObject *args)
{
- Py_INCREF(self->source_device);
+ GIL_PROTECTED( Py_INCREF(self->source_device); )
return self->source_device;
}
@@ -291,7 +307,7 @@
if (!dev->event_queue)
return -1;
- Py_INCREF (dev->event_handler);
+ GIL_PROTECTED( Py_INCREF (dev->event_handler); )
XISetMask (mask, XI_HierarchyChanged);
@@ -320,7 +336,7 @@
(GdkFilterFunc) osk_devices_event_filter,
dev);
- Py_DECREF (dev->event_handler);
+ GIL_PROTECTED( Py_DECREF (dev->event_handler); )
if (dev->event_queue)
{
@@ -354,14 +370,14 @@
{
//printf("deleting %d %d\n", e->type, event->type);
g_queue_delete_link(queue, element);
- Py_DECREF(e);
+ GIL_PROTECTED( Py_DECREF(e); )
}
element = next;
}
}
// Enqueue the event.
- Py_INCREF(event);
+ GIL_PROTECTED( Py_INCREF(event); )
g_queue_push_head(queue, event);
}
}
@@ -386,16 +402,18 @@
result = PyObject_CallObject(dev->event_handler, arglist);
if (result)
- Py_DECREF (result);
+ GIL_PROTECTED( Py_DECREF (result); )
else
PyErr_Print ();
- Py_DECREF (dev->event_handler);
- Py_DECREF (arglist);
+ GIL_PROTECTED(
+ Py_DECREF (dev->event_handler);
+ Py_DECREF (arglist);
+ )
}
- Py_DECREF (event);
+ GIL_PROTECTED( Py_DECREF (event); )
}
PyGILState_Release (state);
@@ -405,7 +423,7 @@
static void free_event_queue_element(gpointer data)
{
- Py_DECREF(data);
+ GIL_PROTECTED( Py_DECREF(data); )
}
@@ -428,7 +446,7 @@
queue_event (dev, ev, False);
- Py_DECREF(ev);
+ GIL_PROTECTED( Py_DECREF(ev); )
}
}
@@ -469,7 +487,7 @@
queue_event (dev, ev, type == XI_Motion);
- Py_DECREF(ev);
+ GIL_PROTECTED( Py_DECREF(ev); )
}
}
@@ -496,7 +514,7 @@
queue_event (dev, ev, False);
- Py_DECREF(ev);
+ GIL_PROTECTED( Py_DECREF(ev); )
}
}
@@ -1034,7 +1052,7 @@
if (PyList_SetItem (list, i, value) < 0)
{
- Py_DECREF (value);
+ GIL_PROTECTED( Py_DECREF (value); )
goto error;
}
}
@@ -1350,4 +1368,3 @@
{ "get_client_pointer", osk_devices_get_client_pointer, METH_NOARGS, NULL },
{ NULL, NULL, 0, NULL }
};
-