[PATCH:xdpyinfo] Use xcb for -queryExt instead of a round-trip per extension

Alan Coopersmith alan.coopersmith at oracle.com
Sun Oct 3 11:57:13 PDT 2010


On a system with 30 extensions listed by xdpyinfo, truss -c
reports this saves quite a few system calls by batching the
QueryExtension requests instead of a round-trip for each one:

	       	       Xlib	xcb
writev		        40	 11
poll			80	 22
recv		       117	 29
total (*)	       464	296

(*) total includes all system calls, including many not shown since
their count did not change significantly.   There was one additional
set of open/mmap/close/etc. for loading the added libX11-xcb library.

Signed-off-by: Alan Coopersmith <alan.coopersmith at oracle.com>
---

This was also written with the intent of serving as an example of
incremental migration from Xlib to xcb, so please suggest if there's
anything that should be improved for people who may model their own
code on it.

 configure.ac |    2 +-
 xdpyinfo.c   |   41 +++++++++++++++++++++++++++++------------
 2 files changed, 30 insertions(+), 13 deletions(-)

diff --git a/configure.ac b/configure.ac
index 48ae434..47a1246 100644
--- a/configure.ac
+++ b/configure.ac
@@ -36,7 +36,7 @@ XORG_DEFAULT_OPTIONS
 AM_CONFIG_HEADER(config.h)
 
 # Checks for pkg-config packages
-PKG_CHECK_MODULES(XDPYINFO, xext x11 xtst)
+PKG_CHECK_MODULES(XDPYINFO, xext x11 xtst x11-xcb xcb)
 
 # This is used below to allow <X11/Xlib.h> to be found
 PKG_CHECK_MODULES(DPY_X11, x11)
diff --git a/xdpyinfo.c b/xdpyinfo.c
index db4a438..bd0b0f6 100644
--- a/xdpyinfo.c
+++ b/xdpyinfo.c
@@ -82,6 +82,7 @@ in this Software without prior written authorization from The Open Group.
 
 #endif
 
+#include <X11/Xlib-xcb.h>
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
 #ifdef MULTIBUFFER
@@ -170,22 +171,38 @@ print_extension_info(Display *dpy)
     printf ("number of extensions:    %d\n", n);
 
     if (extlist) {
-	register int i;
-	int opcode, event, error;
+	int i;
 
 	qsort(extlist, n, sizeof(char *), StrCmp);
-	for (i = 0; i < n; i++) {
-	    if (!queryExtensions) {
+
+	if (!queryExtensions) {
+	    for (i = 0; i < n; i++) {
 		printf ("    %s\n", extlist[i]);
-		continue;
 	    }
-	    XQueryExtension(dpy, extlist[i], &opcode, &event, &error);
-	    printf ("    %s  (opcode: %d", extlist[i], opcode);
-	    if (event)
-		printf (", base event: %d", event);
-	    if (error)
-		printf (", base error: %d", error);
-	    printf(")\n");
+	} else {
+	    xcb_connection_t *xcb_conn = XGetXCBConnection (dpy);
+	    xcb_query_extension_cookie_t qe_cookies[n];
+
+	    for (i = 0; i < n; i++) {
+		qe_cookies[i] = xcb_query_extension (xcb_conn,
+						     strlen(extlist[i]),
+						     extlist[i]);
+	    }
+	    xcb_flush (xcb_conn);
+
+	    for (i = 0; i < n; i++) {
+		xcb_query_extension_reply_t *rep
+		    = xcb_query_extension_reply(xcb_conn, qe_cookies[i], NULL);
+
+		printf ("    %s  (opcode: %d", extlist[i], rep->major_opcode);
+		if (rep->first_event)
+		    printf (", base event: %d", rep->first_event);
+		if (rep->first_error)
+		    printf (", base error: %d", rep->first_error);
+		printf(")\n");
+
+		free(rep);
+	    }
 	}
 	/* do not free, Xlib can depend on contents being unaltered */
 	/* XFreeExtensionList (extlist); */
-- 
1.5.6.5



More information about the xorg-devel mailing list