1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2 /******************************************************************************
4 * Module Name: utlock - Reader/Writer lock interfaces
6 * Copyright (C) 2000 - 2019, Intel Corp.
8 *****************************************************************************/
10 #include <acpi/acpi.h>
13 #define _COMPONENT ACPI_UTILITIES
14 ACPI_MODULE_NAME("utlock")
16 /*******************************************************************************
18 * FUNCTION: acpi_ut_create_rw_lock
19 * acpi_ut_delete_rw_lock
21 * PARAMETERS: lock - Pointer to a valid RW lock
25 * DESCRIPTION: Reader/writer lock creation and deletion interfaces.
27 ******************************************************************************/
28 acpi_status
acpi_ut_create_rw_lock(struct acpi_rw_lock
*lock
)
32 lock
->num_readers
= 0;
33 status
= acpi_os_create_mutex(&lock
->reader_mutex
);
34 if (ACPI_FAILURE(status
)) {
38 status
= acpi_os_create_mutex(&lock
->writer_mutex
);
42 void acpi_ut_delete_rw_lock(struct acpi_rw_lock
*lock
)
45 acpi_os_delete_mutex(lock
->reader_mutex
);
46 acpi_os_delete_mutex(lock
->writer_mutex
);
48 lock
->num_readers
= 0;
49 lock
->reader_mutex
= NULL
;
50 lock
->writer_mutex
= NULL
;
53 /*******************************************************************************
55 * FUNCTION: acpi_ut_acquire_read_lock
56 * acpi_ut_release_read_lock
58 * PARAMETERS: lock - Pointer to a valid RW lock
62 * DESCRIPTION: Reader interfaces for reader/writer locks. On acquisition,
63 * only the first reader acquires the write mutex. On release,
64 * only the last reader releases the write mutex. Although this
65 * algorithm can in theory starve writers, this should not be a
66 * problem with ACPICA since the subsystem is infrequently used
67 * in comparison to (for example) an I/O system.
69 ******************************************************************************/
71 acpi_status
acpi_ut_acquire_read_lock(struct acpi_rw_lock
*lock
)
75 status
= acpi_os_acquire_mutex(lock
->reader_mutex
, ACPI_WAIT_FOREVER
);
76 if (ACPI_FAILURE(status
)) {
80 /* Acquire the write lock only for the first reader */
83 if (lock
->num_readers
== 1) {
85 acpi_os_acquire_mutex(lock
->writer_mutex
,
89 acpi_os_release_mutex(lock
->reader_mutex
);
93 acpi_status
acpi_ut_release_read_lock(struct acpi_rw_lock
*lock
)
97 status
= acpi_os_acquire_mutex(lock
->reader_mutex
, ACPI_WAIT_FOREVER
);
98 if (ACPI_FAILURE(status
)) {
102 /* Release the write lock only for the very last reader */
105 if (lock
->num_readers
== 0) {
106 acpi_os_release_mutex(lock
->writer_mutex
);
109 acpi_os_release_mutex(lock
->reader_mutex
);
113 /*******************************************************************************
115 * FUNCTION: acpi_ut_acquire_write_lock
116 * acpi_ut_release_write_lock
118 * PARAMETERS: lock - Pointer to a valid RW lock
122 * DESCRIPTION: Writer interfaces for reader/writer locks. Simply acquire or
123 * release the writer mutex associated with the lock. Acquisition
124 * of the lock is fully exclusive and will block all readers and
125 * writers until it is released.
127 ******************************************************************************/
129 acpi_status
acpi_ut_acquire_write_lock(struct acpi_rw_lock
*lock
)
133 status
= acpi_os_acquire_mutex(lock
->writer_mutex
, ACPI_WAIT_FOREVER
);
137 void acpi_ut_release_write_lock(struct acpi_rw_lock
*lock
)
140 acpi_os_release_mutex(lock
->writer_mutex
);