[Xcb-commit] libxcb: src

Uli Schlachter psychon at kemper.freedesktop.org
Wed Feb 19 22:02:50 CET 2014


 src/xcb_conn.c |    3 +++
 src/xcbint.h   |    1 +
 2 files changed, 4 insertions(+)

New commits:
commit 4ffa6f83b92763eb901c7ddb7c20775e24d507ca
Author: Ran Benita <ran234 at gmail.com>
Date:   Sat Jan 18 17:10:53 2014 +0200

    Add comments about how _xcb_conn_ret_error() works
    
    If xcb_connect() fails, it doesn't return NULL. Instead, it always
    returns an xcb_connection_t*, and the user should check for errors with
    the xcb_connection_has_error() function. What this function does is
    check if conn->has_error contains a non-zero error code, and returns it.
    
    If an error did occur, xcb doesn't actually return a full
    xcb_connection_t though, it just returns (xcb_connection_t *)
    error_code. Since the 'has_error' field is the first, it is still
    possible to check conn->has_error.
    
    That last trick was not immediately obvious to me, so add some guiding
    comments. This also ensures no one obliviously rearranges the struct.
    
    Signed-off-by: Ran Benita <ran234 at gmail.com>
    Signed-off-by: Uli Schlachter <psychon at znc.in>

diff --git a/src/xcb_conn.c b/src/xcb_conn.c
index 46390e1..00c458f 100644
--- a/src/xcb_conn.c
+++ b/src/xcb_conn.c
@@ -374,6 +374,9 @@ void _xcb_conn_shutdown(xcb_connection_t *c, int err)
 /* Return connection error state.
  * To make thread-safe, I need a seperate static
  * variable for every possible error.
+ * has_error is the first field in xcb_connection_t, so just
+ * return a casted int here; checking has_error (and only
+ * has_error) will be safe.
  */
 xcb_connection_t *_xcb_conn_ret_error(int err)
 {
diff --git a/src/xcbint.h b/src/xcbint.h
index b25f03b..67cf571 100644
--- a/src/xcbint.h
+++ b/src/xcbint.h
@@ -192,6 +192,7 @@ void _xcb_ext_destroy(xcb_connection_t *c);
 /* xcb_conn.c */
 
 struct xcb_connection_t {
+    /* This must be the first field; see _xcb_conn_ret_error(). */
     int has_error;
 
     /* constant data */


More information about the xcb-commit mailing list