changeset: 95293:9d3013a383eb branch: 3.4 parent: 95282:442ebebad516 user: Victor Stinner date: Mon Mar 30 11:18:30 2015 +0200 files: Python/random.c description: Issue #22585: os.urandom() now releases the GIL when the getentropy() is used (OpenBSD 5.6+). diff -r 442ebebad516 -r 9d3013a383eb Python/random.c --- a/Python/random.c Mon Mar 30 09:58:41 2015 +0300 +++ b/Python/random.c Mon Mar 30 11:18:30 2015 +0200 @@ -78,16 +78,24 @@ { while (size > 0) { Py_ssize_t len = Py_MIN(size, 256); - int res = getentropy(buffer, len); - if (res < 0) { - if (fatal) { - Py_FatalError("getentropy() failed"); - } - else { + int res; + + if (!fatal) { + Py_BEGIN_ALLOW_THREADS + res = getentropy(buffer, len); + Py_END_ALLOW_THREADS + + if (res < 0) { PyErr_SetFromErrno(PyExc_OSError); return -1; } } + else { + res = getentropy(buffer, len); + if (res < 0) + Py_FatalError("getentropy() failed"); + } + buffer += len; size -= len; }