summaryrefslogtreecommitdiff
path: root/kern/sleepq.c
diff options
context:
space:
mode:
authorRichard Braun <rbraun@sceen.net>2017-07-21 00:54:31 +0200
committerRichard Braun <rbraun@sceen.net>2017-07-21 00:54:54 +0200
commit4c0dcbeb7d363918c9a4a75faf3f1912f580f9c1 (patch)
tree6fdb4a1b80d4aa51bbafda6f930f9f222adc4368 /kern/sleepq.c
parentadcae3076edee5ed24cb06f4328f88cfa5e8998a (diff)
parent5c2cf8fff7a1d6dc6b88615df5433ddccbbcf51f (diff)
Merge branch 'adaptive_spinning'
Diffstat (limited to 'kern/sleepq.c')
-rw-r--r--kern/sleepq.c27
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)
{