|
@@ -843,7 +843,7 @@ static inline void cglock_init(cglock_t *lock)
|
|
|
rwlock_init(&lock->rwlock);
|
|
rwlock_init(&lock->rwlock);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* Read lock variant of cglock */
|
|
|
|
|
|
|
+/* Read lock variant of cglock. Cannot be promoted. */
|
|
|
static inline void cg_rlock(cglock_t *lock)
|
|
static inline void cg_rlock(cglock_t *lock)
|
|
|
{
|
|
{
|
|
|
mutex_lock(&lock->mutex);
|
|
mutex_lock(&lock->mutex);
|
|
@@ -851,7 +851,8 @@ static inline void cg_rlock(cglock_t *lock)
|
|
|
mutex_unlock_noyield(&lock->mutex);
|
|
mutex_unlock_noyield(&lock->mutex);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* Intermediate variant of cglock */
|
|
|
|
|
|
|
+/* Intermediate variant of cglock - behaves as a read lock but can be promoted
|
|
|
|
|
+ * to a write lock or demoted to read lock. */
|
|
|
static inline void cg_ilock(cglock_t *lock)
|
|
static inline void cg_ilock(cglock_t *lock)
|
|
|
{
|
|
{
|
|
|
mutex_lock(&lock->mutex);
|
|
mutex_lock(&lock->mutex);
|
|
@@ -878,6 +879,12 @@ static inline void cg_dwlock(cglock_t *lock)
|
|
|
mutex_unlock_noyield(&lock->mutex);
|
|
mutex_unlock_noyield(&lock->mutex);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/* Demote a write variant to an intermediate variant */
|
|
|
|
|
+static inline void cg_dwilock(cglock_t *lock)
|
|
|
|
|
+{
|
|
|
|
|
+ wr_unlock(&lock->rwlock);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
/* Downgrade intermediate variant to a read lock */
|
|
/* Downgrade intermediate variant to a read lock */
|
|
|
static inline void cg_dlock(cglock_t *lock)
|
|
static inline void cg_dlock(cglock_t *lock)
|
|
|
{
|
|
{
|