/*
 * Copyright (C) 2008 The Android Open Source Project
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */
#include <semaphore.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/atomics.h>
#include <time.h>
#include <bionic_atomic_inline.h>
#include <bionic_futex.h>
#include <limits.h>

/* In this implementation, a semaphore contains a
 * 31-bit signed value and a 1-bit 'shared' flag
 * (for process-sharing purpose).
 *
 * We use the value -1 to indicate contention on the
 * semaphore, 0 or more to indicate uncontended state,
 * any value lower than -2 is invalid at runtime.
 *
 * State diagram:
 *
 * post(1)  ==> 2
 * post(0)  ==> 1
 * post(-1) ==> 1, then wake all waiters
 *
 * wait(2)  ==> 1
 * wait(1)  ==> 0
 * wait(0)  ==> -1 then wait for a wake up + loop
 * wait(-1) ==> -1 then wait for a wake up + loop
 *
 */

/* Use the upper 31-bits for the counter, and the lower one
 * for the shared flag.
 */
#define SEMCOUNT_SHARED_MASK      0x00000001
#define SEMCOUNT_VALUE_MASK       0xfffffffe
#define SEMCOUNT_VALUE_SHIFT      1

/* Maximum unsigned value that can be stored in the semaphore.
 * One bit is used for the shared flag, another one for the
 * sign bit, leaving us with only 30 bits.
 */
#define SEM_MAX_VALUE             0x3fffffff

/* convert a value into the corresponding sem->count bit pattern */
#define SEMCOUNT_FROM_VALUE(val)    (((val) << SEMCOUNT_VALUE_SHIFT) & SEMCOUNT_VALUE_MASK)

/* convert a sem->count bit pattern into the corresponding signed value */
#define SEMCOUNT_TO_VALUE(sval)  ((int)(sval) >> SEMCOUNT_VALUE_SHIFT)

/* the value +1 as a sem->count bit-pattern. */
#define SEMCOUNT_ONE              SEMCOUNT_FROM_VALUE(1)

/* the value -1 as a sem->count bit-pattern. */
#define SEMCOUNT_MINUS_ONE        SEMCOUNT_FROM_VALUE(-1)

#define SEMCOUNT_DECREMENT(sval)    (((sval) - (1U << SEMCOUNT_VALUE_SHIFT)) & SEMCOUNT_VALUE_MASK)
#define SEMCOUNT_INCREMENT(sval)    (((sval) + (1U << SEMCOUNT_VALUE_SHIFT)) & SEMCOUNT_VALUE_MASK)

/* return the shared bitflag from a semaphore */
#define SEM_GET_SHARED(sem)       ((sem)->count & SEMCOUNT_SHARED_MASK)


int sem_init(sem_t *sem, int pshared, unsigned int value)
{
    if (sem == NULL) {
        errno = EINVAL;
        return -1;
    }

    /* ensure that 'value' can be stored in the semaphore */
    if (value > SEM_MAX_VALUE) {
        errno = EINVAL;
        return -1;
    }

    sem->count = SEMCOUNT_FROM_VALUE(value);
    if (pshared != 0)
        sem->count |= SEMCOUNT_SHARED_MASK;

    return 0;
}


int sem_destroy(sem_t *sem)
{
    int count;

    if (sem == NULL) {
        errno = EINVAL;
        return -1;
    }
    count = SEMCOUNT_TO_VALUE(sem->count);
    if (count < 0) {
        errno = EBUSY;
        return -1;
    }
    sem->count = 0;
    return 0;
}


sem_t *sem_open(const char *name, int oflag, ...)
{
    name=name;
    oflag=oflag;

    errno = ENOSYS;
    return SEM_FAILED;
}


int sem_close(sem_t *sem)
{
    if (sem == NULL) {
        errno = EINVAL;
        return -1;
    }
    errno = ENOSYS;
    return -1;
}


int sem_unlink(const char * name)
{
    errno = ENOSYS;
    return -1;
}


/* Decrement a semaphore's value atomically,
 * and return the old one. As a special case,
 * this returns immediately if the value is
 * negative (i.e. -1)
 */
static int
__sem_dec(volatile unsigned int *pvalue)
{
    unsigned int shared = (*pvalue & SEMCOUNT_SHARED_MASK);
    unsigned int old, new;
    int          ret;

    do {
        old = (*pvalue & SEMCOUNT_VALUE_MASK);
        ret = SEMCOUNT_TO_VALUE(old);
        if (ret < 0)
            break;

        new = SEMCOUNT_DECREMENT(old);
    }
    while (__bionic_cmpxchg((int)(old|shared),
                            (int)(new|shared),
                            (volatile int *)pvalue) != 0);
    return ret;
}

/* Same as __sem_dec, but will not touch anything if the
 * value is already negative *or* 0. Returns the old value.
 */
static int
__sem_trydec(volatile unsigned int *pvalue)
{
    unsigned int shared = (*pvalue & SEMCOUNT_SHARED_MASK);
    unsigned int old, new;
    int          ret;

    do {
        old = (*pvalue & SEMCOUNT_VALUE_MASK);
        ret = SEMCOUNT_TO_VALUE(old);
        if (ret <= 0)
            break;

        new = SEMCOUNT_DECREMENT(old);
    }
    while (__bionic_cmpxchg((int)(old|shared),
                            (int)(new|shared),
                            (volatile int *)pvalue) != 0);

    return ret;
}


