[PATCH:libX11 1/2] Use C99 named initializers to fill in events passed to XSendEvent

Alan Coopersmith alan.coopersmith at oracle.com
Fri Jul 11 21:22:57 PDT 2014


Forces compiler to zero-fill unset fields in the struct (fixing bug 81236)
and allows optimizer to order field initialization to best fit cache layout
or other considertations.

Before & after output of gcc -S on AMD64 shows insertion of "rep stosq"
instructions to rapidly zero-fill structs.

Signed-off-by: Alan Coopersmith <alan.coopersmith at oracle.com>
---
 src/Iconify.c  |   26 +++++++++++++++-----------
 src/ReconfWM.c |   37 ++++++++++++++++++++-----------------
 src/Withdraw.c |   22 ++++++++++++----------
 3 files changed, 47 insertions(+), 38 deletions(-)

diff --git a/src/Iconify.c b/src/Iconify.c
index 3a969d7..9da4165 100644
--- a/src/Iconify.c
+++ b/src/Iconify.c
@@ -67,19 +67,23 @@ Status XIconifyWindow (
     Window w,
     int screen)
 {
-    XClientMessageEvent ev;
-    Window root = RootWindow (dpy, screen);
     Atom prop;
 
     prop = XInternAtom (dpy, "WM_CHANGE_STATE", False);
-    if (prop == None) return False;
+    if (prop == None)
+        return False;
+    else {
+        XClientMessageEvent ev = {
+            .type = ClientMessage,
+            .window = w,
+            .message_type = prop,
+            .format = 32,
+            .data.l[0] = IconicState
+        };
+        Window root = RootWindow (dpy, screen);
 
-    ev.type = ClientMessage;
-    ev.window = w;
-    ev.message_type = prop;
-    ev.format = 32;
-    ev.data.l[0] = IconicState;
-    return (XSendEvent (dpy, root, False,
-			SubstructureRedirectMask|SubstructureNotifyMask,
-			(XEvent *)&ev));
+        return (XSendEvent (dpy, root, False,
+                            SubstructureRedirectMask|SubstructureNotifyMask,
+                            (XEvent *)&ev));
+    }
 }
diff --git a/src/ReconfWM.c b/src/ReconfWM.c
index 1776f2e..8dc3534 100644
--- a/src/ReconfWM.c
+++ b/src/ReconfWM.c
@@ -41,7 +41,6 @@ Status XReconfigureWMWindow (
     unsigned int mask,
     XWindowChanges *changes)
 {
-    XConfigureRequestEvent ev;
     Window root = RootWindow (dpy, screen);
     _XAsyncHandler async;
     _XAsyncErrorState async_state;
@@ -120,20 +119,24 @@ Status XReconfigureWMWindow (
     /*
      * If the request succeeded, then everything is okay; otherwise, send event
      */
-    if (!async_state.error_count) return True;
-
-    ev.type		= ConfigureRequest;
-    ev.window		= w;
-    ev.parent		= root;
-    ev.value_mask	= (mask & AllMaskBits);
-    ev.x		= changes->x;
-    ev.y		= changes->y;
-    ev.width		= changes->width;
-    ev.height		= changes->height;
-    ev.border_width	= changes->border_width;
-    ev.above		= changes->sibling;
-    ev.detail		= changes->stack_mode;
-    return (XSendEvent (dpy, root, False,
-			SubstructureRedirectMask|SubstructureNotifyMask,
-			(XEvent *)&ev));
+    if (!async_state.error_count)
+        return True;
+    else {
+        XConfigureRequestEvent ev = {
+            .type		= ConfigureRequest,
+            .window		= w,
+            .parent		= root,
+            .value_mask		= (mask & AllMaskBits),
+            .x			= changes->x,
+            .y			= changes->y,
+            .width		= changes->width,
+            .height		= changes->height,
+            .border_width	= changes->border_width,
+            .above		= changes->sibling,
+            .detail		= changes->stack_mode,
+        };
+        return (XSendEvent (dpy, root, False,
+                            SubstructureRedirectMask|SubstructureNotifyMask,
+                            (XEvent *)&ev));
+    }
 }
diff --git a/src/Withdraw.c b/src/Withdraw.c
index ac15ddc..1015f5b 100644
--- a/src/Withdraw.c
+++ b/src/Withdraw.c
@@ -67,16 +67,18 @@ Status XWithdrawWindow (
     Window w,
     int screen)
 {
-    XUnmapEvent ev;
-    Window root = RootWindow (dpy, screen);
-
     XUnmapWindow (dpy, w);
 
-    ev.type = UnmapNotify;
-    ev.event = root;
-    ev.window = w;
-    ev.from_configure = False;
-    return (XSendEvent (dpy, root, False,
-			SubstructureRedirectMask|SubstructureNotifyMask,
-			(XEvent *)&ev));
+    {
+        Window root = RootWindow (dpy, screen);
+        XUnmapEvent ev = {
+            .type = UnmapNotify,
+            .event = root,
+            .window = w,
+            .from_configure = False
+        };
+        return (XSendEvent (dpy, root, False,
+                            SubstructureRedirectMask|SubstructureNotifyMask,
+                            (XEvent *)&ev));
+    }
 }
-- 
1.7.9.2



More information about the xorg-devel mailing list