critical_enter(9)
NAME
- critical_enter, critical_exit - enter and exit a critical
- region
SYNOPSIS
#include <sys/param.h>
#include <sys/systm.h>
void
critical_enter(void);
void
critical_exit(void);
DESCRIPTION
- These functions are used to prevent preemption in a critical
- region of
code. All that is guaranteed is that the thread currently
- executing on a
CPU will not be preempted. Specifically, a thread in a
- critical region
will not migrate to another CPU while it is in a critical
- region. The
current CPU may still trigger faults and exceptions during a
- critical
section; however, these faults are usually fatal.
- The critical_enter() and critical_exit() functions manage a
- per-thread
counter to handle nested critical sections. If a thread is
- made runnable
that would normally preempt the current thread while the
- current thread
is in a critical section, then the preemption will be de
- ferred until the
current thread exits the outermost critical section.
- Note that these functions are not required to provide any
- inter-CPU synchronization, data protection, or memory ordering guarantees
- and thus
should not be used to protect shared data structures.
- These functions should be used with care as an infinite loop
- within a
critical region will deadlock the CPU. Also, they should
- not be interlocked with operations on mutexes, sx locks, semaphores, or
- other synchronization primitives. One exception to this is that spin
- mutexes
include a critical section, so in certain cases critical
- sections may be
interlocked with spin mutexes.
HISTORY
- These functions were introduced in FreeBSD 5.0.
- BSD October 5, 2005