Make sure sval is set before comparing it with self->maxvalue. Compare only if the return value was zero. This fixes "ValueError: semaphore or lock released too many times" which occured only for i686. --- Modules/_multiprocessing/semaphore.c 2016-12-17 21:05:07.000000000 +0100 +++ Modules/_multiprocessing/semaphore.c 2016-12-31 17:42:30.429238082 +0100 @@ -382,9 +382,10 @@ /* This check is not an absolute guarantee that the semaphore does not rise above maxvalue. */ + int res = sem_getvalue(self->handle, &sval); - if (sem_getvalue(self->handle, &sval) < 0) { + if (res < 0) { return PyErr_SetFromErrno(PyExc_OSError); - } else if (sval >= self->maxvalue) { + } else if (res == 0 && sval >= self->maxvalue) { PyErr_SetString(PyExc_ValueError, "semaphore or lock " "released too many times"); return NULL;