comparison contrib/python-zstandard/c-ext/compressoriterator.c @ 37495:b1fb341d8a61

zstandard: vendor python-zstandard 0.9.0 This was just released. It features a number of goodies. More info at https://gregoryszorc.com/blog/2018/04/09/release-of-python-zstandard-0.9/. The clang-format ignore list was updated to reflect the new source of files. The project contains a vendored copy of zstandard 1.3.4. The old version was 1.1.3. One of the changes between those versions is that zstandard is now dual licensed BSD + GPLv2 and the patent rights grant has been removed. Good riddance. The API should be backwards compatible. So no changes in core should be needed. However, there were a number of changes in the library that we'll want to adapt to. Those will be addressed in subsequent commits. Differential Revision: https://phab.mercurial-scm.org/D3198
author Gregory Szorc <gregory.szorc@gmail.com>
date Mon, 09 Apr 2018 10:13:29 -0700
parents e0dc40530c5a
children 675775c33ab6
comparison
equal deleted inserted replaced
37494:1ce7a55b09d1 37495:b1fb341d8a61
19 static void ZstdCompressorIterator_dealloc(ZstdCompressorIterator* self) { 19 static void ZstdCompressorIterator_dealloc(ZstdCompressorIterator* self) {
20 Py_XDECREF(self->readResult); 20 Py_XDECREF(self->readResult);
21 Py_XDECREF(self->compressor); 21 Py_XDECREF(self->compressor);
22 Py_XDECREF(self->reader); 22 Py_XDECREF(self->reader);
23 23
24 if (self->buffer) { 24 if (self->buffer.buf) {
25 PyBuffer_Release(self->buffer); 25 PyBuffer_Release(&self->buffer);
26 PyMem_FREE(self->buffer); 26 memset(&self->buffer, 0, sizeof(self->buffer));
27 self->buffer = NULL;
28 } 27 }
29 28
30 if (self->output.dst) { 29 if (self->output.dst) {
31 PyMem_Free(self->output.dst); 30 PyMem_Free(self->output.dst);
32 self->output.dst = NULL; 31 self->output.dst = NULL;
56 feedcompressor: 55 feedcompressor:
57 56
58 /* If we have data left in the input, consume it. */ 57 /* If we have data left in the input, consume it. */
59 if (self->input.pos < self->input.size) { 58 if (self->input.pos < self->input.size) {
60 Py_BEGIN_ALLOW_THREADS 59 Py_BEGIN_ALLOW_THREADS
61 if (self->compressor->mtcctx) { 60 zresult = ZSTD_compress_generic(self->compressor->cctx, &self->output,
62 zresult = ZSTDMT_compressStream(self->compressor->mtcctx, 61 &self->input, ZSTD_e_continue);
63 &self->output, &self->input);
64 }
65 else {
66 zresult = ZSTD_compressStream(self->compressor->cstream, &self->output,
67 &self->input);
68 }
69 Py_END_ALLOW_THREADS 62 Py_END_ALLOW_THREADS
70 63
71 /* Release the Python object holding the input buffer. */ 64 /* Release the Python object holding the input buffer. */
72 if (self->input.pos == self->input.size) { 65 if (self->input.pos == self->input.size) {
73 self->input.src = NULL; 66 self->input.src = NULL;
105 } 98 }
106 99
107 PyBytes_AsStringAndSize(readResult, &readBuffer, &readSize); 100 PyBytes_AsStringAndSize(readResult, &readBuffer, &readSize);
108 } 101 }
109 else { 102 else {
110 assert(self->buffer && self->buffer->buf); 103 assert(self->buffer.buf);
111 104
112 /* Only support contiguous C arrays. */ 105 /* Only support contiguous C arrays. */
113 assert(self->buffer->strides == NULL && self->buffer->suboffsets == NULL); 106 assert(self->buffer.strides == NULL && self->buffer.suboffsets == NULL);
114 assert(self->buffer->itemsize == 1); 107 assert(self->buffer.itemsize == 1);
115 108
116 readBuffer = (char*)self->buffer->buf + self->bufferOffset; 109 readBuffer = (char*)self->buffer.buf + self->bufferOffset;
117 bufferRemaining = self->buffer->len - self->bufferOffset; 110 bufferRemaining = self->buffer.len - self->bufferOffset;
118 readSize = min(bufferRemaining, (Py_ssize_t)self->inSize); 111 readSize = min(bufferRemaining, (Py_ssize_t)self->inSize);
119 self->bufferOffset += readSize; 112 self->bufferOffset += readSize;
120 } 113 }
121 114
122 if (0 == readSize) { 115 if (0 == readSize) {
128 } 121 }
129 } 122 }
130 123
131 /* EOF */ 124 /* EOF */
132 if (0 == readSize) { 125 if (0 == readSize) {
133 if (self->compressor->mtcctx) { 126 self->input.src = NULL;
134 zresult = ZSTDMT_endStream(self->compressor->mtcctx, &self->output); 127 self->input.size = 0;
135 } 128 self->input.pos = 0;
136 else { 129
137 zresult = ZSTD_endStream(self->compressor->cstream, &self->output); 130 zresult = ZSTD_compress_generic(self->compressor->cctx, &self->output,
138 } 131 &self->input, ZSTD_e_end);
139 if (ZSTD_isError(zresult)) { 132 if (ZSTD_isError(zresult)) {
140 PyErr_Format(ZstdError, "error ending compression stream: %s", 133 PyErr_Format(ZstdError, "error ending compression stream: %s",
141 ZSTD_getErrorName(zresult)); 134 ZSTD_getErrorName(zresult));
142 return NULL; 135 return NULL;
143 } 136 }
157 self->input.src = readBuffer; 150 self->input.src = readBuffer;
158 self->input.size = readSize; 151 self->input.size = readSize;
159 self->input.pos = 0; 152 self->input.pos = 0;
160 153
161 Py_BEGIN_ALLOW_THREADS 154 Py_BEGIN_ALLOW_THREADS
162 if (self->compressor->mtcctx) { 155 zresult = ZSTD_compress_generic(self->compressor->cctx, &self->output,
163 zresult = ZSTDMT_compressStream(self->compressor->mtcctx, &self->output, 156 &self->input, ZSTD_e_continue);
164 &self->input);
165 }
166 else {
167 zresult = ZSTD_compressStream(self->compressor->cstream, &self->output, &self->input);
168 }
169 Py_END_ALLOW_THREADS 157 Py_END_ALLOW_THREADS
170 158
171 /* The input buffer currently points to memory managed by Python 159 /* The input buffer currently points to memory managed by Python
172 (readBuffer). This object was allocated by this function. If it wasn't 160 (readBuffer). This object was allocated by this function. If it wasn't
173 fully consumed, we need to release it in a subsequent function call. 161 fully consumed, we need to release it in a subsequent function call.