xref: /xnu-8020.101.4/osfmk/kern/lock_attr.h (revision e7776783b89a353188416a9a346c6cdb4928faad)
1 /*
2  * Copyright (c) 2021 Apple Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 
29 #ifndef _KERN_LOCK_ATTR_H_
30 #define _KERN_LOCK_ATTR_H_
31 
32 #include <kern/lock_types.h>
33 
34 __BEGIN_DECLS
35 
36 #ifdef  XNU_KERNEL_PRIVATE
37 typedef struct _lck_attr_ {
38 	unsigned int    lck_attr_val;
39 } lck_attr_t;
40 
41 extern lck_attr_t      LockDefaultLckAttr;
42 
43 #define LCK_ATTR_NONE                   0
44 #define LCK_ATTR_DEBUG                  0x00000001
45 #define LCK_ATTR_RW_SHARED_PRIORITY     0x00010000
46 #else /* !XNU_KERNEL_PRIVATE */
47 typedef struct __lck_attr__ lck_attr_t;
48 #endif /* !XNU_KERNEL_PRIVATE */
49 
50 #define LCK_ATTR_NULL ((lck_attr_t *)NULL)
51 
52 extern  lck_attr_t      *lck_attr_alloc_init(void);
53 
54 extern  void            lck_attr_setdefault(
55 	lck_attr_t              *attr);
56 
57 extern  void            lck_attr_setdebug(
58 	lck_attr_t              *attr);
59 
60 extern  void            lck_attr_cleardebug(
61 	lck_attr_t              *attr);
62 
63 extern  void            lck_attr_free(
64 	lck_attr_t              *attr);
65 
66 #ifdef  XNU_KERNEL_PRIVATE
67 /*!
68  * @function lck_attr_rw_shared_priority
69  *
70  * @abstract
71  * Changes the rw lock behaviour by setting reader priority over writer.
72  *
73  * @discussion
74  * The attribute needs to be set before calling lck_rw_init().
75  * This attribute changes the locking behaviour by possibly starving the writers.
76  * Readers will always be able to lock the lock as long as a writer is not holding it.
77  * This attribute was added to allow recursive locking in shared mode.
78  *
79  * @param attr	attr to modify
80  */
81 extern  void            lck_attr_rw_shared_priority(
82 	lck_attr_t              *attr);
83 #endif /* XNU_KERNEL_PRIVATE */
84 
85 __END_DECLS
86 
87 #endif /* _KERN_LOCK_ATTR_H_ */
88