[Xcb] [PATCH Xlib 1/3] Hoist most of _XConnectXCB into XOpenDisplay, and simplify

Mike Blumenkrantz zmike at samsung.com
Thu Jun 11 11:24:47 PDT 2015


Commit by Josh Triplett and Jamey Sharp.

Signed-off-by: Josh Triplett <josh at joshtriplett.org>
Signed-off-by: Jamey Sharp <jamey at minilop.net>
Signed-off-by: Mike Blumenkrantz <zmike at osg.samsung.com>
---
 src/OpenDis.c  | 44 +++++++++++++++++++++++++++++++++++---------
 src/Xxcbint.h  |  3 +--
 src/xcb_disp.c | 38 +++-----------------------------------
 3 files changed, 39 insertions(+), 46 deletions(-)

diff --git a/src/OpenDis.c b/src/OpenDis.c
index 636860e..8f6d1ef 100644
--- a/src/OpenDis.c
+++ b/src/OpenDis.c
@@ -64,6 +64,7 @@ Display *
 XOpenDisplay (
 	register _Xconst char *display)
 {
+	xcb_connection_t *c;
 	register Display *dpy;		/* New Display object
being created. */ register int i;
 	int j, k;			/* random iterator indexes */
@@ -110,26 +111,42 @@ XOpenDisplay (
 	if (_XIOErrorFunction == NULL) (void) XSetIOErrorHandler
(NULL); 
 /*
+ * Call the Connect routine to get the transport connection object.
+ * If NULL is returned, the connection failed.
+ */
+
+	c = _XConnectXCB(display, &iscreen);
+	if(!c || xcb_connection_has_error(c)) {
+		return NULL;
+	}
+
+/*
  * Attempt to allocate a display structure. Return NULL if allocation
fails. */
-	if ((dpy = Xcalloc(1, sizeof(Display))) == NULL) {
-		return(NULL);
+	if ((dpy = (Display *)Xcalloc(1, sizeof(Display) +
sizeof(_X11XCBPrivate))) == NULL) {
+		xcb_disconnect(c);
+		return NULL ;
 	}
 
+	dpy->fd = xcb_get_file_descriptor(c);
+	dpy->xcb = (_X11XCBPrivate *) (dpy + 1);
+	dpy->xcb->connection = c;
+
 	if ((dpy->display_name = strdup(display_name)) == NULL) {
 		OutOfMemory(dpy);
-		return(NULL);
+		return NULL;
 	}
 
-/*
- * Call the Connect routine to get the transport connection object.
- * If NULL is returned, the connection failed.
- */
+	dpy->xcb->next_xid = xcb_generate_id(dpy->xcb->connection);
 
-	if(!_XConnectXCB(dpy, display, &iscreen)) {
+	dpy->xcb->event_notify = xcondition_malloc();
+	dpy->xcb->reply_notify = xcondition_malloc();
+	if (!dpy->xcb->event_notify || !dpy->xcb->reply_notify) {
 		OutOfMemory(dpy);
 		return NULL;
 	}
+	xcondition_init(dpy->xcb->event_notify);
+	xcondition_init(dpy->xcb->reply_notify);
 
 	/* Initialize as much of the display structure as we can.
 	 * Initialize pointers to NULL so that XFreeDisplayStructure
will @@ -691,7 +708,16 @@ void _XFreeDisplayStructure(Display *dpy)
 
 	Xfree (dpy->filedes);
 
-	_XFreeX11XCBStructure(dpy);
+	/* reply_data was allocated by system malloc, not Xmalloc */
+	free(dpy->xcb->reply_data);
+	while(dpy->xcb->pending_requests)
+	{
+		PendingRequest *tmp = dpy->xcb->pending_requests;
+		dpy->xcb->pending_requests = tmp->next;
+		free(tmp);
+	}
+	xcondition_free(dpy->xcb->event_notify);
+	xcondition_free(dpy->xcb->reply_notify);
 
 	Xfree (dpy);
 }
diff --git a/src/Xxcbint.h b/src/Xxcbint.h
index bf41c23..b4f8988 100644
--- a/src/Xxcbint.h
+++ b/src/Xxcbint.h
@@ -43,8 +43,7 @@ typedef struct _X11XCBPrivate {
 
 /* xcb_disp.c */
 
-int _XConnectXCB(Display *dpy, _Xconst char *display, int *screenp);
-void _XFreeX11XCBStructure(Display *dpy);
+xcb_connection_t *_XConnectXCB(_Xconst char *display, int *screenp);
 
 unsigned long _XNextRequest(Display *dpy);
 
diff --git a/src/xcb_disp.c b/src/xcb_disp.c
index 0fa40de..74f87c0 100644
--- a/src/xcb_disp.c
+++ b/src/xcb_disp.c
@@ -54,20 +54,14 @@ void XSetAuthorization(char *name, int namelen,
char *data, int datalen) _XUnlockMutex(_Xglobal_lock);
 }
 
-int _XConnectXCB(Display *dpy, _Xconst char *display, int *screenp)
+xcb_connection_t *_XConnectXCB(_Xconst char *display, int *screenp)
 {
 	char *host;
 	int n = 0;
 	xcb_connection_t *c;
 
-	dpy->fd = -1;
-
-	dpy->xcb = Xcalloc(1, sizeof(_X11XCBPrivate));
-	if(!dpy->xcb)
-		return 0;
-
 	if(!xcb_parse_display(display, &host, &n, screenp))
-		return 0;
+		return NULL;
 	/* host and n are unused, but xcb_parse_display requires them
*/ free(host);
 
@@ -78,31 +72,5 @@ int _XConnectXCB(Display *dpy, _Xconst char
*display, int *screenp) c = xcb_connect(display, NULL);
 	_XUnlockMutex(_Xglobal_lock);
 
-	dpy->fd = xcb_get_file_descriptor(c);
-
-	dpy->xcb->connection = c;
-	dpy->xcb->next_xid = xcb_generate_id(dpy->xcb->connection);
-
-	dpy->xcb->event_notify = xcondition_malloc();
-	dpy->xcb->reply_notify = xcondition_malloc();
-	if (!dpy->xcb->event_notify || !dpy->xcb->reply_notify)
-		return 0;
-	xcondition_init(dpy->xcb->event_notify);
-	xcondition_init(dpy->xcb->reply_notify);
-	return !xcb_connection_has_error(c);
-}
-
-void _XFreeX11XCBStructure(Display *dpy)
-{
-	/* reply_data was allocated by system malloc, not Xmalloc */
-	free(dpy->xcb->reply_data);
-	while(dpy->xcb->pending_requests)
-	{
-		PendingRequest *tmp = dpy->xcb->pending_requests;
-		dpy->xcb->pending_requests = tmp->next;
-		free(tmp);
-	}
-	xcondition_free(dpy->xcb->event_notify);
-	xcondition_free(dpy->xcb->reply_notify);
-	Xfree(dpy->xcb);
+	return c;
 }
-- 
2.4.2



More information about the Xcb mailing list