[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 7/7] ios: Utilize buffer writes.
From: |
Eric Blake |
Subject: |
[PATCH 7/7] ios: Utilize buffer writes. |
Date: |
Sat, 29 Feb 2020 05:12:25 -0600 |
This was a bit more straightforward than adjusting reads.
* src/ios.c (IOS_PUT_C_ERR_CHCK): Add parameter.
(ios_write_int_fast, ios_write_int_common): Consolidate writes.
---
ChangeLog | 6 ++
src/ios.c | 226 +++++++++++++++++++++++-------------------------------
2 files changed, 103 insertions(+), 129 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index c54d4e0d..7da4513e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2020-02-29 Eric Blake <address@hidden>
+
+ ios: Utilize buffer writes.
+ * src/ios.c (IOS_PUT_C_ERR_CHCK): Add parameter.
+ (ios_write_int_fast, ios_write_int_common): Consolidate writes.
+
2020-02-28 Eric Blake <address@hidden>
ios: Utilize buffer reads.
diff --git a/src/ios.c b/src/ios.c
index e9cf17ef..5de29c0f 100644
--- a/src/ios.c
+++ b/src/ios.c
@@ -41,10 +41,9 @@
(c) = ch; \
}
-#define IOS_PUT_C_ERR_CHCK(c, io, off) \
+#define IOS_PUT_C_ERR_CHCK(c, io, len, off) \
{ \
- uint8_t ch = (c); \
- if (io->dev_if->pwrite ((io)->dev, &ch, 1, off) \
+ if (io->dev_if->pwrite ((io)->dev, c, len, off) \
== IOD_EOF) \
return IOS_EIOBJ; \
}
@@ -939,150 +938,155 @@ ios_write_int_fast (ios io, ios_off offset, int flags,
enum ios_endian endian,
uint64_t value)
{
- offset /= 8;
+ uint8_t c[8];
+
switch (bits)
{
case 8:
- IOS_PUT_C_ERR_CHCK(value, io, offset);
- return IOS_OK;
+ c[0] = value;
+ break;
case 16:
if (endian == IOS_ENDIAN_LSB)
{
- IOS_PUT_C_ERR_CHCK(value, io, offset);
- IOS_PUT_C_ERR_CHCK(value >> 8, io, offset + 1);
+ c[0] = value;
+ c[1] = value >> 8;
}
else
{
- IOS_PUT_C_ERR_CHCK(value >> 8, io, offset);
- IOS_PUT_C_ERR_CHCK(value, io, offset + 1);
+ c[0] = value >> 8;
+ c[1] = value;
}
- return IOS_OK;
+ break;
case 24:
if (endian == IOS_ENDIAN_LSB)
{
- IOS_PUT_C_ERR_CHCK(value, io, offset);
- IOS_PUT_C_ERR_CHCK(value >> 8, io, offset + 1);
- IOS_PUT_C_ERR_CHCK(value >> 16, io, offset + 2);
+ c[0] = value;
+ c[1] = value >> 8;
+ c[2] = value >> 16;
}
else
{
- IOS_PUT_C_ERR_CHCK(value >> 16, io, offset);
- IOS_PUT_C_ERR_CHCK(value >> 8, io, offset + 1);
- IOS_PUT_C_ERR_CHCK(value, io, offset + 2);
+ c[0] = value >> 16;
+ c[1] = value >> 8;
+ c[2] = value;
}
- return IOS_OK;
+ break;
case 32:
if (endian == IOS_ENDIAN_LSB)
{
- IOS_PUT_C_ERR_CHCK(value, io, offset);
- IOS_PUT_C_ERR_CHCK(value >> 8, io, offset + 1);
- IOS_PUT_C_ERR_CHCK(value >> 16, io, offset + 2);
- IOS_PUT_C_ERR_CHCK(value >> 24, io, offset + 3);
+ c[0] = value;
+ c[1] = value >> 8;
+ c[2] = value >> 16;
+ c[3] = value >> 24;
}
else
{
- IOS_PUT_C_ERR_CHCK(value >> 24, io, offset);
- IOS_PUT_C_ERR_CHCK(value >> 16, io, offset + 1);
- IOS_PUT_C_ERR_CHCK(value >> 8, io, offset + 2);
- IOS_PUT_C_ERR_CHCK(value, io, offset + 3);
+ c[0] = value >> 24;
+ c[1] = value >> 16;
+ c[2] = value >> 8;
+ c[3] = value;
}
- return IOS_OK;
+ break;
case 40:
if (endian == IOS_ENDIAN_LSB)
{
- IOS_PUT_C_ERR_CHCK(value, io, offset);
- IOS_PUT_C_ERR_CHCK(value >> 8, io, offset + 1);
- IOS_PUT_C_ERR_CHCK(value >> 16, io, offset + 2);
- IOS_PUT_C_ERR_CHCK(value >> 24, io, offset + 3);
- IOS_PUT_C_ERR_CHCK(value >> 32, io, offset + 4);
+ c[0] = value;
+ c[1] = value >> 8;
+ c[2] = value >> 16;
+ c[3] = value >> 24;
+ c[4] = value >> 32;
}
else
{
- IOS_PUT_C_ERR_CHCK(value >> 32, io, offset);
- IOS_PUT_C_ERR_CHCK(value >> 24, io, offset + 1);
- IOS_PUT_C_ERR_CHCK(value >> 16, io, offset + 2);
- IOS_PUT_C_ERR_CHCK(value >> 8, io, offset + 3);
- IOS_PUT_C_ERR_CHCK(value, io, offset + 4);
+ c[0] = value >> 32;
+ c[1] = value >> 24;
+ c[2] = value >> 16;
+ c[3] = value >> 8;
+ c[4] = value;
}
- return IOS_OK;
+ break;
case 48:
if (endian == IOS_ENDIAN_LSB)
{
- IOS_PUT_C_ERR_CHCK(value, io, offset);
- IOS_PUT_C_ERR_CHCK(value >> 8, io, offset + 1);
- IOS_PUT_C_ERR_CHCK(value >> 16, io, offset + 2);
- IOS_PUT_C_ERR_CHCK(value >> 24, io, offset + 3);
- IOS_PUT_C_ERR_CHCK(value >> 32, io, offset + 4);
- IOS_PUT_C_ERR_CHCK(value >> 40, io, offset + 5);
+ c[0] = value;
+ c[1] = value >> 8;
+ c[2] = value >> 16;
+ c[3] = value >> 24;
+ c[4] = value >> 32;
+ c[5] = value >> 40;
}
else
{
- IOS_PUT_C_ERR_CHCK(value >> 40, io, offset);
- IOS_PUT_C_ERR_CHCK(value >> 32, io, offset + 1);
- IOS_PUT_C_ERR_CHCK(value >> 24, io, offset + 2);
- IOS_PUT_C_ERR_CHCK(value >> 16, io, offset + 3);
- IOS_PUT_C_ERR_CHCK(value >> 8, io, offset + 4);
- IOS_PUT_C_ERR_CHCK(value, io, offset + 5);
+ c[0] = value >> 40;
+ c[1] = value >> 32;
+ c[2] = value >> 24;
+ c[3] = value >> 16;
+ c[4] = value >> 8;
+ c[5] = value;
}
- return IOS_OK;
+ break;
case 56:
if (endian == IOS_ENDIAN_LSB)
{
- IOS_PUT_C_ERR_CHCK(value, io, offset);
- IOS_PUT_C_ERR_CHCK(value >> 8, io, offset + 1);
- IOS_PUT_C_ERR_CHCK(value >> 16, io, offset + 2);
- IOS_PUT_C_ERR_CHCK(value >> 24, io, offset + 3);
- IOS_PUT_C_ERR_CHCK(value >> 32, io, offset + 4);
- IOS_PUT_C_ERR_CHCK(value >> 40, io, offset + 5);
- IOS_PUT_C_ERR_CHCK(value >> 48, io, offset + 6);
+ c[0] = value;
+ c[1] = value >> 8;
+ c[2] = value >> 16;
+ c[3] = value >> 24;
+ c[4] = value >> 32;
+ c[5] = value >> 40;
+ c[6] = value >> 48;
}
else
{
- IOS_PUT_C_ERR_CHCK(value >> 48, io, offset);
- IOS_PUT_C_ERR_CHCK(value >> 40, io, offset + 1);
- IOS_PUT_C_ERR_CHCK(value >> 32, io, offset + 2);
- IOS_PUT_C_ERR_CHCK(value >> 24, io, offset + 3);
- IOS_PUT_C_ERR_CHCK(value >> 16, io, offset + 4);
- IOS_PUT_C_ERR_CHCK(value >> 8, io, offset + 5);
- IOS_PUT_C_ERR_CHCK(value, io, offset + 6);
+ c[0] = value >> 48;
+ c[1] = value >> 40;
+ c[2] = value >> 32;
+ c[3] = value >> 24;
+ c[4] = value >> 16;
+ c[5] = value >> 8;
+ c[6] = value;
}
- return IOS_OK;
+ break;
case 64:
if (endian == IOS_ENDIAN_LSB)
{
- IOS_PUT_C_ERR_CHCK(value, io, offset);
- IOS_PUT_C_ERR_CHCK(value >> 8, io, offset + 1);
- IOS_PUT_C_ERR_CHCK(value >> 16, io, offset + 2);
- IOS_PUT_C_ERR_CHCK(value >> 24, io, offset + 3);
- IOS_PUT_C_ERR_CHCK(value >> 32, io, offset + 4);
- IOS_PUT_C_ERR_CHCK(value >> 40, io, offset + 5);
- IOS_PUT_C_ERR_CHCK(value >> 48, io, offset + 6);
- IOS_PUT_C_ERR_CHCK(value >> 56, io, offset + 7);
+ c[0] = value;
+ c[1] = value >> 8;
+ c[2] = value >> 16;
+ c[3] = value >> 24;
+ c[4] = value >> 32;
+ c[5] = value >> 40;
+ c[6] = value >> 48;
+ c[7] = value >> 56;
}
else
{
- IOS_PUT_C_ERR_CHCK(value >> 56, io, offset);
- IOS_PUT_C_ERR_CHCK(value >> 48, io, offset + 1);
- IOS_PUT_C_ERR_CHCK(value >> 40, io, offset + 2);
- IOS_PUT_C_ERR_CHCK(value >> 32, io, offset + 3);
- IOS_PUT_C_ERR_CHCK(value >> 24, io, offset + 4);
- IOS_PUT_C_ERR_CHCK(value >> 16, io, offset + 5);
- IOS_PUT_C_ERR_CHCK(value >> 8, io, offset + 6);
- IOS_PUT_C_ERR_CHCK(value, io, offset + 7);
+ c[0] = value >> 56;
+ c[1] = value >> 48;
+ c[2] = value >> 40;
+ c[3] = value >> 32;
+ c[4] = value >> 24;
+ c[5] = value >> 16;
+ c[6] = value >> 8;
+ c[7] = value;
}
- return IOS_OK;
+ break;
default:
assert (0);
break;
}
+
+ if (io->dev_if->pwrite ((io)->dev, c, bits / 8, offset / 8) == IOD_EOF)
+ return IOS_EIOBJ;
+ return IOS_OK;
}
static inline int
@@ -1092,7 +1096,7 @@ ios_write_int_common (ios io, ios_off offset, int flags,
uint64_t value)
{
/* 64 bits might span at most 9 bytes. */
- uint64_t c[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
+ uint8_t c[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
/* Number of signifcant bits in the first byte. */
int firstbyte_bits = 8 - (offset % 8);
@@ -1117,7 +1121,7 @@ ios_write_int_common (ios io, ios_off offset, int flags,
/* Write the byte back without changing the surrounding bits. */
c[0] = head | tail | (value << (8 - lastbyte_bits));
- IOS_PUT_C_ERR_CHCK(c[0], io, offset / 8);
+ IOS_PUT_C_ERR_CHCK(c, io, 1, offset / 8);
return IOS_OK;
}
@@ -1139,8 +1143,7 @@ ios_write_int_common (ios io, ios_off offset, int flags,
}
c[0] |= value >> lastbyte_bits;
c[1] |= (value << (8 - lastbyte_bits)) & 0xff;
- IOS_PUT_C_ERR_CHCK(c[0], io, offset / 8);
- IOS_PUT_C_ERR_CHCK(c[1], io, offset / 8 + 1);
+ IOS_PUT_C_ERR_CHCK(c, io, 2, offset / 8);
return IOS_OK;
case 2:
@@ -1167,9 +1170,7 @@ ios_write_int_common (ios io, ios_off offset, int flags,
c[0] |= value >> (8 + lastbyte_bits);
c[1] = (value >> lastbyte_bits) & 0xff;
c[2] |= (value << (8 - lastbyte_bits)) & 0xff;
- IOS_PUT_C_ERR_CHCK(c[0], io, offset / 8);
- IOS_PUT_C_ERR_CHCK(c[1], io, offset / 8 + 1);
- IOS_PUT_C_ERR_CHCK(c[2], io, offset / 8 + 2);
+ IOS_PUT_C_ERR_CHCK(c, io, 3, offset / 8);
return IOS_OK;
case 3:
@@ -1199,10 +1200,7 @@ ios_write_int_common (ios io, ios_off offset, int flags,
c[1] = (value >> (8 + lastbyte_bits)) & 0xff;
c[2] = (value >> lastbyte_bits) & 0xff;
c[3] |= (value << (8 - lastbyte_bits)) & 0xff;
- IOS_PUT_C_ERR_CHCK(c[0], io, offset / 8);
- IOS_PUT_C_ERR_CHCK(c[1], io, offset / 8 + 1);
- IOS_PUT_C_ERR_CHCK(c[2], io, offset / 8 + 2);
- IOS_PUT_C_ERR_CHCK(c[3], io, offset / 8 + 3);
+ IOS_PUT_C_ERR_CHCK(c, io, 4, offset / 8);
return IOS_OK;
case 4:
@@ -1235,11 +1233,7 @@ ios_write_int_common (ios io, ios_off offset, int flags,
c[2] = (value >> (8 + lastbyte_bits)) & 0xff;
c[3] = (value >> lastbyte_bits) & 0xff;
c[4] |= (value << (8 - lastbyte_bits)) & 0xff;
- IOS_PUT_C_ERR_CHCK(c[0], io, offset / 8);
- IOS_PUT_C_ERR_CHCK(c[1], io, offset / 8 + 1);
- IOS_PUT_C_ERR_CHCK(c[2], io, offset / 8 + 2);
- IOS_PUT_C_ERR_CHCK(c[3], io, offset / 8 + 3);
- IOS_PUT_C_ERR_CHCK(c[4], io, offset / 8 + 4);
+ IOS_PUT_C_ERR_CHCK(c, io, 5, offset / 8);
return IOS_OK;
case 5:
@@ -1275,12 +1269,7 @@ ios_write_int_common (ios io, ios_off offset, int flags,
c[3] = (value >> (8 + lastbyte_bits)) & 0xff;
c[4] = (value >> lastbyte_bits) & 0xff;
c[5] |= (value << (8 - lastbyte_bits)) & 0xff;
- IOS_PUT_C_ERR_CHCK(c[0], io, offset / 8);
- IOS_PUT_C_ERR_CHCK(c[1], io, offset / 8 + 1);
- IOS_PUT_C_ERR_CHCK(c[2], io, offset / 8 + 2);
- IOS_PUT_C_ERR_CHCK(c[3], io, offset / 8 + 3);
- IOS_PUT_C_ERR_CHCK(c[4], io, offset / 8 + 4);
- IOS_PUT_C_ERR_CHCK(c[5], io, offset / 8 + 5);
+ IOS_PUT_C_ERR_CHCK(c, io, 6, offset / 8);
return IOS_OK;
case 6:
@@ -1319,13 +1308,7 @@ ios_write_int_common (ios io, ios_off offset, int flags,
c[4] = (value >> (8 + lastbyte_bits)) & 0xff;
c[5] = (value >> lastbyte_bits) & 0xff;
c[6] |= (value << (8 - lastbyte_bits)) & 0xff;
- IOS_PUT_C_ERR_CHCK(c[0], io, offset / 8);
- IOS_PUT_C_ERR_CHCK(c[1], io, offset / 8 + 1);
- IOS_PUT_C_ERR_CHCK(c[2], io, offset / 8 + 2);
- IOS_PUT_C_ERR_CHCK(c[3], io, offset / 8 + 3);
- IOS_PUT_C_ERR_CHCK(c[4], io, offset / 8 + 4);
- IOS_PUT_C_ERR_CHCK(c[5], io, offset / 8 + 5);
- IOS_PUT_C_ERR_CHCK(c[6], io, offset / 8 + 6);
+ IOS_PUT_C_ERR_CHCK(c, io, 7, offset / 8);
return IOS_OK;
case 7:
@@ -1367,14 +1350,7 @@ ios_write_int_common (ios io, ios_off offset, int flags,
c[5] = (value >> (8 + lastbyte_bits)) & 0xff;
c[6] = (value >> lastbyte_bits) & 0xff;
c[7] |= (value << (8 - lastbyte_bits)) & 0xff;
- IOS_PUT_C_ERR_CHCK(c[0], io, offset / 8);
- IOS_PUT_C_ERR_CHCK(c[1], io, offset / 8 + 1);
- IOS_PUT_C_ERR_CHCK(c[2], io, offset / 8 + 2);
- IOS_PUT_C_ERR_CHCK(c[3], io, offset / 8 + 3);
- IOS_PUT_C_ERR_CHCK(c[4], io, offset / 8 + 4);
- IOS_PUT_C_ERR_CHCK(c[5], io, offset / 8 + 5);
- IOS_PUT_C_ERR_CHCK(c[6], io, offset / 8 + 6);
- IOS_PUT_C_ERR_CHCK(c[7], io, offset / 8 + 7);
+ IOS_PUT_C_ERR_CHCK(c, io, 8, offset / 8);
return IOS_OK;
case 8:
@@ -1408,15 +1384,7 @@ ios_write_int_common (ios io, ios_off offset, int flags,
c[6] = (value >> (8 + lastbyte_bits)) & 0xff;
c[7] = (value >> lastbyte_bits) & 0xff;
c[8] |= (value << (8 - lastbyte_bits)) & 0xff;
- IOS_PUT_C_ERR_CHCK(c[0], io, offset / 8);
- IOS_PUT_C_ERR_CHCK(c[1], io, offset / 8 + 1);
- IOS_PUT_C_ERR_CHCK(c[2], io, offset / 8 + 2);
- IOS_PUT_C_ERR_CHCK(c[3], io, offset / 8 + 3);
- IOS_PUT_C_ERR_CHCK(c[4], io, offset / 8 + 4);
- IOS_PUT_C_ERR_CHCK(c[5], io, offset / 8 + 5);
- IOS_PUT_C_ERR_CHCK(c[6], io, offset / 8 + 6);
- IOS_PUT_C_ERR_CHCK(c[7], io, offset / 8 + 7);
- IOS_PUT_C_ERR_CHCK(c[8], io, offset / 8 + 8);
+ IOS_PUT_C_ERR_CHCK(c, io, 9, offset / 8);
return IOS_OK;
default:
--
2.25.1
- [PATCH 0/7] More efficient I/O, Eric Blake, 2020/02/29
- [PATCH 3/7] ios: Prove we don't need seek., Eric Blake, 2020/02/29
- [PATCH 1/7] ios: Drop Position column from .info ios, Eric Blake, 2020/02/29
- [PATCH 4/7] ios: Drop unused seek/tell callbacks., Eric Blake, 2020/02/29
- [PATCH 5/7] ios: Change from getchar to pread device interface., Eric Blake, 2020/02/29
- [PATCH 7/7] ios: Utilize buffer writes.,
Eric Blake <=
- [PATCH 6/7] ios: Utilize buffer reads., Eric Blake, 2020/02/29
- [PATCH 2/7] ios: Pass offset to low-level macros., Eric Blake, 2020/02/29
- Re: [PATCH 0/7] More efficient I/O, Jose E. Marchesi, 2020/02/29