summaryrefslogtreecommitdiffstats
path: root/bitbang_spi.c
diff options
context:
space:
mode:
authorCarl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>2009-11-25 16:58:17 +0000
committerCarl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>2009-11-25 16:58:17 +0000
commitb7e01457d12b64d98b0396f95e46489c02209982 (patch)
tree341176081702d03d5bfc3fc5eafbeea6618f5e0c /bitbang_spi.c
parent2925d6f11d1f7463385baeda6088b31d06be5714 (diff)
downloadast2050-flashrom-b7e01457d12b64d98b0396f95e46489c02209982.zip
ast2050-flashrom-b7e01457d12b64d98b0396f95e46489c02209982.tar.gz
Reduce realloc syscall overhead for FT2232 and bitbang
FT2232 ran realloc() for every executed command. Start with a big enough buffer and don't touch buffer size unless it needs to grow. Bitbang was slightly better: It only ran realloc() if buffer size changed. Still, the solution above improves performance and reliability. Corresponding to flashrom svn r780. Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> Acked-by: Sean Nelson <audiohacked@gmail.com>
Diffstat (limited to 'bitbang_spi.c')
-rw-r--r--bitbang_spi.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/bitbang_spi.c b/bitbang_spi.c
index 0f1f7ed..abf5530 100644
--- a/bitbang_spi.c
+++ b/bitbang_spi.c
@@ -87,14 +87,16 @@ int bitbang_spi_send_command(unsigned int writecnt, unsigned int readcnt,
static unsigned char *bufout = NULL;
static unsigned char *bufin = NULL;
static int oldbufsize = 0;
- int bufsize = max(writecnt + readcnt, 260);
+ int bufsize;
int i;
/* Arbitrary size limitation here. We're only constrained by memory. */
if (writecnt > 65536 || readcnt > 65536)
return SPI_INVALID_LENGTH;
- if (bufsize != oldbufsize) {
+ bufsize = max(writecnt + readcnt, 260);
+ /* Never shrink. realloc() calls are expensive. */
+ if (bufsize > oldbufsize) {
bufout = realloc(bufout, bufsize);
if (!bufout) {
fprintf(stderr, "Out of memory!\n");
@@ -109,6 +111,7 @@ int bitbang_spi_send_command(unsigned int writecnt, unsigned int readcnt,
free(bufout);
exit(1);
}
+ oldbufsize = bufsize;
}
memcpy(bufout, writearr, writecnt);
OpenPOWER on IntegriCloud