The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/bsd/sys/lock.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Copyright (c) 2000-2002 Apple Computer, Inc. All rights reserved.
    3  *
    4  * @APPLE_LICENSE_HEADER_START@
    5  * 
    6  * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
    7  * 
    8  * This file contains Original Code and/or Modifications of Original Code
    9  * as defined in and that are subject to the Apple Public Source License
   10  * Version 2.0 (the 'License'). You may not use this file except in
   11  * compliance with the License. Please obtain a copy of the License at
   12  * http://www.opensource.apple.com/apsl/ and read it before using this
   13  * file.
   14  * 
   15  * The Original Code and all software distributed under the License are
   16  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
   17  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
   18  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
   19  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
   20  * Please see the License for the specific language governing rights and
   21  * limitations under the License.
   22  * 
   23  * @APPLE_LICENSE_HEADER_END@
   24  */
   25 /* Copyright (c) 1995, 1997 Apple Computer, Inc. All Rights Reserved */
   26 /* 
   27  * Copyright (c) 1995
   28  *      The Regents of the University of California.  All rights reserved.
   29  *
   30  * This code contains ideas from software contributed to Berkeley by
   31  * Avadis Tevanian, Jr., Michael Wayne Young, and the Mach Operating
   32  * System project at Carnegie-Mellon University.
   33  *
   34  * Redistribution and use in source and binary forms, with or without
   35  * modification, are permitted provided that the following conditions
   36  * are met:
   37  * 1. Redistributions of source code must retain the above copyright
   38  *    notice, this list of conditions and the following disclaimer.
   39  * 2. Redistributions in binary form must reproduce the above copyright
   40  *    notice, this list of conditions and the following disclaimer in the
   41  *    documentation and/or other materials provided with the distribution.
   42  * 3. All advertising materials mentioning features or use of this software
   43  *    must display the following acknowledgement:
   44  *      This product includes software developed by the University of
   45  *      California, Berkeley and its contributors.
   46  * 4. Neither the name of the University nor the names of its contributors
   47  *    may be used to endorse or promote products derived from this software
   48  *    without specific prior written permission.
   49  *
   50  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   51  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   52  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   53  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   54  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   55  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   56  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   57  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   58  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   59  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   60  * SUCH DAMAGE.
   61  *
   62  *      @(#)lock.h      8.12 (Berkeley) 5/19/95
   63  */
   64 
   65 #ifndef _SYS_LOCK_H_
   66 #define _SYS_LOCK_H_
   67 
   68 #include <sys/appleapiopts.h>
   69 
   70 #ifdef KERNEL
   71 #ifdef __APPLE_API_UNSTABLE
   72 #include <kern/simple_lock.h>
   73 #include <kern/simple_lock_types.h>
   74 
   75 #if defined(simple_lock_init)
   76 #undef simple_lock_init
   77 #endif
   78 #define simple_lock_init(l)     usimple_lock_init((l),0)
   79 
   80 #if defined(simple_lock)
   81 #undef simple_lock
   82 #endif
   83 #define simple_lock(l)         ((void) 1)
   84 
   85 #if defined(simple_unlock)
   86 #undef simple_unlock
   87 #endif
   88 #define simple_unlock(l)        ((void) 1)
   89 
   90 #if defined(simple_lock_try)
   91 #undef simple_lock_try
   92 #endif
   93 #define simple_lock_try(l)      1
   94 
   95 #if defined(thread_sleep_simple_lock)
   96 #undef thread_sleep_simple_lock
   97 #endif
   98 #define thread_sleep_simple_lock(l, e, i) thread_sleep_funnel((e), (i))
   99 
  100 #endif /* __APPLE_API_UNSTABLE */
  101 #else /* KERNEL */
  102 
  103 #ifndef _MACHINE_SIMPLE_LOCK_DATA_
  104 #define _MACHINE_SIMPLE_LOCK_DATA_
  105 
  106 #include <mach/boolean.h>
  107 
  108 struct slock{
  109         volatile unsigned int lock_data[10];
  110 };
  111 typedef struct slock    simple_lock_data_t;
  112 typedef struct slock    *simple_lock_t;
  113 #define decl_simple_lock_data(class,name) \
  114 class   simple_lock_data_t      name;
  115 
  116 #endif  /* _MACHINE_SIMPLE_LOCK_DATA_ */
  117 
  118 #endif /* KERNEL */
  119 
  120 #ifdef __APPLE_API_UNSTABLE
  121 /*
  122  * The general lock structure.  Provides for multiple shared locks,
  123  * upgrading from shared to exclusive, and sleeping until the lock
  124  * can be gained. The simple locks are defined in <machine/param.h>.
  125  */
  126 struct lock__bsd__ {
  127         simple_lock_data_t
  128                 lk_interlock;           /* lock on remaining fields */
  129         u_int   lk_flags;               /* see below */
  130         int     lk_sharecount;          /* # of accepted shared locks */
  131         int     lk_waitcount;           /* # of processes sleeping for lock */
  132         short   lk_exclusivecount;      /* # of recursive exclusive locks */
  133         short   lk_prio;                /* priority at which to sleep */
  134         char    *lk_wmesg;              /* resource sleeping (for tsleep) */
  135         int     lk_timo;                /* maximum sleep time (for tsleep) */
  136         pid_t   lk_lockholder;          /* pid of exclusive lock holder */
  137         void    *lk_lockthread;         /* thread which acquired excl lock */
  138 };
  139 /*
  140  * Lock request types:
  141  *   LK_SHARED - get one of many possible shared locks. If a process
  142  *      holding an exclusive lock requests a shared lock, the exclusive
  143  *      lock(s) will be downgraded to shared locks.
  144  *   LK_EXCLUSIVE - stop further shared locks, when they are cleared,
  145  *      grant a pending upgrade if it exists, then grant an exclusive
  146  *      lock. Only one exclusive lock may exist at a time, except that
  147  *      a process holding an exclusive lock may get additional exclusive
  148  *      locks if it explicitly sets the LK_CANRECURSE flag in the lock
  149  *      request, or if the LK_CANRECUSE flag was set when the lock was
  150  *      initialized.
  151  *   LK_UPGRADE - the process must hold a shared lock that it wants to
  152  *      have upgraded to an exclusive lock. Other processes may get
  153  *      exclusive access to the resource between the time that the upgrade
  154  *      is requested and the time that it is granted.
  155  *   LK_EXCLUPGRADE - the process must hold a shared lock that it wants to
  156  *      have upgraded to an exclusive lock. If the request succeeds, no
  157  *      other processes will have gotten exclusive access to the resource
  158  *      between the time that the upgrade is requested and the time that
  159  *      it is granted. However, if another process has already requested
  160  *      an upgrade, the request will fail (see error returns below).
  161  *   LK_DOWNGRADE - the process must hold an exclusive lock that it wants
  162  *      to have downgraded to a shared lock. If the process holds multiple
  163  *      (recursive) exclusive locks, they will all be downgraded to shared
  164  *      locks.
  165  *   LK_RELEASE - release one instance of a lock.
  166  *   LK_DRAIN - wait for all activity on the lock to end, then mark it
  167  *      decommissioned. This feature is used before freeing a lock that
  168  *      is part of a piece of memory that is about to be freed.
  169  *
  170  * These are flags that are passed to the lockmgr routine.
  171  */
  172 #define LK_TYPE_MASK    0x0000000f      /* type of lock sought */
  173 #define LK_SHARED       0x00000001      /* shared lock */
  174 #define LK_EXCLUSIVE    0x00000002      /* exclusive lock */
  175 #define LK_UPGRADE      0x00000003      /* shared-to-exclusive upgrade */
  176 #define LK_EXCLUPGRADE  0x00000004      /* first shared-to-exclusive upgrade */
  177 #define LK_DOWNGRADE    0x00000005      /* exclusive-to-shared downgrade */
  178 #define LK_RELEASE      0x00000006      /* release any type of lock */
  179 #define LK_DRAIN        0x00000007      /* wait for all lock activity to end */
  180 /*
  181  * External lock flags.
  182  *
  183  * The first three flags may be set in lock_init to set their mode permanently,
  184  * or passed in as arguments to the lock manager. The LK_REENABLE flag may be
  185  * set only at the release of a lock obtained by drain.
  186  */
  187 #define LK_EXTFLG_MASK  0x00000070      /* mask of external flags */
  188 #define LK_NOWAIT       0x00000010      /* do not sleep to await lock */
  189 #define LK_SLEEPFAIL    0x00000020      /* sleep, then return failure */
  190 #define LK_CANRECURSE   0x00000040      /* allow recursive exclusive lock */
  191 #define LK_REENABLE     0x00000080      /* lock is be reenabled after drain */
  192 /*
  193  * Internal lock flags.
  194  *
  195  * These flags are used internally to the lock manager.
  196  */
  197 #define LK_WANT_UPGRADE 0x00000100      /* waiting for share-to-excl upgrade */
  198 #define LK_WANT_EXCL    0x00000200      /* exclusive lock sought */
  199 #define LK_HAVE_EXCL    0x00000400      /* exclusive lock obtained */
  200 #define LK_WAITDRAIN    0x00000800      /* process waiting for lock to drain */
  201 #define LK_DRAINING     0x00004000      /* lock is being drained */
  202 #define LK_DRAINED      0x00008000      /* lock has been decommissioned */
  203 /*
  204  * Control flags
  205  *
  206  * Non-persistent external flags.
  207  */
  208 #define LK_INTERLOCK    0x00010000      /* unlock passed simple lock after
  209                                            getting lk_interlock */
  210 #define LK_RETRY        0x00020000      /* vn_lock: retry until locked */
  211 
  212 /*
  213  * Lock return status.
  214  *
  215  * Successfully obtained locks return 0. Locks will always succeed
  216  * unless one of the following is true:
  217  *      LK_FORCEUPGRADE is requested and some other process has already
  218  *          requested a lock upgrade (returns EBUSY).
  219  *      LK_WAIT is set and a sleep would be required (returns EBUSY).
  220  *      LK_SLEEPFAIL is set and a sleep was done (returns ENOLCK).
  221  *      PCATCH is set in lock priority and a signal arrives (returns
  222  *          either EINTR or ERESTART if system calls is to be restarted).
  223  *      Non-null lock timeout and timeout expires (returns EWOULDBLOCK).
  224  * A failed lock attempt always returns a non-zero error value. No lock
  225  * is held after an error return (in particular, a failed LK_UPGRADE
  226  * or LK_FORCEUPGRADE will have released its shared access lock).
  227  */
  228 
  229 /*
  230  * Indicator that no process holds exclusive lock
  231  */
  232 #define LK_KERNPROC ((pid_t) -2)
  233 #define LK_NOPROC ((pid_t) -1)
  234 
  235 struct proc;
  236 
  237 void    lockinit __P((struct lock__bsd__ *, int prio, char *wmesg, int timo,
  238                         int flags));
  239 int     lockmgr __P((struct lock__bsd__ *, u_int flags,
  240                         simple_lock_t, struct proc *p));
  241 int     lockstatus __P((struct lock__bsd__ *));
  242 
  243 #endif /* __APPLE_API_UNSTABLE */
  244 
  245 #endif  /* _SYS_LOCK_H_ */

Cache object: ad30bb6206afb46f84924c0b82691533


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.