diff options
author | Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> | 2009-11-25 16:58:17 +0000 |
---|---|---|
committer | Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> | 2009-11-25 16:58:17 +0000 |
commit | b7e01457d12b64d98b0396f95e46489c02209982 (patch) | |
tree | 341176081702d03d5bfc3fc5eafbeea6618f5e0c /bitbang_spi.c | |
parent | 2925d6f11d1f7463385baeda6088b31d06be5714 (diff) | |
download | flashrom-b7e01457d12b64d98b0396f95e46489c02209982.tar.gz flashrom-b7e01457d12b64d98b0396f95e46489c02209982.tar.bz2 flashrom-b7e01457d12b64d98b0396f95e46489c02209982.zip |
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.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/bitbang_spi.c b/bitbang_spi.c index 0f1f7ed0f..abf553017 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); |