blob: 1c6ea77d0daf83a9f7de018e04a3840c576fe776 [file] [log] [blame]
// Copyright 2021 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 SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_PLATFORM_RCU_H_
#define SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_PLATFORM_RCU_H_
#include "third_party/iwlwifi/platform/compiler.h"
#if defined(__cplusplus)
extern "C" {
#endif // defined(__cplusplus)
struct device;
typedef void (*iwl_rcu_call_func)(void*);
// Enter a RCU read-side lock. May be nested.
void iwl_rcu_read_lock(struct device* dev);
// Exit a RCU read-side lock. May be nested.
void iwl_rcu_read_unlock(struct device* dev);
// Wait for all existing read-side locks to unlock.
void iwl_rcu_sync(struct device* dev);
// Call a function after synchronizing with existing read-side locks.
void iwl_rcu_call_sync(struct device* dev, iwl_rcu_call_func func, void* data);
// Free an allocation after synchronizing with existing read-side locks.
void iwl_rcu_free_sync(struct device* dev, void* alloc);
#define iwl_rcu_load(p) (atomic_load_explicit((_Atomic(__typeof(p))*)&p, memory_order_acquire))
#define iwl_rcu_store(p, v) \
(atomic_store_explicit((_Atomic(__typeof(p))*)&p, v, memory_order_release))
#define iwl_rcu_exchange(p, v) \
(atomic_exchange_explicit((_Atomic(__typeof(p))*)&p, v, memory_order_acq_rel))
#if defined(__cplusplus)
} // extern "C"
#endif // defined(__cplusplus)
#endif // SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_PLATFORM_RCU_H_