Skip to content

Commit d142aa8

Browse files
committed
Updates based on Sam's review
- Assert locks are held in `_get_(C/D)Dict` - Update self->d_dict outside `Py_BEGIN_ALLOW_THREADS` - removed critical section AC I missed
1 parent d8d48c2 commit d142aa8

File tree

3 files changed

+14
-20
lines changed

3 files changed

+14
-20
lines changed

Modules/_zstd/clinic/decompressor.c.h

Lines changed: 2 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Modules/_zstd/compressor.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ capsule_free_cdict(PyObject *capsule)
153153
ZSTD_CDict *
154154
_get_CDict(ZstdDict *self, int compressionLevel)
155155
{
156+
assert(PyMutex_IsLocked(&self->lock));
156157
PyObject *level = NULL;
157158
PyObject *capsule;
158159
ZSTD_CDict *cdict;
@@ -197,11 +198,14 @@ _get_CDict(ZstdDict *self, int compressionLevel)
197198
}
198199

199200
/* Add PyCapsule object to self->c_dicts if not already inserted */
200-
if (PyDict_SetItem(self->c_dicts, level, capsule) < 0) {
201-
Py_DECREF(capsule);
201+
PyObject *capsule_dict;
202+
int ret = PyDict_SetDefaultRef(self->c_dicts, level, capsule,
203+
&capsule_dict);
204+
Py_XDECREF(capsule_dict);
205+
Py_DECREF(capsule);
206+
if (ret < 0) {
202207
goto error;
203208
}
204-
Py_DECREF(capsule);
205209
}
206210
else {
207211
/* ZSTD_CDict instance already exists */

Modules/_zstd/decompressor.c

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ typedef struct {
5858
static inline ZSTD_DDict *
5959
_get_DDict(ZstdDict *self)
6060
{
61+
assert(PyMutex_IsLocked(&self->lock));
6162
ZSTD_DDict *ret;
6263

6364
/* Already created */
@@ -70,9 +71,9 @@ _get_DDict(ZstdDict *self)
7071
char *dict_buffer = PyBytes_AS_STRING(self->dict_content);
7172
Py_ssize_t dict_len = Py_SIZE(self->dict_content);
7273
Py_BEGIN_ALLOW_THREADS
73-
self->d_dict = ZSTD_createDDict(dict_buffer,
74-
dict_len);
74+
ret = ZSTD_createDDict(dict_buffer, dict_len);
7575
Py_END_ALLOW_THREADS
76+
self->d_dict = ret;
7677

7778
if (self->d_dict == NULL) {
7879
_zstd_state* const mod_state = PyType_GetModuleState(Py_TYPE(self));
@@ -84,10 +85,7 @@ _get_DDict(ZstdDict *self)
8485
}
8586
}
8687

87-
/* Don't lose any exception */
88-
ret = self->d_dict;
89-
90-
return ret;
88+
return self->d_dict;
9189
}
9290

9391
/* Set decompression parameters to decompression context */
@@ -629,7 +627,6 @@ ZstdDecompressor_dealloc(PyObject *ob)
629627
}
630628

631629
/*[clinic input]
632-
@critical_section
633630
@getter
634631
_zstd.ZstdDecompressor.unused_data
635632
@@ -641,7 +638,7 @@ decompressed, unused input data after the frame. Otherwise this will be b''.
641638

642639
static PyObject *
643640
_zstd_ZstdDecompressor_unused_data_get_impl(ZstdDecompressor *self)
644-
/*[clinic end generated code: output=f3a20940f11b6b09 input=5233800bef00df04]*/
641+
/*[clinic end generated code: output=f3a20940f11b6b09 input=54d41ecd681a3444]*/
645642
{
646643
PyObject *ret;
647644

0 commit comments

Comments
 (0)