blob: e362ed6f3f36e4ff8f08384c5712cf51ed4476ac [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef FBL_FUTEX_H_
#define FBL_FUTEX_H_
#include <zircon/types.h>
namespace fbl {
// A small helper class which wraps a zx_futex_t, provides atomic manipulation,
// and guarantees that we can properly get the address of the underlying storage
// (which we cannot technically do with std::atomic)
//
// TODO(johngro) - come back and clean this up once TC-350 has been resolved.
enum memory_order : int {
memory_order_relaxed = __ATOMIC_RELAXED,
memory_order_acquire = __ATOMIC_ACQUIRE,
memory_order_release = __ATOMIC_RELEASE,
memory_order_acq_rel = __ATOMIC_ACQ_REL,
memory_order_seq_cst = __ATOMIC_SEQ_CST,
};
class futex_t {
public:
constexpr futex_t(zx_futex_t value) : value_(value) {}
futex_t(const futex_t&) = delete;
futex_t(futex_t&&) = delete;
futex_t& operator=(const futex_t&) = delete;
futex_t& operator=(futex_t&&) = delete;
zx_futex_t load(memory_order order = memory_order_seq_cst) const {
return __atomic_load_n(&value_, order);
}
void store(zx_futex_t value, memory_order order = memory_order_seq_cst) {
return __atomic_store_n(&value_, value, order);
}
zx_futex_t* operator&() { return &value_; }
const zx_futex_t* operator&() const { return &value_; }
private:
zx_futex_t value_;
};
} // namespace fbl
#endif // FBL_FUTEX_H_