Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset ffe4a87 in mainline


Ignore:
Timestamp:
2010-05-25T22:15:03Z (11 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master
Children:
e805e2f
Parents:
d7da4284
Message:

Add interfaces for testing the status of plain spinlocks and the IRQ spinlocks.

Note that because of the non-SMP version of spinlocks, the status must be
checked only in the affirmative manner. Instead of:

ASSERT(!spinlock_locked(…));


one needs to do:

ASSERT(spinlock_unlocked(…));

Otherwise the assertion will be hit on debug non-SMP kernels.

Location:
kernel/generic
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/include/synch/spinlock.h

    rd7da4284 rffe4a87  
    115115extern void spinlock_lock_debug(spinlock_t *);
    116116extern void spinlock_unlock_debug(spinlock_t *);
     117extern bool spinlock_locked(spinlock_t *);
     118extern bool spinlock_unlocked(spinlock_t *);
    117119
    118120/** Unlock spinlock
     
    177179#define spinlock_trylock(lock)  (preemption_disable(), 1)
    178180#define spinlock_unlock(lock)   preemption_enable()
     181#define spinlock_locked(lock)   1
     182#define spinlock_unlocked(lock) 1
    179183
    180184#define DEADLOCK_PROBE_INIT(pname)
     
    283287extern void irq_spinlock_pass(irq_spinlock_t *, irq_spinlock_t *);
    284288extern void irq_spinlock_exchange(irq_spinlock_t *, irq_spinlock_t *);
     289extern bool irq_spinlock_locked(irq_spinlock_t *);
     290extern bool irq_spinlock_unlocked(irq_spinlock_t *);
    285291
    286292#endif
  • kernel/generic/src/synch/spinlock.c

    rd7da4284 rffe4a87  
    128128void spinlock_unlock_debug(spinlock_t *lock)
    129129{
    130         ASSERT_SPINLOCK(atomic_get(&lock->val) != 0, lock);
     130        ASSERT_SPINLOCK(spinlock_locked(lock), lock);
    131131       
    132132        /*
     
    165165       
    166166        return rc;
     167}
     168
     169/** Find out whether the spinlock is currently locked.
     170 *
     171 * @param lock          Spinlock.
     172 * @return              True if the spinlock is locked, false otherwise.
     173 */
     174bool spinlock_locked(spinlock_t *lock)
     175{
     176        return atomic_get(&lock->val) != 0;
     177}
     178
     179/** Find out whether the spinlock is currently unlocked.
     180 *
     181 * @param lock          Spinlock.
     182 * @return              True if the spinlock is not locked, false otherwise.
     183 */
     184bool spinlock_unlocked(spinlock_t *lock)
     185{
     186        return atomic_get(&lock->val) == 0;
    167187}
    168188
     
    314334}
    315335
     336/** Find out whether the IRQ spinlock is currently locked.
     337 *
     338 * @param lock          IRQ spinlock.
     339 * @return              True if the IRQ spinlock is locked, false otherwise.
     340 */
     341bool irq_spinlock_locked(irq_spinlock_t *ilock)
     342{
     343        return spinlock_locked(&ilock->lock);
     344}
     345
     346/** Find out whether the IRQ spinlock is currently unlocked.
     347 *
     348 * @param lock          IRQ spinlock.
     349 * @return              True if the IRQ spinlock is not locked, false otherwise.
     350 */
     351bool irq_spinlock_unlocked(irq_spinlock_t *ilock)
     352{
     353        return spinlock_unlocked(&ilock->lock);
     354}
     355
    316356/** @}
    317357 */
Note: See TracChangeset for help on using the changeset viewer.