0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <acpi/acpi.h>
0011 #include "accommon.h"
0012
0013 #define _COMPONENT ACPI_UTILITIES
0014 ACPI_MODULE_NAME("utlock")
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 acpi_status acpi_ut_create_rw_lock(struct acpi_rw_lock *lock)
0029 {
0030 acpi_status status;
0031
0032 lock->num_readers = 0;
0033 status = acpi_os_create_mutex(&lock->reader_mutex);
0034 if (ACPI_FAILURE(status)) {
0035 return (status);
0036 }
0037
0038 status = acpi_os_create_mutex(&lock->writer_mutex);
0039 return (status);
0040 }
0041
0042 void acpi_ut_delete_rw_lock(struct acpi_rw_lock *lock)
0043 {
0044
0045 acpi_os_delete_mutex(lock->reader_mutex);
0046 acpi_os_delete_mutex(lock->writer_mutex);
0047
0048 lock->num_readers = 0;
0049 lock->reader_mutex = NULL;
0050 lock->writer_mutex = NULL;
0051 }
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071 acpi_status acpi_ut_acquire_read_lock(struct acpi_rw_lock *lock)
0072 {
0073 acpi_status status;
0074
0075 status = acpi_os_acquire_mutex(lock->reader_mutex, ACPI_WAIT_FOREVER);
0076 if (ACPI_FAILURE(status)) {
0077 return (status);
0078 }
0079
0080
0081
0082 lock->num_readers++;
0083 if (lock->num_readers == 1) {
0084 status =
0085 acpi_os_acquire_mutex(lock->writer_mutex,
0086 ACPI_WAIT_FOREVER);
0087 }
0088
0089 acpi_os_release_mutex(lock->reader_mutex);
0090 return (status);
0091 }
0092
0093 acpi_status acpi_ut_release_read_lock(struct acpi_rw_lock *lock)
0094 {
0095 acpi_status status;
0096
0097 status = acpi_os_acquire_mutex(lock->reader_mutex, ACPI_WAIT_FOREVER);
0098 if (ACPI_FAILURE(status)) {
0099 return (status);
0100 }
0101
0102
0103
0104 lock->num_readers--;
0105 if (lock->num_readers == 0) {
0106 acpi_os_release_mutex(lock->writer_mutex);
0107 }
0108
0109 acpi_os_release_mutex(lock->reader_mutex);
0110 return (status);
0111 }
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129 acpi_status acpi_ut_acquire_write_lock(struct acpi_rw_lock *lock)
0130 {
0131 acpi_status status;
0132
0133 status = acpi_os_acquire_mutex(lock->writer_mutex, ACPI_WAIT_FOREVER);
0134 return (status);
0135 }
0136
0137 void acpi_ut_release_write_lock(struct acpi_rw_lock *lock)
0138 {
0139
0140 acpi_os_release_mutex(lock->writer_mutex);
0141 }