diff options
author | Richard Braun <rbraun@sceen.net> | 2017-07-21 00:54:31 +0200 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2017-07-21 00:54:54 +0200 |
commit | 4c0dcbeb7d363918c9a4a75faf3f1912f580f9c1 (patch) | |
tree | 6fdb4a1b80d4aa51bbafda6f930f9f222adc4368 /kern/sleepq.c | |
parent | adcae3076edee5ed24cb06f4328f88cfa5e8998a (diff) | |
parent | 5c2cf8fff7a1d6dc6b88615df5433ddccbbcf51f (diff) |
Merge branch 'adaptive_spinning'
Diffstat (limited to 'kern/sleepq.c')
-rw-r--r-- | kern/sleepq.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/kern/sleepq.c b/kern/sleepq.c index cc85705..44ad996 100644 --- a/kern/sleepq.c +++ b/kern/sleepq.c @@ -267,6 +267,33 @@ sleepq_acquire(const void *sync_obj, bool condition, unsigned long *flags) return sleepq; } +struct sleepq * +sleepq_tryacquire(const void *sync_obj, bool condition, unsigned long *flags) +{ + struct sleepq_bucket *bucket; + struct sleepq *sleepq; + int error; + + assert(sync_obj != NULL); + + bucket = sleepq_bucket_get(sync_obj, condition); + + error = spinlock_trylock_intr_save(&bucket->lock, flags); + + if (error) { + return NULL; + } + + sleepq = sleepq_bucket_lookup(bucket, sync_obj); + + if (sleepq == NULL) { + spinlock_unlock_intr_restore(&bucket->lock, *flags); + return NULL; + } + + return sleepq; +} + void sleepq_release(struct sleepq *sleepq, unsigned long flags) { |