Charles R Harris wrote:
Travis,
Is this correct?
Yes.
NPY_LOOP_BEGIN_THREADS; switch(loop->meth) { case ONE_UFUNCLOOP: /* * Everything is contiguous, notswapped, aligned, * and of the right type. -- Fastest. * Or if not contiguous, then a single-stride * increment moves through the entire array. */ /*fprintf(stderr, "ONE...%d\n", loop->size);*/ loop->function((char **)loop->bufptr, &(loop->size), loop->steps, loop->funcdata); UFUNC_CHECK_ERROR(loop); break;
Note that UFUNC_CHECK_ERROR calls PyErr_Occurred. That doesn't seem thread safe to me. Or maybe there is something special about that function I'm missing.
Check the definition of the macro. It only calls PyErr_Occurred if the obj variable is non-zero on the loop structure, indicating an OBJECT-array loop. In that case, the NPY_LOOP_BEGIN_THREADS does not actually release the GIL either. -Travis