mirror of
https://github.com/MariaDB/server.git
synced 2025-01-22 14:54:20 +01:00
774afe534d
git-svn-id: file:///svn/toku/tokudb@48763 c7de825b-a66e-492c-adef-691d508d4ae1
74 lines
2.3 KiB
C++
74 lines
2.3 KiB
C++
/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
// vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4:
|
|
#ifndef UTIL_NB_MUTEX_H
|
|
#define UTIL_NB_MUTEX_H
|
|
#ident "$Id$"
|
|
#ident "Copyright (c) 2007-2012 Tokutek Inc. All rights reserved."
|
|
#ident "The technology is licensed by the Massachusetts Institute of Technology, Rutgers State University of New Jersey, and the Research Foundation of State University of New York at Stony Brook under United States of America Serial No. 11/760379 and to the patents and/or patent applications resulting from it."
|
|
|
|
#include "rwlock.h"
|
|
|
|
//Use case:
|
|
// General purpose non blocking mutex with properties:
|
|
// 1. one writer at a time
|
|
|
|
// An external mutex must be locked when using these functions. An alternate
|
|
// design would bury a mutex into the nb_mutex itself. While this may
|
|
// increase parallelism at the expense of single thread performance, we
|
|
// are experimenting with a single higher level lock.
|
|
|
|
typedef struct nb_mutex *NB_MUTEX;
|
|
struct nb_mutex {
|
|
struct rwlock lock;
|
|
};
|
|
|
|
// initialize an nb mutex
|
|
static __attribute__((__unused__))
|
|
void
|
|
nb_mutex_init(NB_MUTEX nb_mutex) {
|
|
rwlock_init(&nb_mutex->lock);
|
|
}
|
|
|
|
// destroy a read write lock
|
|
static __attribute__((__unused__))
|
|
void
|
|
nb_mutex_destroy(NB_MUTEX nb_mutex) {
|
|
rwlock_destroy(&nb_mutex->lock);
|
|
}
|
|
|
|
// obtain a write lock
|
|
// expects: mutex is locked
|
|
static inline void nb_mutex_lock(NB_MUTEX nb_mutex, toku_mutex_t *mutex) {
|
|
rwlock_write_lock(&nb_mutex->lock, mutex);
|
|
}
|
|
|
|
// release a write lock
|
|
// expects: mutex is locked
|
|
|
|
static inline void nb_mutex_unlock(NB_MUTEX nb_mutex) {
|
|
rwlock_write_unlock(&nb_mutex->lock);
|
|
}
|
|
|
|
static inline void nb_mutex_wait_for_users(NB_MUTEX nb_mutex, toku_mutex_t *mutex) {
|
|
rwlock_wait_for_users(&nb_mutex->lock, mutex);
|
|
}
|
|
|
|
// returns: the number of writers who are waiting for the lock
|
|
|
|
static inline int nb_mutex_blocked_writers(NB_MUTEX nb_mutex) {
|
|
return rwlock_blocked_writers(&nb_mutex->lock);
|
|
}
|
|
|
|
// returns: the number of writers
|
|
|
|
static inline int nb_mutex_writers(NB_MUTEX nb_mutex) {
|
|
return rwlock_writers(&nb_mutex->lock);
|
|
}
|
|
|
|
// returns: the sum of the number of readers, pending readers,
|
|
// writers, and pending writers
|
|
static inline int nb_mutex_users(NB_MUTEX nb_mutex) {
|
|
return rwlock_users(&nb_mutex->lock);
|
|
}
|
|
|
|
#endif // UTIL_NB_MUTEX_H
|