MEMBAR(9) | Kernel Developer's Manual | MEMBAR(9)

# NAME

`membar_enter`, `membar_exit`, `membar_producer`, `membar_consumer`, `membar_sync`, `membar_enter_after_atomic`, `membar_exit_before_atomic` — memory access barrier operations

# SYNOPSIS

`#include <sys/atomic.h>`

void
`membar_enter`(void);

void
`membar_exit`(void);

void
`membar_producer`(void);

void
`membar_consumer`(void);

void
`membar_sync`(void);

void
`membar_enter_after_atomic`(void);

void
`membar_exit_before_atomic`(void);

# DESCRIPTION

The membar set of functions provide an interface for issuing memory barrier access operations with respect to multiple processors in the system.

`membar_enter`()
  Any store preceding `membar_enter`() will reach global visibility before all loads and stores following it.

  `membar_enter`() is typically used in code that implements locking primitives to ensure that a lock protects its data.

`membar_exit`()
  All loads and stores preceding `membar_exit`() will reach global visibility before any store that follows it.

  `membar_exit`() is typically used in code that implements locking primitives to ensure that a lock protects its data.

`membar_producer`()
  All stores preceding the memory barrier will reach global visibility before any stores after the memory barrier reach global visibility.
`membar_consumer`()
  All loads preceding the memory barrier will complete before any loads after the memory barrier complete.
`membar_sync`()
  All loads and stores preceding the memory barrier will complete and reach global visibility before any loads and stores after the memory barrier complete and reach global visibility.
`membar_enter_after_atomic`()
  An atomic operation preceding `membar_enter_after_atomic`() will reach global visibility before all loads and stores following it. The atomic operation is used to protect the start of a critical section.
`membar_exit_before_atomic`()
  All loads and stores preceding `membar_exit_before_atomic`() will reach global visibility before atomic operation that follows it. The atomic operation is used to protect the end of a critical section.

The atomic operations that can be used with `membar_enter_after_atomic`() and `membar_exit_before_atomic`() are the atomic_add, atomic_sub, atomic_inc, atomic_dec, and atomic_cas set of functions. For other cases use `membar_enter`() or `membar_exit`().

# CONTEXT

`membar_enter`(), `membar_exit`(), `membar_producer`(), `membar_consumer`(), `membar_sync`(), `membar_enter_after_atomic`(), `membar_exit_before_atomic`() can all be called during autoconf, from process context, or from interrupt context.

# HISTORY

The membar functions first appeared in NetBSD 5.0 and OpenBSD 5.5.

March 13, 2022 | Debian