/* "Increment" the value of a semaphore atomically and
 * return its old value. Note that this implements
 * the special case of "incrementing" any negative
 * value to +1 directly.
 *
 * NOTE: The value will _not_ wrap above SEM_VALUE_MAX
 */
static int
__sem_inc(volatile unsigned int *pvalue)
{
    unsigned int  shared = (*pvalue & SEMCOUNT_SHARED_MASK);
    unsigned int  old, new;
    int           ret;

    do {
        old = (*pvalue & SEMCOUNT_VALUE_MASK);
        ret = SEMCOUNT_TO_VALUE(old);

        /* Can't go higher than SEM_MAX_VALUE */
        if (ret == SEM_MAX_VALUE)
            break;

        /* If the counter is negative, go directly to +1,
         * otherwise just increment */
        if (ret < 0)
            new = SEMCOUNT_ONE;
        else
            new = SEMCOUNT_INCREMENT(old);
    }
    while ( __bionic_cmpxchg((int)(old|shared),
                             (int)(new|shared),
                             (volatile int*)pvalue) != 0);

    return ret;
}

/* lock a semaphore */
int sem_wait(sem_t *sem)
{
    unsigned shared;

    if (sem == NULL) {
        errno = EINVAL;
        return -1;
    }

    shared = SEM_GET_SHARED(sem);

    for (;;) {
        if (__sem_dec(&sem->count) > 0)
            break;

        __futex_wait_ex(&sem->count, shared, shared|SEMCOUNT_MINUS_ONE, NULL);
    }
    ANDROID_MEMBAR_FULL();
    return 0;
}

int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout)
{
    int  ret;
    unsigned int shared;

    if (sem == NULL) {
        errno = EINVAL;
        return -1;
    }

    /* POSIX says we need to try to decrement the semaphore
     * before checking the timeout value. Note that if the
     * value is currently 0, __sem_trydec() does nothing.
     */
    if (__sem_trydec(&sem->count) > 0) {
        ANDROID_MEMBAR_FULL();
        return 0;
    }

    /* Check it as per Posix */
    if (abs_timeout == NULL    ||
        abs_timeout->tv_sec < 0 ||
        abs_timeout->tv_nsec < 0 ||
        abs_timeout->tv_nsec >= 1000000000)
    {
        errno = EINVAL;
        return -1;
    }

    shared = SEM_GET_SHARED(sem);

    for (;;) {
        struct timespec ts;
        int             ret;

        /* Posix mandates CLOCK_REALTIME here */
        clock_gettime( CLOCK_REALTIME, &ts );
        ts.tv_sec  = abs_timeout->tv_sec - ts.tv_sec;
        ts.tv_nsec = abs_timeout->tv_nsec - ts.tv_nsec;
        if (ts.tv_nsec < 0) {
            ts.tv_nsec += 1000000000;
            ts.tv_sec  -= 1;
        }

        if (ts.tv_sec < 0 || ts.tv_nsec < 0) {
            errno = ETIMEDOUT;
            return -1;
        }

        /* Try to grab the semaphore. If the value was 0, this
         * will also change it to -1 */
        if (__sem_dec(&sem->count) > 0) {
            ANDROID_MEMBAR_FULL();
            break;
        }

        /* Contention detected. wait for a wakeup event */
        ret = __futex_wait_ex(&sem->count, shared, shared|SEMCOUNT_MINUS_ONE, &ts);

        /* return in case of timeout or interrupt */
        if (ret == -ETIMEDOUT || ret == -EINTR) {
            errno = -ret;
            return -1;
        }
    }
    return 0;
}

/* Unlock a semaphore */
int sem_post(sem_t *sem)
{
    unsigned int shared;
    int          old;

    if (sem == NULL)
        return EINVAL;

    shared = SEM_GET_SHARED(sem);

    ANDROID_MEMBAR_FULL();
    old = __sem_inc(&sem->count);
    if (old < 0) {
        /* contention on the semaphore, wake up all waiters */
        __futex_wake_ex(&sem->count, shared, INT_MAX);
    }
    else if (old == SEM_MAX_VALUE) {
        /* overflow detected */
        errno = EOVERFLOW;
        return -1;
    }

    return 0;
}

int  sem_trywait(sem_t *sem)
{
    if (sem == NULL) {
        errno = EINVAL;
        return -1;
    }

    if (__sem_trydec(&sem->count) > 0) {
        ANDROID_MEMBAR_FULL();
        return 0;
    } else {
        errno = EAGAIN;
        return -1;
    }
}

/* Note that Posix requires that sem_getvalue() returns, in
 * case of contention, the negative of the number of waiting
 * threads.
 *
 * However, code that depends on this negative value to be
 * meaningful is most probably racy. The GLibc sem_getvalue()
 * only returns the semaphore value, which is 0, in case of
 * contention, so we will mimick this behaviour here instead
 * for better compatibility.
 */
int  sem_getvalue(sem_t *sem, int *sval)
{
    int  val;

    if (sem == NULL || sval == NULL) {
        errno = EINVAL;
        return -1;
    }

    val = SEMCOUNT_TO_VALUE(sem->count);
    if (val < 0)
        val = 0;

    *sval = val;
    return 0;
}
