// Copyright 2017 The Dawn Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "dawn_native/RefCounted.h"

#include "common/Assert.h"

#include <cstddef>

namespace dawn_native {

    static constexpr size_t kPayloadBits = 1;
    static constexpr uint64_t kPayloadMask = (uint64_t(1) << kPayloadBits) - 1;
    static constexpr uint64_t kRefCountIncrement = (uint64_t(1) << kPayloadBits);

    RefCounted::RefCounted(uint64_t payload) : mRefCount(kRefCountIncrement + payload) {
        ASSERT((payload & kPayloadMask) == payload);
    }

    RefCounted::~RefCounted() {
    }

    uint64_t RefCounted::GetRefCountForTesting() const {
        return mRefCount >> kPayloadBits;
    }

    uint64_t RefCounted::GetRefCountPayload() const {
        // We only care about the payload bits of the refcount. These never change after
        // initialization so we can use the relaxed memory order. The order doesn't guarantee
        // anything except the atomicity of the load, which is enough since any past values of the
        // atomic will have the correct payload bits.
        return kPayloadMask & mRefCount.load(std::memory_order_relaxed);
    }

    void RefCounted::Reference() {
        ASSERT((mRefCount & ~kPayloadMask) != 0);

        // The relaxed ordering guarantees only the atomicity of the update, which is enough here
        // because the reference we are copying from still exists and makes sure other threads
        // don't delete `this`.
        // See the explanation in the Boost documentation:
        //     https://www.boost.org/doc/libs/1_55_0/doc/html/atomic/usage_examples.html
        mRefCount.fetch_add(kRefCountIncrement, std::memory_order_relaxed);
    }

    void RefCounted::Release() {
        ASSERT((mRefCount & ~kPayloadMask) != 0);

        // The release fence here is to make sure all accesses to the object on a thread A
        // happen-before the object is deleted on a thread B. The release memory order ensures that
        // all accesses on thread A happen-before the refcount is decreased and the atomic variable
        // makes sure the refcount decrease in A happens-before the refcount decrease in B. Finally
        // the acquire fence in the destruction case makes sure the refcount decrease in B
        // happens-before the `delete this`.
        //
        // See the explanation in the Boost documentation:
        //     https://www.boost.org/doc/libs/1_55_0/doc/html/atomic/usage_examples.html
        uint64_t previousRefCount =
            mRefCount.fetch_sub(kRefCountIncrement, std::memory_order_release);

        // Check that the previous reference count was strictly less than 2, ignoring payload bits.
        if (previousRefCount < 2 * kRefCountIncrement) {
            // Note that on ARM64 this will generate a `dmb ish` instruction which is a global
            // memory barrier, when an acquire load on mRefCount (using the `ldar` instruction)
            // should be enough and could end up being faster.
            std::atomic_thread_fence(std::memory_order_acquire);
            delete this;
        }
    }

}  // namespace dawn_native
