Tweak to previous API change: Require that spare iovecs fall before vector[0]. Leave vector in well-defined state.
This commit is contained in:
parent
87905f0579
commit
622b599c8f
|
@ -596,30 +596,30 @@ authorization from the authors.
|
||||||
mode="assign" />
|
mode="assign" />
|
||||||
|
|
||||||
<l />
|
<l />
|
||||||
<l>xcb_parts[0].iov_base = &xcb_out;</l>
|
<l>xcb_parts[2].iov_base = &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 & 3;</l>
|
<l>xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 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 & 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 & 3;</l>
|
||||||
</xsl:for-each>
|
</xsl:for-each>
|
||||||
|
|
||||||
<l>XCBSendRequest(c, &xcb_ret.sequence, <!--
|
<l>XCBSendRequest(c, &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, &xcb_req);</l>
|
</xsl:choose>, xcb_parts + 2, &xcb_req);</l>
|
||||||
<l>return xcb_ret;</l>
|
<l>return xcb_ret;</l>
|
||||||
</xsl:template>
|
</xsl:template>
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue