summaryrefslogtreecommitdiff
path: root/Modules/_bz2module.c
diff options
context:
space:
mode:
authorNadeem Vawda <nadeem.vawda@gmail.com>2011-10-13 13:38:14 +0200
committerNadeem Vawda <nadeem.vawda@gmail.com>2011-10-13 13:38:14 +0200
commit72d6a13413d3dedf9979cfbd7bc41d58f52144b6 (patch)
treed7a85107c3913d65df3250c2e82109e8998fbd19 /Modules/_bz2module.c
parent55c991197b8dc971c1358b2b8e71fc9eaf3970c9 (diff)
parentd41a98bdd9076eeadf4d3ba6d8db287e26b89777 (diff)
downloadcpython-git-72d6a13413d3dedf9979cfbd7bc41d58f52144b6.tar.gz
Merge #13159: Replace FileIO's quadratic-time buffer growth algorithm with a linear-time one.
Also fix the bz2 module, which suffered from the same problem.
Diffstat (limited to 'Modules/_bz2module.c')
-rw-r--r--Modules/_bz2module.c16
1 files changed, 4 insertions, 12 deletions
diff --git a/Modules/_bz2module.c b/Modules/_bz2module.c
index d329c14626..b407df9d96 100644
--- a/Modules/_bz2module.c
+++ b/Modules/_bz2module.c
@@ -116,22 +116,14 @@ catch_bz2_error(int bzerror)
#define SMALLCHUNK BUFSIZ
#endif
-#if SIZEOF_INT < 4
-#define BIGCHUNK (512 * 32)
-#else
-#define BIGCHUNK (512 * 1024)
-#endif
-
static int
grow_buffer(PyObject **buf)
{
+ /* Expand the buffer by an amount proportional to the current size,
+ giving us amortized linear-time behavior. Use a less-than-double
+ growth factor to avoid excessive allocation. */
size_t size = PyBytes_GET_SIZE(*buf);
- if (size <= SMALLCHUNK)
- return _PyBytes_Resize(buf, size + SMALLCHUNK);
- else if (size <= BIGCHUNK)
- return _PyBytes_Resize(buf, size * 2);
- else
- return _PyBytes_Resize(buf, size + BIGCHUNK);
+ return _PyBytes_Resize(buf, size + (size >> 3) + 6);
}