int qemu_sem_timedwait(QemuSemaphore *sem, int ms)

{

    int rc;

    struct timespec ts;



#if defined(__APPLE__) || defined(__NetBSD__)

    compute_abs_deadline(&ts, ms);

    pthread_mutex_lock(&sem->lock);

    --sem->count;

    while (sem->count < 0) {

        rc = pthread_cond_timedwait(&sem->cond, &sem->lock, &ts);

        if (rc == ETIMEDOUT) {


            break;

        }

        if (rc != 0) {

            error_exit(rc, __func__);

        }

    }

    pthread_mutex_unlock(&sem->lock);

    return (rc == ETIMEDOUT ? -1 : 0);

#else

    if (ms <= 0) {

        /* This is cheaper than sem_timedwait.  */

        do {

            rc = sem_trywait(&sem->sem);

        } while (rc == -1 && errno == EINTR);

        if (rc == -1 && errno == EAGAIN) {

            return -1;

        }

    } else {

        compute_abs_deadline(&ts, ms);

        do {

            rc = sem_timedwait(&sem->sem, &ts);

        } while (rc == -1 && errno == EINTR);

        if (rc == -1 && errno == ETIMEDOUT) {

            return -1;

        }

    }

    if (rc < 0) {

        error_exit(errno, __func__);

    }

    return 0;

#endif

}
int qemu_sem_timedwait(QemuSemaphore *sem, int ms)

{

    int rc;

    struct timespec ts;



#if defined(__APPLE__) || defined(__NetBSD__)

    compute_abs_deadline(&ts, ms);

    pthread_mutex_lock(&sem->lock);

    --sem->count;

    while (sem->count < 0) {

        rc = pthread_cond_timedwait(&sem->cond, &sem->lock, &ts);

        if (rc == ETIMEDOUT) {


            break;

        }

        if (rc != 0) {

            error_exit(rc, __func__);

        }

    }

    pthread_mutex_unlock(&sem->lock);

    return (rc == ETIMEDOUT ? -1 : 0);

#else

    if (ms <= 0) {

        

        do {

            rc = sem_trywait(&sem->sem);

        } while (rc == -1 && errno == EINTR);

        if (rc == -1 && errno == EAGAIN) {

            return -1;

        }

    } else {

        compute_abs_deadline(&ts, ms);

        do {

            rc = sem_timedwait(&sem->sem, &ts);

        } while (rc == -1 && errno == EINTR);

        if (rc == -1 && errno == ETIMEDOUT) {

            return -1;

        }

    }

    if (rc < 0) {

        error_exit(errno, __func__);

    }

    return 0;

#endif

}
int FUNC_0(QemuSemaphore *VAR_0, int VAR_1)

{

    int VAR_2;

    struct timespec VAR_3;



#if defined(__APPLE__) || defined(__NetBSD__)

    compute_abs_deadline(&VAR_3, VAR_1);

    pthread_mutex_lock(&VAR_0->lock);

    --VAR_0->count;

    while (VAR_0->count < 0) {

        VAR_2 = pthread_cond_timedwait(&VAR_0->cond, &VAR_0->lock, &VAR_3);

        if (VAR_2 == ETIMEDOUT) {


            break;

        }

        if (VAR_2 != 0) {

            error_exit(VAR_2, __func__);

        }

    }

    pthread_mutex_unlock(&VAR_0->lock);

    return (VAR_2 == ETIMEDOUT ? -1 : 0);

#else

    if (VAR_1 <= 0) {

        

        do {

            VAR_2 = sem_trywait(&VAR_0->VAR_0);

        } while (VAR_2 == -1 && errno == EINTR);

        if (VAR_2 == -1 && errno == EAGAIN) {

            return -1;

        }

    } else {

        compute_abs_deadline(&VAR_3, VAR_1);

        do {

            VAR_2 = sem_timedwait(&VAR_0->VAR_0, &VAR_3);

        } while (VAR_2 == -1 && errno == EINTR);

        if (VAR_2 == -1 && errno == ETIMEDOUT) {

            return -1;

        }

    }

    if (VAR_2 < 0) {

        error_exit(errno, __func__);

    }

    return 0;

#endif

}
int FUNC_0(QemuSemaphore *VAR_0, int VAR_1)
{ int VAR_2; struct timespec VAR_3; #if defined(__APPLE__) || defined(__NetBSD__)
compute_abs_deadline(&VAR_3, VAR_1); pthread_mutex_lock(&VAR_0->lock); --VAR_0->count; while (VAR_0->count < 0) { VAR_2 = pthread_cond_timedwait(&VAR_0->cond, &VAR_0->lock, &VAR_3); if (VAR_2 == ETIMEDOUT) { break; } if (VAR_2 != 0) { error_exit(VAR_2, __func__); } } pthread_mutex_unlock(&VAR_0->lock); return (VAR_2 == ETIMEDOUT ? -1 : 0); #else
if (VAR_1 <= 0) { do { VAR_2 = sem_trywait(&VAR_0->VAR_0); } while (VAR_2 == -1 && errno == EINTR); if (VAR_2 == -1 && errno == EAGAIN) { return -1; } } else { compute_abs_deadline(&VAR_3, VAR_1); do { VAR_2 = sem_timedwait(&VAR_0->VAR_0, &VAR_3); } while (VAR_2 == -1 && errno == EINTR); if (VAR_2 == -1 && errno == ETIMEDOUT) { return -1; } } if (VAR_2 < 0) { error_exit(errno, __func__); } return 0; #endif
}