summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJamey Sharp <jamey@minilop.net>2006-03-02 23:39:38 -0800
committerJamey Sharp <jamey@minilop.net>2006-03-02 23:39:38 -0800
commit622b599c8fcf5d677f76ca03f3241a23dba58712 (patch)
treec649c9dc5490e7b22e27aaf82f49afeb8e6999c6
parent87905f0579e749ac6d92843780af246160318eca (diff)
Tweak to previous API change: Require that spare iovecs fall before vector[0]. Leave vector in well-defined state.
-rw-r--r--src/c-client.xsl18
-rw-r--r--src/xcb_out.c7
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 = &amp;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 &amp; 3;</l>
+ <l>xcb_parts[2].iov_base = &amp;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 &amp; 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 &amp; 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 &amp; 3;</l>
</xsl:for-each>
<l>XCBSendRequest(c, &amp;xcb_ret.sequence, <!--
--><xsl:choose>
<xsl:when test="@has-reply">XCB_REQUEST_CHECKED</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
- </xsl:choose>, xcb_parts, &amp;xcb_req);</l>
+ </xsl:choose>, xcb_parts + 2, &amp;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;