Mercurial > public > mercurial-scm > hg
diff contrib/python-zstandard/c-ext/decompressobj.c @ 31796:e0dc40530c5a
zstd: vendor python-zstandard 0.8.0
Commit 81e1f5bbf1fc54808649562d3ed829730765c540 from
https://github.com/indygreg/python-zstandard is imported without
modifications (other than removing unwanted files).
Updates relevant to Mercurial include:
* Support for multi-threaded compression (we can use this for
bundle and wire protocol compression).
* APIs for batch compression and decompression operations using
multiple threads and optimal memory allocation mechanism. (Can
be useful for revlog perf improvements.)
* A ``BufferWithSegments`` type that models a single memory buffer
containing N discrete items of known lengths. This type can be
used for very efficient 0-copy data operations.
# no-check-commit
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Sat, 01 Apr 2017 15:24:03 -0700 |
parents | c32454d69b85 |
children | b1fb341d8a61 |
line wrap: on
line diff
--- a/contrib/python-zstandard/c-ext/decompressobj.c Sat Apr 01 13:43:52 2017 -0700 +++ b/contrib/python-zstandard/c-ext/decompressobj.c Sat Apr 01 15:24:03 2017 -0700 @@ -15,11 +15,6 @@ ); static void DecompressionObj_dealloc(ZstdDecompressionObj* self) { - if (self->dstream) { - ZSTD_freeDStream(self->dstream); - self->dstream = NULL; - } - Py_XDECREF(self->decompressor); PyObject_Del(self); @@ -35,6 +30,9 @@ PyObject* result = NULL; Py_ssize_t resultSize = 0; + /* Constructor should ensure stream is populated. */ + assert(self->decompressor->dstream); + if (self->finished) { PyErr_SetString(ZstdError, "cannot use a decompressobj multiple times"); return NULL; @@ -64,7 +62,7 @@ /* Read input until exhausted. */ while (input.pos < input.size) { Py_BEGIN_ALLOW_THREADS - zresult = ZSTD_decompressStream(self->dstream, &output, &input); + zresult = ZSTD_decompressStream(self->decompressor->dstream, &output, &input); Py_END_ALLOW_THREADS if (ZSTD_isError(zresult)) { @@ -106,8 +104,7 @@ goto finally; except: - Py_DecRef(result); - result = NULL; + Py_CLEAR(result); finally: PyMem_Free(output.dst);