/*! \internal */ bool QSystemSemaphorePrivate::modifySemaphore(int count) { if (-1 == handle()) return false; struct sembuf operation; operation.sem_num = 0; operation.sem_op = count; operation.sem_flg = SEM_UNDO; int res; EINTR_LOOP(res, semop(semaphore, &operation, 1)); if (-1 == res) { // If the semaphore was removed be nice and create it and then modifySemaphore again if (errno == EINVAL || errno == EIDRM) { semaphore = -1; cleanHandle(); handle(); return modifySemaphore(count); } setErrorString(QLatin1String("QSystemSemaphore::modifySemaphore")); #if defined QSYSTEMSEMAPHORE_DEBUG qDebug() << QLatin1String("QSystemSemaphore::modify failed") << count << semctl(semaphore, 0, GETVAL) << errno << EIDRM << EINVAL; #endif return false; } clearError(); return true; }
/*! \internal */ bool QSystemSemaphorePrivate::modifySemaphore(int count) { #ifndef QT_POSIX_IPC if (-1 == handle()) return false; struct sembuf operation; operation.sem_num = 0; operation.sem_op = count; operation.sem_flg = SEM_UNDO; register int res; EINTR_LOOP(res, semop(semaphore, &operation, 1)); if (-1 == res) { // If the semaphore was removed be nice and create it and then modifySemaphore again if (errno == EINVAL || errno == EIDRM) { semaphore = -1; cleanHandle(); handle(); return modifySemaphore(count); } setErrorString(QLatin1String("QSystemSemaphore::modifySemaphore")); #ifdef QSYSTEMSEMAPHORE_DEBUG qDebug() << QLatin1String("QSystemSemaphore::modify failed") << count << semctl(semaphore, 0, GETVAL) << errno << EIDRM << EINVAL; #endif return false; } #else if (!handle()) return false; if (count > 0) { int cnt = count; do { if (sem_post(semaphore) == -1) { setErrorString(QLatin1String("QSystemSemaphore::modifySemaphore (sem_post)")); #ifdef QSYSTEMSEMAPHORE_DEBUG qDebug() << QLatin1String("QSystemSemaphore::modify sem_post failed") << count << errno; #endif // rollback changes to preserve the SysV semaphore behavior for ( ; cnt < count; ++cnt) { register int res; EINTR_LOOP(res, sem_wait(semaphore)); } return false; } --cnt; } while (cnt > 0); } else { register int res; EINTR_LOOP(res, sem_wait(semaphore)); if (res == -1) { // If the semaphore was removed be nice and create it and then modifySemaphore again if (errno == EINVAL || errno == EIDRM) { semaphore = SEM_FAILED; return modifySemaphore(count); } setErrorString(QLatin1String("QSystemSemaphore::modifySemaphore (sem_wait)")); #ifdef QSYSTEMSEMAPHORE_DEBUG qDebug() << QLatin1String("QSystemSemaphore::modify sem_wait failed") << count << errno; #endif return false; } } #endif // QT_POSIX_IPC return true; }