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@gmail.com> Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
parent
d7eb0bdf3b
commit
4ffa6f83b9
|
@ -374,6 +374,9 @@ void _xcb_conn_shutdown(xcb_connection_t *c, int err)
|
||||||
/* Return connection error state.
|
/* Return connection error state.
|
||||||
* To make thread-safe, I need a seperate static
|
* To make thread-safe, I need a seperate static
|
||||||
* variable for every possible error.
|
* 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)
|
xcb_connection_t *_xcb_conn_ret_error(int err)
|
||||||
{
|
{
|
||||||
|
|
|
@ -192,6 +192,7 @@ void _xcb_ext_destroy(xcb_connection_t *c);
|
||||||
/* xcb_conn.c */
|
/* xcb_conn.c */
|
||||||
|
|
||||||
struct xcb_connection_t {
|
struct xcb_connection_t {
|
||||||
|
/* This must be the first field; see _xcb_conn_ret_error(). */
|
||||||
int has_error;
|
int has_error;
|
||||||
|
|
||||||
/* constant data */
|
/* constant data */
|
||||||
|
|
Loading…
Reference in New Issue