diff options
author | Julian Taylor <juliantaylor108@gmail.com> | 2016-02-22 23:45:06 +0100 |
---|---|---|
committer | Julian Taylor <juliantaylor108@gmail.com> | 2016-02-22 23:45:06 +0100 |
commit | a51655578df2fb1cfe161887cc6414120d0cf8c5 (patch) | |
tree | 663aa9155e6331e897d6491872c2f764efbd5903 | |
parent | 0dbcd2fd49db8657a2c6f618608ce8867e06c8a6 (diff) | |
parent | 9cdff27107b5feb0f6bfe5c408970716b19aa93d (diff) | |
download | numpy-a51655578df2fb1cfe161887cc6414120d0cf8c5.tar.gz |
Merge pull request #7305 from ssbr/ssbr-racy-mtrand
BUG: Remove data race in mtrand: two threads could mutate the state.
-rw-r--r-- | numpy/random/mtrand/mtrand.pyx | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/numpy/random/mtrand/mtrand.pyx b/numpy/random/mtrand/mtrand.pyx index b05d86747..964129a8c 100644 --- a/numpy/random/mtrand/mtrand.pyx +++ b/numpy/random/mtrand/mtrand.pyx @@ -158,7 +158,9 @@ cdef object cont0_array(rk_state *state, rk_cont0 func, object size, cdef npy_intp i if size is None: - return func(state) + with lock, nogil: + rv = func(state) + return rv else: array = <ndarray>np.empty(size, np.float64) length = PyArray_SIZE(array) @@ -177,7 +179,9 @@ cdef object cont1_array_sc(rk_state *state, rk_cont1 func, object size, double a cdef npy_intp i if size is None: - return func(state, a) + with lock, nogil: + rv = func(state, a) + return rv else: array = <ndarray>np.empty(size, np.float64) length = PyArray_SIZE(array) @@ -229,7 +233,9 @@ cdef object cont2_array_sc(rk_state *state, rk_cont2 func, object size, double a cdef npy_intp i if size is None: - return func(state, a, b) + with lock, nogil: + rv = func(state, a, b) + return rv else: array = <ndarray>np.empty(size, np.float64) length = PyArray_SIZE(array) @@ -278,7 +284,9 @@ cdef object cont3_array_sc(rk_state *state, rk_cont3 func, object size, double a cdef npy_intp i if size is None: - return func(state, a, b, c) + with lock, nogil: + rv = func(state, a, b, c) + return rv else: array = <ndarray>np.empty(size, np.float64) length = PyArray_SIZE(array) @@ -327,7 +335,9 @@ cdef object disc0_array(rk_state *state, rk_disc0 func, object size, object lock cdef npy_intp i if size is None: - return func(state) + with lock, nogil: + rv = func(state) + return rv else: array = <ndarray>np.empty(size, int) length = PyArray_SIZE(array) @@ -345,7 +355,9 @@ cdef object discnp_array_sc(rk_state *state, rk_discnp func, object size, cdef npy_intp i if size is None: - return func(state, n, p) + with lock, nogil: + rv = func(state, n, p) + return rv else: array = <ndarray>np.empty(size, int) length = PyArray_SIZE(array) @@ -392,7 +404,9 @@ cdef object discdd_array_sc(rk_state *state, rk_discdd func, object size, cdef npy_intp i if size is None: - return func(state, n, p) + with lock, nogil: + rv = func(state, n, p) + return rv else: array = <ndarray>np.empty(size, int) length = PyArray_SIZE(array) @@ -439,7 +453,9 @@ cdef object discnmN_array_sc(rk_state *state, rk_discnmN func, object size, cdef npy_intp i if size is None: - return func(state, n, m, N) + with lock, nogil: + rv = func(state, n, m, N) + return rv else: array = <ndarray>np.empty(size, int) length = PyArray_SIZE(array) @@ -488,7 +504,9 @@ cdef object discd_array_sc(rk_state *state, rk_discd func, object size, cdef npy_intp i if size is None: - return func(state, a) + with lock, nogil: + rv = func(state, a) + return rv else: array = <ndarray>np.empty(size, int) length = PyArray_SIZE(array) |