Lines Matching +full:lock +full:- +full:status

1 /*-
4 * Copyright (c) 2007-2009 Jung-uk Kim <jkim@FreeBSD.org>
39 #include <sys/lock.h>
89 snprintf(as->as_name, sizeof(as->as_name), "ACPI sema (%p)", as); in AcpiOsCreateSemaphore()
90 mtx_init(&as->as_lock, as->as_name, NULL, MTX_DEF); in AcpiOsCreateSemaphore()
91 cv_init(&as->as_cv, as->as_name); in AcpiOsCreateSemaphore()
92 as->as_maxunits = MaxUnits; in AcpiOsCreateSemaphore()
93 as->as_units = InitialUnits; in AcpiOsCreateSemaphore()
98 as->as_name, MaxUnits, InitialUnits)); in AcpiOsCreateSemaphore()
113 mtx_lock(&as->as_lock); in AcpiOsDeleteSemaphore()
115 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "delete %s\n", as->as_name)); in AcpiOsDeleteSemaphore()
117 if (as->as_waiters > 0) { in AcpiOsDeleteSemaphore()
120 as->as_name, as->as_units, as->as_waiters)); in AcpiOsDeleteSemaphore()
121 as->as_reset = 1; in AcpiOsDeleteSemaphore()
122 cv_broadcast(&as->as_cv); in AcpiOsDeleteSemaphore()
123 while (as->as_waiters > 0) { in AcpiOsDeleteSemaphore()
124 if (mtx_sleep(&as->as_reset, &as->as_lock, in AcpiOsDeleteSemaphore()
128 as->as_name, as->as_waiters)); in AcpiOsDeleteSemaphore()
129 mtx_unlock(&as->as_lock); in AcpiOsDeleteSemaphore()
134 as->as_name, as->as_units, as->as_waiters)); in AcpiOsDeleteSemaphore()
138 mtx_unlock(&as->as_lock); in AcpiOsDeleteSemaphore()
140 mtx_destroy(&as->as_lock); in AcpiOsDeleteSemaphore()
141 cv_destroy(&as->as_cv); in AcpiOsDeleteSemaphore()
147 #define ACPISEM_AVAIL(s, u) ((s)->as_units >= (u))
154 ACPI_STATUS status = AE_OK; in AcpiOsWaitSemaphore() local
161 mtx_lock(&as->as_lock); in AcpiOsWaitSemaphore()
165 Units, as->as_name, as->as_units, as->as_waiters, Timeout)); in AcpiOsWaitSemaphore()
167 if (as->as_maxunits != ACPI_NO_UNIT_LIMIT && as->as_maxunits < Units) { in AcpiOsWaitSemaphore()
168 mtx_unlock(&as->as_lock); in AcpiOsWaitSemaphore()
175 status = AE_TIME; in AcpiOsWaitSemaphore()
179 as->as_waiters++; in AcpiOsWaitSemaphore()
180 error = cv_wait_sig(&as->as_cv, &as->as_lock); in AcpiOsWaitSemaphore()
181 as->as_waiters--; in AcpiOsWaitSemaphore()
182 if (error == EINTR || as->as_reset) { in AcpiOsWaitSemaphore()
183 status = AE_ERROR; in AcpiOsWaitSemaphore()
196 status = AE_TIME; in AcpiOsWaitSemaphore()
199 Timeout--; in AcpiOsWaitSemaphore()
200 mtx_unlock(&as->as_lock); in AcpiOsWaitSemaphore()
202 mtx_lock(&as->as_lock); in AcpiOsWaitSemaphore()
209 as->as_waiters++; in AcpiOsWaitSemaphore()
210 error = cv_timedwait_sig(&as->as_cv, &as->as_lock, tmo); in AcpiOsWaitSemaphore()
211 as->as_waiters--; in AcpiOsWaitSemaphore()
212 if (error == EINTR || as->as_reset) { in AcpiOsWaitSemaphore()
213 status = AE_ERROR; in AcpiOsWaitSemaphore()
218 slptick = ticks - prevtick; in AcpiOsWaitSemaphore()
220 status = AE_TIME; in AcpiOsWaitSemaphore()
223 tmo -= slptick; in AcpiOsWaitSemaphore()
226 if (ACPI_SUCCESS(status)) in AcpiOsWaitSemaphore()
227 as->as_units -= Units; in AcpiOsWaitSemaphore()
229 mtx_unlock(&as->as_lock); in AcpiOsWaitSemaphore()
231 return_ACPI_STATUS (status); in AcpiOsWaitSemaphore()
245 mtx_lock(&as->as_lock); in AcpiOsSignalSemaphore()
249 Units, as->as_name, as->as_units, as->as_waiters)); in AcpiOsSignalSemaphore()
251 if (as->as_maxunits != ACPI_NO_UNIT_LIMIT && in AcpiOsSignalSemaphore()
252 (as->as_maxunits < Units || in AcpiOsSignalSemaphore()
253 as->as_maxunits - Units < as->as_units)) { in AcpiOsSignalSemaphore()
255 "exceeded max units %u\n", as->as_maxunits)); in AcpiOsSignalSemaphore()
256 mtx_unlock(&as->as_lock); in AcpiOsSignalSemaphore()
260 as->as_units += Units; in AcpiOsSignalSemaphore()
261 if (as->as_waiters > 0 && ACPISEM_AVAIL(as, Units)) in AcpiOsSignalSemaphore()
263 cv_signal(&as->as_cv); in AcpiOsSignalSemaphore()
265 mtx_unlock(&as->as_lock); in AcpiOsSignalSemaphore()
297 snprintf(am->am_name, sizeof(am->am_name), "ACPI mutex (%p)", am); in AcpiOsCreateMutex()
298 mtx_init(&am->am_lock, am->am_name, NULL, MTX_DEF); in AcpiOsCreateMutex()
300 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "created %s\n", am->am_name)); in AcpiOsCreateMutex()
307 #define ACPIMTX_AVAIL(m) ((m)->am_owner == NULL)
308 #define ACPIMTX_OWNED(m) ((m)->am_owner == curthread)
322 mtx_lock(&am->am_lock); in AcpiOsDeleteMutex()
324 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "delete %s\n", am->am_name)); in AcpiOsDeleteMutex()
326 if (am->am_waiters > 0) { in AcpiOsDeleteMutex()
328 "reset %s, owner %p\n", am->am_name, am->am_owner)); in AcpiOsDeleteMutex()
329 am->am_reset = 1; in AcpiOsDeleteMutex()
331 while (am->am_waiters > 0) { in AcpiOsDeleteMutex()
332 if (mtx_sleep(&am->am_reset, &am->am_lock, in AcpiOsDeleteMutex()
336 am->am_name, am->am_waiters)); in AcpiOsDeleteMutex()
337 mtx_unlock(&am->am_lock); in AcpiOsDeleteMutex()
343 am->am_name, am->am_waiters)); in AcpiOsDeleteMutex()
347 am->am_name, am->am_owner, am->am_waiters)); in AcpiOsDeleteMutex()
351 mtx_unlock(&am->am_lock); in AcpiOsDeleteMutex()
353 mtx_destroy(&am->am_lock); in AcpiOsDeleteMutex()
362 ACPI_STATUS status = AE_OK; in AcpiOsAcquireMutex() local
369 mtx_lock(&am->am_lock); in AcpiOsAcquireMutex()
371 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "acquire %s\n", am->am_name)); in AcpiOsAcquireMutex()
374 am->am_nested++; in AcpiOsAcquireMutex()
377 am->am_name, am->am_nested)); in AcpiOsAcquireMutex()
378 mtx_unlock(&am->am_lock); in AcpiOsAcquireMutex()
385 status = AE_TIME; in AcpiOsAcquireMutex()
389 am->am_waiters++; in AcpiOsAcquireMutex()
390 error = mtx_sleep(am, &am->am_lock, PCATCH, "acmtx", 0); in AcpiOsAcquireMutex()
391 am->am_waiters--; in AcpiOsAcquireMutex()
392 if (error == EINTR || am->am_reset) { in AcpiOsAcquireMutex()
393 status = AE_ERROR; in AcpiOsAcquireMutex()
406 status = AE_TIME; in AcpiOsAcquireMutex()
409 Timeout--; in AcpiOsAcquireMutex()
410 mtx_unlock(&am->am_lock); in AcpiOsAcquireMutex()
412 mtx_lock(&am->am_lock); in AcpiOsAcquireMutex()
419 am->am_waiters++; in AcpiOsAcquireMutex()
420 error = mtx_sleep(am, &am->am_lock, PCATCH, in AcpiOsAcquireMutex()
422 am->am_waiters--; in AcpiOsAcquireMutex()
423 if (error == EINTR || am->am_reset) { in AcpiOsAcquireMutex()
424 status = AE_ERROR; in AcpiOsAcquireMutex()
429 slptick = ticks - prevtick; in AcpiOsAcquireMutex()
431 status = AE_TIME; in AcpiOsAcquireMutex()
434 tmo -= slptick; in AcpiOsAcquireMutex()
437 if (ACPI_SUCCESS(status)) in AcpiOsAcquireMutex()
438 am->am_owner = curthread; in AcpiOsAcquireMutex()
440 mtx_unlock(&am->am_lock); in AcpiOsAcquireMutex()
442 return_ACPI_STATUS (status); in AcpiOsAcquireMutex()
458 mtx_lock(&am->am_lock); in AcpiOsReleaseMutex()
460 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "release %s\n", am->am_name)); in AcpiOsReleaseMutex()
463 if (am->am_nested > 0) { in AcpiOsReleaseMutex()
466 am->am_name, am->am_nested)); in AcpiOsReleaseMutex()
467 am->am_nested--; in AcpiOsReleaseMutex()
469 am->am_owner = NULL; in AcpiOsReleaseMutex()
473 "release already available %s\n", am->am_name)); in AcpiOsReleaseMutex()
477 am->am_name, am->am_owner, am->am_nested)); in AcpiOsReleaseMutex()
479 if (am->am_waiters > 0 && ACPIMTX_AVAIL(am)) in AcpiOsReleaseMutex()
482 mtx_unlock(&am->am_lock); in AcpiOsReleaseMutex()
512 snprintf(al->al_name, sizeof(al->al_name), "ACPI lock (GPE)"); in AcpiOsCreateLock()
514 snprintf(al->al_name, sizeof(al->al_name), "ACPI lock (HW)"); in AcpiOsCreateLock()
517 snprintf(al->al_name, sizeof(al->al_name), "ACPI lock (%p)", al); in AcpiOsCreateLock()
518 mtx_init(&al->al_lock, al->al_name, NULL, MTX_SPIN); in AcpiOsCreateLock()
520 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "created %s\n", al->al_name)); in AcpiOsCreateLock()
540 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "delete %s\n", al->al_name)); in AcpiOsDeleteLock()
542 mtx_destroy(&al->al_lock); in AcpiOsDeleteLock()
559 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "acquire %s\n", al->al_name)); in AcpiOsAcquireLock()
561 if (mtx_owned(&al->al_lock)) { in AcpiOsAcquireLock()
562 al->al_nested++; in AcpiOsAcquireLock()
565 al->al_name, al->al_nested)); in AcpiOsAcquireLock()
567 mtx_lock_spin(&al->al_lock); in AcpiOsAcquireLock()
585 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "release %s\n", al->al_name)); in AcpiOsReleaseLock()
587 if (mtx_owned(&al->al_lock)) { in AcpiOsReleaseLock()
588 if (al->al_nested > 0) { in AcpiOsReleaseLock()
591 al->al_name, al->al_nested)); in AcpiOsReleaseLock()
592 al->al_nested--; in AcpiOsReleaseLock()
594 mtx_unlock_spin(&al->al_lock); in AcpiOsReleaseLock()
597 "cannot release unowned %s\n", al->al_name)); in AcpiOsReleaseLock()
600 /* Section 5.2.10.1: global lock acquire/release functions */
603 * Acquire the global lock. If busy, set the pending bit. The caller
604 * will wait for notification from the BIOS that the lock is available
608 acpi_acquire_global_lock(volatile uint32_t *lock) in acpi_acquire_global_lock() argument
613 old = *lock; in acpi_acquire_global_lock()
617 } while (atomic_cmpset_32(lock, old, new) == 0); in acpi_acquire_global_lock()
623 * Release the global lock, returning whether there is a waiter pending.
625 * releases the lock.
628 acpi_release_global_lock(volatile uint32_t *lock) in acpi_release_global_lock() argument
633 old = *lock; in acpi_release_global_lock()
635 } while (atomic_cmpset_32(lock, old, new) == 0); in acpi_release_global_lock()