Add XCBRequestCheck function needed for Plan 7.

This commit is contained in:
Josh Triplett 2006-07-30 14:41:19 -07:00
parent b3a2f83f1e
commit 685d8c76c2
2 changed files with 36 additions and 0 deletions

View File

@ -272,6 +272,24 @@ XCBGenericEvent *XCBWaitForEvent(XCBConnection *c);
*/ */
XCBGenericEvent *XCBPollForEvent(XCBConnection *c, int *error); XCBGenericEvent *XCBPollForEvent(XCBConnection *c, int *error);
/**
* @brief Return the error for a request, or NULL if none can ever arrive.
* @param c: The connection to the X server.
* @param cookie: The request cookie.
* @return The error for the request, or NULL if none can ever arrive.
*
* The XCBVoidCookie cookie supplied to this function must have resulted from
* a call to XCB[RequestName]Checked(). This function will block until one of
* two conditions happens. If an error is received, it will be returned. If
* a reply to a subsequent request has already arrived, no error can arrive
* for this request, so this function will return NULL.
*
* Note that this function will perform a sync if needed to ensure that the
* sequence number will advance beyond that provided in cookie; this is a
* convenience to avoid races in determining whether the sync is needed.
*/
XCBGenericError *XCBRequestCheck(XCBConnection *c, XCBVoidCookie cookie);
/** /**
* @brief Returns the last sequence number that the server is known to * @brief Returns the last sequence number that the server is known to
* have processed. * have processed.

View File

@ -402,6 +402,24 @@ XCBGenericEvent *XCBPollForEvent(XCBConnection *c, int *error)
return ret; return ret;
} }
XCBGenericError *XCBRequestCheck(XCBConnection *c, XCBVoidCookie cookie)
{
/* FIXME: this could hold the lock to avoid syncing unnecessarily, but
* that would require factoring the locking out of XCBGetInputFocus,
* XCBGetInputFocusReply, and XCBWaitForReply. */
XCBGenericError *ret;
void *reply;
if(XCB_SEQUENCE_COMPARE(cookie.request,>,c->in.request_expected)
&& XCB_SEQUENCE_COMPARE(cookie.request,>,c->in.request_completed))
{
free(XCBGetInputFocusReply(c, XCBGetInputFocus(c), &ret));
assert(!ret);
}
reply = XCBWaitForReply(c, cookie.request, &ret);
assert(!reply);
return ret;
}
unsigned int XCBGetRequestRead(XCBConnection *c) unsigned int XCBGetRequestRead(XCBConnection *c)
{ {
unsigned int ret; unsigned int ret;