CRITICAL_ENTER(9) FreeBSD Kernel Developer's Manual 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 deferred until the
current thread exits the outermost critical section.
Note that these functions are not required to provide any inter-CPU syn-
chronization, 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 inter-
locked with operations on mutexes, sx locks, semaphores, or other syn-
chronization 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.
FreeBSD 7.2 October 5, 2005 FreeBSD 7.2
NAME - SYNOPSIS - DESCRIPTION - HISTORY -
|