//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include <__config>

#ifndef _LIBCPP_HAS_NO_THREADS

#include <barrier>
#include <thread>

_LIBCPP_BEGIN_NAMESPACE_STD

#if !defined(_LIBCPP_HAS_NO_TREE_BARRIER) && (_LIBCPP_STD_VER > 11)

class __barrier_algorithm_base {
public:
    struct alignas(64) /* naturally-align the heap state */ __state_t
    {
        struct {
            __atomic_base<__barrier_phase_t> __phase = ATOMIC_VAR_INIT(0);
        } __tickets[64];
    };

    ptrdiff_t&              __expected;
    unique_ptr<__state_t[]> __state;

    _LIBCPP_HIDDEN
    __barrier_algorithm_base(ptrdiff_t& __expected)
        : __expected(__expected)
    {
        size_t const __count = (__expected + 1) >> 1;
        __state = unique_ptr<__state_t[]>(new __state_t[__count]);
    }
    _LIBCPP_HIDDEN
    bool __arrive(__barrier_phase_t __old_phase)
    {
        __barrier_phase_t const __half_step = __old_phase + 1,
                                __full_step = __old_phase + 2;
        size_t __current_expected = __expected,
            __current = hash<thread::id>()(this_thread::get_id()) % ((__expected + 1) >> 1);
        for(int __round = 0;; ++__round) {
            if(__current_expected <= 1)
                return true;
            size_t const __end_node = ((__current_expected + 1) >> 1),
                         __last_node = __end_node - 1;
            for(;;++__current) {
                if(__current == __end_node)
                __current = 0;
                __barrier_phase_t expect = __old_phase;
                if(__current == __last_node && (__current_expected & 1))
                {
                    if(__state[__current].__tickets[__round].__phase.compare_exchange_strong(expect, __full_step, memory_order_acq_rel))
                        break;    // I'm 1 in 1, go to next __round
                }
                else if(__state[__current].__tickets[__round].__phase.compare_exchange_strong(expect, __half_step, memory_order_acq_rel))
                {
                    return false; // I'm 1 in 2, done with arrival
                }
                else if(expect == __half_step)
                {
                    if(__state[__current].__tickets[__round].__phase.compare_exchange_strong(expect, __full_step, memory_order_acq_rel))
                        break;    // I'm 2 in 2, go to next __round
                }
            }
            __current_expected = __last_node + 1;
            __current >>= 1;
        }
    }
};

_LIBCPP_EXPORTED_FROM_ABI
__barrier_algorithm_base * __construct_barrier_algorithm_base(ptrdiff_t& __expected)
{
    return new __barrier_algorithm_base(__expected);
}
_LIBCPP_EXPORTED_FROM_ABI
bool __arrive_barrier_algorithm_base(__barrier_algorithm_base* __barrier,
                                     __barrier_phase_t __old_phase)
{
    return __barrier->__arrive(__old_phase);
}
_LIBCPP_EXPORTED_FROM_ABI
void __destroy_barrier_algorithm_base(__barrier_algorithm_base* __barrier)
{
    delete __barrier;
}

#endif //!defined(_LIBCPP_HAS_NO_TREE_BARRIER) && (_LIBCPP_STD_VER >= 11)

_LIBCPP_END_NAMESPACE_STD

#endif //_LIBCPP_HAS_NO_THREADS
