diff options
author | Jamey Sharp <jamey@minilop.net> | 2006-03-02 23:39:38 -0800 |
---|---|---|
committer | Jamey Sharp <jamey@minilop.net> | 2006-03-02 23:39:38 -0800 |
commit | 622b599c8fcf5d677f76ca03f3241a23dba58712 (patch) | |
tree | c649c9dc5490e7b22e27aaf82f49afeb8e6999c6 /src | |
parent | 87905f0579e749ac6d92843780af246160318eca (diff) |
Tweak to previous API change: Require that spare iovecs fall before vector[0]. Leave vector in well-defined state.
Diffstat (limited to 'src')
-rw-r--r-- | src/c-client.xsl | 18 | ||||
-rw-r--r-- | src/xcb_out.c | 7 |
2 files changed, 13 insertions, 12 deletions
diff --git a/src/c-client.xsl b/src/c-client.xsl index 568e46c..1e37ea9 100644 --- a/src/c-client.xsl +++ b/src/c-client.xsl @@ -596,30 +596,30 @@ authorization from the authors. mode="assign" /> <l /> - <l>xcb_parts[0].iov_base = &xcb_out;</l> - <l>xcb_parts[0].iov_len = sizeof(xcb_out);</l> - <l>xcb_parts[1].iov_base = 0;</l> - <l>xcb_parts[1].iov_len = -xcb_parts[0].iov_len & 3;</l> + <l>xcb_parts[2].iov_base = &xcb_out;</l> + <l>xcb_parts[2].iov_len = sizeof(xcb_out);</l> + <l>xcb_parts[3].iov_base = 0;</l> + <l>xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;</l> <xsl:for-each select="$struct/list"> - <l>xcb_parts[<xsl:value-of select="position() * 2"/>].iov_base = (void *) <!-- + <l>xcb_parts[<xsl:value-of select="2 + position() * 2"/>].iov_base = (void *) <!-- --><xsl:value-of select="@name" />;</l> - <l>xcb_parts[<xsl:value-of select="position() * 2"/>].iov_len = <!-- + <l>xcb_parts[<xsl:value-of select="2 + position() * 2"/>].iov_len = <!-- --><xsl:apply-templates mode="output-expression" /><!-- --><xsl:if test="not(@type = 'void')"> <xsl:text> * sizeof(</xsl:text> <xsl:value-of select="@type" /> <xsl:text>)</xsl:text> </xsl:if>;</l> - <l>xcb_parts[<xsl:value-of select="1 + position() * 2"/>].iov_base = 0;</l> - <l>xcb_parts[<xsl:value-of select="1 + position() * 2"/>].iov_len = -xcb_parts[<xsl:value-of select="position() * 2"/>].iov_len & 3;</l> + <l>xcb_parts[<xsl:value-of select="3 + position() * 2"/>].iov_base = 0;</l> + <l>xcb_parts[<xsl:value-of select="3 + position() * 2"/>].iov_len = -xcb_parts[<xsl:value-of select="2 + position() * 2"/>].iov_len & 3;</l> </xsl:for-each> <l>XCBSendRequest(c, &xcb_ret.sequence, <!-- --><xsl:choose> <xsl:when test="@has-reply">XCB_REQUEST_CHECKED</xsl:when> <xsl:otherwise>0</xsl:otherwise> - </xsl:choose>, xcb_parts, &xcb_req);</l> + </xsl:choose>, xcb_parts + 2, &xcb_req);</l> <l>return xcb_ret;</l> </xsl:template> diff --git a/src/xcb_out.c b/src/xcb_out.c index 78ec8ca..b201565 100644 --- a/src/xcb_out.c +++ b/src/xcb_out.c @@ -126,8 +126,7 @@ int XCBSendRequest(XCBConnection *c, unsigned int *request, int flags, struct io ((CARD16 *) vector[0].iov_base)[1] = shortlen; if(!shortlen) { - memmove(vector + 1, vector, veclen++ * sizeof(*vector)); - ++veclen; + --vector, ++veclen; vector[0].iov_base = prefix; vector[0].iov_len = sizeof(prefix); prefix[0] = ((CARD32 *) vector[0].iov_base)[0]; @@ -237,12 +236,14 @@ int _xcb_out_write_block(XCBConnection *c, struct iovec *vector, size_t count) { memcpy(c->out.queue + c->out.queue_len, vector[0].iov_base, vector[0].iov_len); c->out.queue_len += vector[0].iov_len; + vector[0].iov_base = (char *) vector[0].iov_base + vector[0].iov_len; + vector[0].iov_len = 0; ++vector, --count; } if(!count) return 1; - memmove(vector + 1, vector, count++ * sizeof(struct iovec)); + --vector, ++count; vector[0].iov_base = c->out.queue; vector[0].iov_len = c->out.queue_len; c->out.queue_len = 0; |