This is an automated email from the git hooks/post-receive script.
git pushed a commit to branch fix-release-build
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.