This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch devs/devilhorns/apos
in repository efl.

View the commit online.

commit 03fa728cdd2f295a2697a6c377bbfd66f4fd3476
Author: Christopher Michael <devilho...@comcast.net>
AuthorDate: Tue Nov 15 05:47:27 2022 -0500

    ecore_drm2: Add explicit thread support for drm Planes
---
 src/lib/ecore_drm2/ecore_drm2_planes.c | 96 +++++++++++++++++++++++++---------
 1 file changed, 71 insertions(+), 25 deletions(-)

diff --git a/src/lib/ecore_drm2/ecore_drm2_planes.c b/src/lib/ecore_drm2/ecore_drm2_planes.c
index c7d5216d77..a4a6ec900f 100644
--- a/src/lib/ecore_drm2/ecore_drm2_planes.c
+++ b/src/lib/ecore_drm2/ecore_drm2_planes.c
@@ -1,5 +1,23 @@
 #include "ecore_drm2_private.h"
 
+static Eina_Thread_Queue *thq = NULL;
+
+typedef struct
+{
+   Eina_Thread_Queue_Msg head;
+   Ecore_Drm2_Thread_Op_Code code;
+} Thread_Msg;
+
+static void _ecore_drm2_plane_state_thread_send(Ecore_Drm2_Thread_Op_Code code)
+{
+   Thread_Msg *msg;
+   void *ref;
+
+   msg = eina_thread_queue_send(thq, sizeof(Thread_Msg), &ref);
+   msg->code = code;
+   eina_thread_queue_send_done(thq, ref);
+}
+
 static void
 _ecore_drm2_plane_state_debug(Ecore_Drm2_Plane *plane)
 {
@@ -156,38 +174,59 @@ _ecore_drm2_plane_state_fill(Ecore_Drm2_Plane *plane)
      }
 
    sym_drmModeFreeObjectProperties(oprops);
+
+   /* send message to thread for debug printing plane state */
+   _ecore_drm2_plane_state_thread_send(ECORE_DRM2_THREAD_CODE_DEBUG);
+}
+
+static void
+_ecore_drm2_plane_state_commit(Ecore_Drm2_Plane *plane EINA_UNUSED)
+{
+   /* Ecore_Drm2_Plane_State *pstate; */
+
+   /* pstate = plane->state; */
+   DBG("Plane Commit");
 }
 
 static void
 _ecore_drm2_plane_state_thread(void *data, Ecore_Thread *thread EINA_UNUSED)
 {
    Ecore_Drm2_Plane *plane;
+   Thread_Msg *msg;
+   void *ref;
 
    plane = data;
-   if (!plane->state)
-     _ecore_drm2_plane_state_fill(plane);
-   else
+
+   eina_thread_name_set(eina_thread_self(), "Ecore-drm2-plane");
+
+   while (!ecore_thread_check(thread))
      {
-        /* TODO: update atomic state for commit */
+        msg = eina_thread_queue_wait(thq, &ref);
+        if (msg)
+          {
+             switch (msg->code)
+               {
+                case ECORE_DRM2_THREAD_CODE_FILL:
+                  _ecore_drm2_plane_state_fill(plane);
+                  break;
+                case ECORE_DRM2_THREAD_CODE_COMMIT:
+                  _ecore_drm2_plane_state_commit(plane);
+                  break;
+                case ECORE_DRM2_THREAD_CODE_DEBUG:
+                  _ecore_drm2_plane_state_debug(plane);
+                  break;
+                default:
+                  break;
+               }
+             eina_thread_queue_wait_done(thq, ref);
+          }
      }
 }
 
 static void
-_ecore_drm2_plane_state_thread_end(void *data, Ecore_Thread *thread EINA_UNUSED)
+_ecore_drm2_plane_state_thread_notify(void *data EINA_UNUSED, Ecore_Thread *thread EINA_UNUSED, void *msg)
 {
-   Ecore_Drm2_Plane *plane;
-
-   plane = data;
-   _ecore_drm2_plane_state_debug(plane);
-}
-
-static void
-_ecore_drm2_plane_state_thread_cancel(void *data, Ecore_Thread *thread EINA_UNUSED)
-{
-   Ecore_Drm2_Plane *plane;
-
-   plane = data;
-   plane->thread = NULL;
+   free(msg);
 }
 
 static Ecore_Drm2_Plane *
@@ -217,6 +256,7 @@ Eina_Bool
 _ecore_drm2_planes_create(Ecore_Drm2_Device *dev)
 {
    Ecore_Drm2_Plane *plane;
+   drmModePlanePtr p;
    drmModePlaneResPtr pres;
    uint32_t i = 0;
 
@@ -226,27 +266,29 @@ _ecore_drm2_planes_create(Ecore_Drm2_Device *dev)
 
    for (; i < pres->count_planes; i++)
      {
-        drmModePlanePtr p;
-
         /* try to get this plane from drm */
         p = sym_drmModeGetPlane(dev->fd, pres->planes[i]);
         if (!p) continue;
 
         /* try to create a plane */
         plane = _ecore_drm2_plane_create(dev, p, pres->planes[i]);
-        if (!plane) continue;
+        if (!plane) goto err;
 
         /* NB: Use an explicit thread to fill plane atomic state */
         plane->thread =
           ecore_thread_feedback_run(_ecore_drm2_plane_state_thread,
-                                    NULL, // _ecore_drm2_plane_state_thread_notify
-                                    _ecore_drm2_plane_state_thread_end,
-                                    _ecore_drm2_plane_state_thread_cancel,
-                                    plane, EINA_TRUE);
+                                    _ecore_drm2_plane_state_thread_notify,
+                                    NULL, NULL, plane, EINA_TRUE);
      }
 
    sym_drmModeFreePlaneResources(pres);
    return EINA_TRUE;
+
+err:
+   _ecore_drm2_planes_destroy(dev);
+   sym_drmModeFreePlane(p);
+   sym_drmModeFreePlaneResources(pres);
+   return EINA_FALSE;
 }
 
 void
@@ -256,8 +298,12 @@ _ecore_drm2_planes_destroy(Ecore_Drm2_Device *dev)
 
    EINA_LIST_FREE(dev->planes, plane)
      {
+        if (plane->thread) ecore_thread_cancel(plane->thread);
         if (plane->drmPlane) sym_drmModeFreePlane(plane->drmPlane);
         free(plane->state);
         free(plane);
      }
+
+   eina_thread_queue_free(thq);
+   thq = NULL;
 }

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to