projects
/
free-sw
/
xcb
/
libxcb
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Make xcb_conn.c agree that XCBSetupReq is now XCBSetupRequest.
[free-sw/xcb/libxcb]
/
src
/
xcb_conn.c
diff --git
a/src/xcb_conn.c
b/src/xcb_conn.c
index
be80bac
..
c00eccf
100644
(file)
--- a/
src/xcb_conn.c
+++ b/
src/xcb_conn.c
@@
-44,6
+44,8
@@
typedef struct {
CARD16 length;
} XCBSetupGeneric;
CARD16 length;
} XCBSetupGeneric;
+static const int error_connection = 1;
+
static int set_fd_flags(const int fd)
{
long flags = fcntl(fd, F_GETFL, 0);
static int set_fd_flags(const int fd)
{
long flags = fcntl(fd, F_GETFL, 0);
@@
-60,7
+62,7
@@
static int set_fd_flags(const int fd)
static int write_setup(XCBConnection *c, XCBAuthInfo *auth_info)
{
static const char pad[3];
static int write_setup(XCBConnection *c, XCBAuthInfo *auth_info)
{
static const char pad[3];
- XCBSetupReq out;
+ XCBSetupReq
uest
out;
struct iovec parts[6];
int count = 0;
int endian = 0x01020304;
struct iovec parts[6];
int count = 0;
int endian = 0x01020304;
@@
-77,9
+79,9
@@
static int write_setup(XCBConnection *c, XCBAuthInfo *auth_info)
out.protocol_minor_version = X_PROTOCOL_REVISION;
out.authorization_protocol_name_len = 0;
out.authorization_protocol_data_len = 0;
out.protocol_minor_version = X_PROTOCOL_REVISION;
out.authorization_protocol_name_len = 0;
out.authorization_protocol_data_len = 0;
- parts[count].iov_len = sizeof(XCBSetupReq);
+ parts[count].iov_len = sizeof(XCBSetupReq
uest
);
parts[count++].iov_base = &out;
parts[count++].iov_base = &out;
- parts[count].iov_len = XCB_PAD(sizeof(XCBSetupReq));
+ parts[count].iov_len = XCB_PAD(sizeof(XCBSetupReq
uest
));
parts[count++].iov_base = (char *) pad;
if(auth_info)
parts[count++].iov_base = (char *) pad;
if(auth_info)
@@
-154,7
+156,10
@@
static int write_vec(XCBConnection *c, struct iovec **vector, int *count)
if(n < 0 && errno == EAGAIN)
return 1;
if(n <= 0)
if(n < 0 && errno == EAGAIN)
return 1;
if(n <= 0)
+ {
+ _xcb_conn_shutdown(c);
return 0;
return 0;
+ }
for(; *count; --*count, ++*vector)
{
for(; *count; --*count, ++*vector)
{
@@
-177,23
+182,33
@@
static int write_vec(XCBConnection *c, struct iovec **vector, int *count)
const XCBSetup *XCBGetSetup(XCBConnection *c)
{
const XCBSetup *XCBGetSetup(XCBConnection *c)
{
+ if(c->has_error)
+ return 0;
/* doesn't need locking because it's never written to. */
return c->setup;
}
int XCBGetFileDescriptor(XCBConnection *c)
{
/* doesn't need locking because it's never written to. */
return c->setup;
}
int XCBGetFileDescriptor(XCBConnection *c)
{
+ if(c->has_error)
+ return -1;
/* doesn't need locking because it's never written to. */
return c->fd;
}
/* doesn't need locking because it's never written to. */
return c->fd;
}
+int XCBConnectionHasError(XCBConnection *c)
+{
+ /* doesn't need locking because it's read and written atomically. */
+ return c->has_error;
+}
+
XCBConnection *XCBConnectToFD(int fd, XCBAuthInfo *auth_info)
{
XCBConnection* c;
c = calloc(1, sizeof(XCBConnection));
if(!c)
XCBConnection *XCBConnectToFD(int fd, XCBAuthInfo *auth_info)
{
XCBConnection* c;
c = calloc(1, sizeof(XCBConnection));
if(!c)
- return
0
;
+ return
(XCBConnection *) &error_connection
;
c->fd = fd;
c->fd = fd;
@@
-209,7
+224,7
@@
XCBConnection *XCBConnectToFD(int fd, XCBAuthInfo *auth_info)
))
{
XCBDisconnect(c);
))
{
XCBDisconnect(c);
- return
0
;
+ return
(XCBConnection *) &error_connection
;
}
return c;
}
return c;
@@
-217,7
+232,7
@@
XCBConnection *XCBConnectToFD(int fd, XCBAuthInfo *auth_info)
void XCBDisconnect(XCBConnection *c)
{
void XCBDisconnect(XCBConnection *c)
{
- if(
!c
)
+ if(
c->has_error
)
return;
free(c->setup);
return;
free(c->setup);
@@
-235,6
+250,11
@@
void XCBDisconnect(XCBConnection *c)
/* Private interface */
/* Private interface */
+void _xcb_conn_shutdown(XCBConnection *c)
+{
+ c->has_error = 1;
+}
+
int _xcb_conn_wait(XCBConnection *c, pthread_cond_t *cond, struct iovec **vector, int *count)
{
int ret;
int _xcb_conn_wait(XCBConnection *c, pthread_cond_t *cond, struct iovec **vector, int *count)
{
int ret;
@@
-263,7
+283,10
@@
int _xcb_conn_wait(XCBConnection *c, pthread_cond_t *cond, struct iovec **vector
ret = select(c->fd + 1, &rfds, &wfds, 0, 0);
} while (ret == -1 && errno == EINTR);
if (ret < 0)
ret = select(c->fd + 1, &rfds, &wfds, 0, 0);
} while (ret == -1 && errno == EINTR);
if (ret < 0)
+ {
+ _xcb_conn_shutdown(c);
ret = 0;
ret = 0;
+ }
pthread_mutex_lock(&c->iolock);
if(ret)
pthread_mutex_lock(&c->iolock);
if(ret)