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

git pushed a commit to branch overline-textgrid
in repository efl.

View the commit online.

commit ddd08757a282ac98ea98f7519d1a2472f3c2d76c
Author: Cedric BAIL <[email protected]>
AuthorDate: Fri Aug 7 19:16:10 2026 -0600

    evas/drm: give up rather than spin when no framebuffer can be had
    
    _outbuf_fb_assign() ends with
    
        while (!ob->priv.draw)
          {
             ecore_drm2_fb_release(ob->priv.output, EINA_TRUE);
             ob->priv.draw = _outbuf_fb_wait(ob);
          }
    
    which has no way out.  ecore_drm2_fb_release() returns false once it has
    nothing left to reclaim, and nothing else in the loop can make a buffer
    appear, so if _outbuf_fb_create() failed just above it the loop never
    terminates.  It is not a render thread stall either - the compositor
    reaches this on its first frame holding drm master and the input devices,
    so the machine is left with a frozen screen, no keyboard and no vt
    switch.  Losing a frame is the correct outcome here; losing the session
    is not.  Both callers already cope with NULL.
    
    Check the release, and while here let hitting MAX_BUFFERS fall into that
    reclaim loop.  It used to bail out of the function instead - the one case
    where every buffer really is spoken for was the one case that never tried
    to take one back.
    
    Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
---
 src/modules/evas/engines/drm/evas_outbuf.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/src/modules/evas/engines/drm/evas_outbuf.c b/src/modules/evas/engines/drm/evas_outbuf.c
index 055275758f..868f53723b 100644
--- a/src/modules/evas/engines/drm/evas_outbuf.c
+++ b/src/modules/evas/engines/drm/evas_outbuf.c
@@ -98,10 +98,9 @@ _outbuf_fb_assign(Outbuf *ob)
    Eina_List *l;
 
    ob->priv.draw = _outbuf_fb_wait(ob);
-   if (!ob->priv.draw)
+   if ((!ob->priv.draw) &&
+       (eina_list_count(ob->priv.fb_list) < MAX_BUFFERS))
      {
-        EINA_SAFETY_ON_TRUE_RETURN_VAL(eina_list_count(ob->priv.fb_list) >= MAX_BUFFERS, NULL);
-
         if ((ob->rotation == 0) || (ob->rotation == 180))
           {
              fw = ob->w;
@@ -117,9 +116,14 @@ _outbuf_fb_assign(Outbuf *ob)
           ob->priv.fb_list = eina_list_append(ob->priv.fb_list, ob->priv.draw);
      }
 
+   /* Everything we have is busy and we may not allocate more, so take one
+    * back off the output - worst looking first - until one frees up.  Once
+    * ecore_drm2_fb_release() says there is nothing left to reclaim nothing
+    * else here can make a buffer appear either, so give up rather than ask
+    * it the same question forever. */
    while (!ob->priv.draw)
      {
-        ecore_drm2_fb_release(ob->priv.output, EINA_TRUE);
+        if (!ecore_drm2_fb_release(ob->priv.output, EINA_TRUE)) return NULL;
         ob->priv.draw = _outbuf_fb_wait(ob);
      }
 

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

Reply via email to