Tweak to previous API change: Require that spare iovecs fall before vector[0]. Leave vector in well-defined state.

This commit is contained in:
Jamey Sharp 2006-03-02 23:39:38 -08:00
parent 87905f0579
commit 622b599c8f
2 changed files with 13 additions and 12 deletions

View File

@ -596,30 +596,30 @@ authorization from the authors.
mode="assign" /> mode="assign" />
<l /> <l />
<l>xcb_parts[0].iov_base = &amp;xcb_out;</l> <l>xcb_parts[2].iov_base = &amp;xcb_out;</l>
<l>xcb_parts[0].iov_len = sizeof(xcb_out);</l> <l>xcb_parts[2].iov_len = sizeof(xcb_out);</l>
<l>xcb_parts[1].iov_base = 0;</l> <l>xcb_parts[3].iov_base = 0;</l>
<l>xcb_parts[1].iov_len = -xcb_parts[0].iov_len &amp; 3;</l> <l>xcb_parts[3].iov_len = -xcb_parts[2].iov_len &amp; 3;</l>
<xsl:for-each select="$struct/list"> <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> --><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:apply-templates mode="output-expression" /><!--
--><xsl:if test="not(@type = 'void')"> --><xsl:if test="not(@type = 'void')">
<xsl:text> * sizeof(</xsl:text> <xsl:text> * sizeof(</xsl:text>
<xsl:value-of select="@type" /> <xsl:value-of select="@type" />
<xsl:text>)</xsl:text> <xsl:text>)</xsl:text>
</xsl:if>;</l> </xsl:if>;</l>
<l>xcb_parts[<xsl:value-of select="1 + position() * 2"/>].iov_base = 0;</l> <l>xcb_parts[<xsl:value-of select="3 + 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_len = -xcb_parts[<xsl:value-of select="2 + position() * 2"/>].iov_len &amp; 3;</l>
</xsl:for-each> </xsl:for-each>
<l>XCBSendRequest(c, &amp;xcb_ret.sequence, <!-- <l>XCBSendRequest(c, &amp;xcb_ret.sequence, <!--
--><xsl:choose> --><xsl:choose>
<xsl:when test="@has-reply">XCB_REQUEST_CHECKED</xsl:when> <xsl:when test="@has-reply">XCB_REQUEST_CHECKED</xsl:when>
<xsl:otherwise>0</xsl:otherwise> <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> <l>return xcb_ret;</l>
</xsl:template> </xsl:template>

View File

@ -126,8 +126,7 @@ int XCBSendRequest(XCBConnection *c, unsigned int *request, int flags, struct io
((CARD16 *) vector[0].iov_base)[1] = shortlen; ((CARD16 *) vector[0].iov_base)[1] = shortlen;
if(!shortlen) if(!shortlen)
{ {
memmove(vector + 1, vector, veclen++ * sizeof(*vector)); --vector, ++veclen;
++veclen;
vector[0].iov_base = prefix; vector[0].iov_base = prefix;
vector[0].iov_len = sizeof(prefix); vector[0].iov_len = sizeof(prefix);
prefix[0] = ((CARD32 *) vector[0].iov_base)[0]; 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); memcpy(c->out.queue + c->out.queue_len, vector[0].iov_base, vector[0].iov_len);
c->out.queue_len += 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; ++vector, --count;
} }
if(!count) if(!count)
return 1; return 1;
memmove(vector + 1, vector, count++ * sizeof(struct iovec)); --vector, ++count;
vector[0].iov_base = c->out.queue; vector[0].iov_base = c->out.queue;
vector[0].iov_len = c->out.queue_len; vector[0].iov_len = c->out.queue_len;
c->out.queue_len = 0; c->out.queue_len = 0;