From 5f7f1e8866d13f3ecb662cf814f0b599b82de09c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 24 Jun 2020 22:18:20 +0100 Subject: Make _JqStatePool thread-safe --- jq.pyx | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/jq.pyx b/jq.pyx index 1846cfd..f319c18 100644 --- a/jq.pyx +++ b/jq.pyx @@ -1,4 +1,5 @@ import json +import threading from cpython.bytes cimport PyBytes_AsString @@ -119,27 +120,31 @@ _NO_VALUE = _EmptyValue() cdef class _JqStatePool(object): cdef jq_state* _jq_state cdef object _program_bytes + cdef object _lock def __cinit__(self, program_bytes): self._program_bytes = program_bytes self._jq_state = _compile(self._program_bytes) + self._lock = threading.Lock() def __dealloc__(self): jq_teardown(&self._jq_state) cdef jq_state* acquire(self): - if self._jq_state == NULL: - return _compile(self._program_bytes) - else: - state = self._jq_state - self._jq_state = NULL - return state + with self._lock: + if self._jq_state == NULL: + return _compile(self._program_bytes) + else: + state = self._jq_state + self._jq_state = NULL + return state cdef void release(self, jq_state* state): - if self._jq_state == NULL: - self._jq_state = state - else: - jq_teardown(&state) + with self._lock: + if self._jq_state == NULL: + self._jq_state = state + else: + jq_teardown(&state) cdef class _Program(object): -- cgit v1.2.3