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 }
 };
-
openSUSE Build Service is sponsored by