ddi_enter_critical(9F)




NAME

     ddi_enter_critical, ddi_exit_critical -  enter  and  exit  a
     critical region of control


SYNOPSIS

     #include <sys/conf.h>
     #include <sys/ddi.h>
     #include <sys/sunddi.h>

     unsigned int ddi_enter_critical(void);

     void ddi_exit_critical(unsignedint ddic);


INTERFACE LEVEL

     Solaris DDI specific (Solaris DDI).


PARAMETERS

     ddic  The    returned    value    from    the    call     to
           ddi_enter_critical()     must     be     passed     to
           ddi_exit_critical().


DESCRIPTION

     Nearly all driver operations can be done without any special
     synchronization  and protection mechanisms beyond those pro-
     vided by, for example, mutexes (see mutex(9F)). However, for
     certain devices there can exist a very short critical region
     of code which must be  allowed  to  run  uninterrupted.  The
     function  ddi_enter_critical() provides a mechanism by which
     a driver can ask the system to guarantee to the best of  its
     ability that the current thread of execution will neither be
     preempted nor interrupted. This  stays  in  effect  until  a
     bracketing  call  to  ddi_exit_critical()  is  made (with an
     argument    which    was    the    returned    value    from
     ddi_enter_critical()).

     The driver may not call any functions external to itself  in
     between  the time it calls ddi_enter_critical() and the time
     it calls ddi_exit_critical().


RETURN VALUES

     ddi_enter_critical()  returns  an  opaque  unsigned  integer
     which   must   be   used   in   the   subsequent   call   to
     ddi_exit_critical().


CONTEXT

     This function can be called from user or interrupt context.


WARNINGS

     Driver writers should note that in a multiple processor sys-
     tem   this  function does not temporarily suspend other pro-
     cessors from executing. This function also cannot  guarantee
     to  actually  block  the  hardware from doing such things as
     interrupt acknowledge cycles. What it can  do  is  guarantee
     that the currently executing thread will not be preempted.

     Do not write code   bracketed  by  ddi_enter_critical()  and
     ddi_exit_critical() that can get caught in an infinite loop,
     as the machine may crash if you do.


SEE ALSO

     mutex(9F)

     Writing Device Drivers


Man(1) output converted with man2html