Go to the source code of this file.
Classes | |
struct | rw_lock_struct |
Defines | |
#define | RW_S_LATCH 1 |
#define | RW_X_LATCH 2 |
#define | RW_NO_LATCH 3 |
#define | X_LOCK_DECR 0x00100000 |
#define | rw_lock_create(K, L, level) rw_lock_create_func((L), __FILE__, __LINE__) |
#define | rw_lock_s_lock(M) rw_lock_s_lock_func((M), 0, __FILE__, __LINE__) |
#define | rw_lock_s_lock_gen(M, P) rw_lock_s_lock_func((M), (P), __FILE__, __LINE__) |
#define | rw_lock_s_lock_nowait(M, F, L) rw_lock_s_lock_low((M), 0, (F), (L)) |
#define | rw_lock_s_unlock_gen(L, P) rw_lock_s_unlock_func(L) |
#define | rw_lock_x_lock(M) rw_lock_x_lock_func((M), 0, __FILE__, __LINE__) |
#define | rw_lock_x_lock_gen(M, P) rw_lock_x_lock_func((M), (P), __FILE__, __LINE__) |
#define | rw_lock_x_lock_nowait(M) rw_lock_x_lock_func_nowait((M), __FILE__, __LINE__) |
#define | rw_lock_x_unlock_gen(L, P) rw_lock_x_unlock_func(L) |
#define | rw_lock_free(M) rw_lock_free_func(M) |
#define | rw_lock_s_unlock(L) rw_lock_s_unlock_gen(L, 0) |
#define | rw_lock_x_unlock(L) rw_lock_x_unlock_gen(L, 0) |
Typedefs | |
typedef struct rw_lock_struct | rw_lock_t |
Functions | |
typedef | UT_LIST_BASE_NODE_T (rw_lock_t) rw_lock_list_t |
UNIV_INTERN void | rw_lock_create_func (rw_lock_t *lock, const char *cfile_name, ulint cline) |
UNIV_INTERN void | rw_lock_free_func (rw_lock_t *lock) |
UNIV_INLINE ibool | rw_lock_s_lock_low (rw_lock_t *lock, ulint, const char *file_name, ulint line) |
UNIV_INLINE void | rw_lock_s_lock_func (rw_lock_t *lock, ulint pass, const char *file_name, ulint line) |
UNIV_INLINE ibool | rw_lock_x_lock_func_nowait (rw_lock_t *lock, const char *file_name, ulint line) |
UNIV_INLINE void | rw_lock_s_unlock_func (rw_lock_t *lock) |
UNIV_INTERN void | rw_lock_x_lock_func (rw_lock_t *lock, ulint pass, const char *file_name, ulint line) |
UNIV_INLINE void | rw_lock_x_unlock_func (rw_lock_t *lock) |
UNIV_INLINE void | rw_lock_s_lock_direct (rw_lock_t *lock, const char *file_name, ulint line) |
UNIV_INLINE void | rw_lock_x_lock_direct (rw_lock_t *lock, const char *file_name, ulint line) |
UNIV_INTERN void | rw_lock_x_lock_move_ownership (rw_lock_t *lock) |
UNIV_INLINE void | rw_lock_s_unlock_direct (rw_lock_t *lock) |
UNIV_INLINE void | rw_lock_x_unlock_direct (rw_lock_t *lock) |
UNIV_INLINE ulint | rw_lock_get_x_lock_count (const rw_lock_t *lock) |
UNIV_INLINE ulint | rw_lock_get_waiters (const rw_lock_t *lock) |
UNIV_INLINE ulint | rw_lock_get_writer (const rw_lock_t *lock) |
UNIV_INLINE ulint | rw_lock_get_reader_count (const rw_lock_t *lock) |
UNIV_INLINE ibool | rw_lock_lock_word_decr (rw_lock_t *lock, ulint amount) |
UNIV_INLINE lint | rw_lock_lock_word_incr (rw_lock_t *lock, ulint amount) |
UNIV_INLINE void | rw_lock_set_writer_id_and_recursion_flag (rw_lock_t *lock, ibool recursive) |
UNIV_INTERN ibool | rw_lock_is_locked (rw_lock_t *lock, ulint lock_type) |
Variables | |
rw_lock_list_t | rw_lock_list |
mutex_t | rw_lock_list_mutex |
ib_int64_t | rw_s_spin_wait_count |
ib_int64_t | rw_s_spin_round_count |
ib_int64_t | rw_s_exit_count |
ib_int64_t | rw_s_os_wait_count |
ib_int64_t | rw_x_spin_wait_count |
ib_int64_t | rw_x_spin_round_count |
ib_int64_t | rw_x_os_wait_count |
ib_int64_t | rw_x_exit_count |
The read-write lock (for threads, not for database transactions)
Created 9/11/1995 Heikki Tuuri
Definition in file sync0rw.h.
#define rw_lock_create | ( | K, | |
L, | |||
level | |||
) | rw_lock_create_func((L), __FILE__, __LINE__) |
Creates, or rather, initializes an rw-lock object in a specified memory location (which must be appropriately aligned). The rw-lock is initialized to the non-locked state. Explicit freeing of the rw-lock with rw_lock_free is necessary only if the memory block containing it is freed. if MySQL performance schema is enabled and "UNIV_PFS_RWLOCK" is defined, the rwlock are instrumented with performance schema probes.
Definition at line 146 of file sync0rw.h.
Referenced by btr_search_sys_create(), dict_index_add_to_cache(), dict_init(), fil_space_create(), log_init(), trx_i_s_cache_init(), and trx_purge_sys_create().
#define rw_lock_s_lock | ( | M | ) | rw_lock_s_lock_func((M), 0, __FILE__, __LINE__) |
NOTE! The following macros should be used in rw locking and unlocking, not the corresponding function.
Definition at line 154 of file sync0rw.h.
Referenced by btr_cur_search_to_nth_level(), btr_search_drop_page_hash_index(), btr_search_guess_on_hash(), btr_search_info_get_ref_count(), btr_search_move_or_delete_hash_entries(), dict_table_stats_lock(), log_checkpoint(), row_search_for_mysql(), row_vers_build_for_consistent_read(), row_vers_build_for_semi_consistent_read(), and trx_i_s_cache_start_read().
UNIV_INTERN void rw_lock_create_func | ( | rw_lock_t * | lock, |
const char * | cfile_name, | ||
ulint | cline | ||
) |
Creates, or rather, initializes an rw-lock object in a specified memory location (which must be appropriately aligned). The rw-lock is initialized to the non-locked state. Explicit freeing of the rw-lock with rw_lock_free is necessary only if the memory block containing it is freed. in: file line where created
Creates, or rather, initializes an rw-lock object in a specified memory location (which must be appropriately aligned). The rw-lock is initialized to the non-locked state. Explicit freeing of the rw-lock with rw_lock_free is necessary only if the memory block containing it is freed.
lock | in: pointer to memory |
cfile_name | in: file name where created |
cline | in: file line where created |
Definition at line 237 of file sync0rw.cc.
References rw_lock_struct::cfile_name, mutex_struct::cfile_name, rw_lock_struct::cline, mutex_struct::cline, rw_lock_struct::count_os_wait, rw_lock_struct::event, rw_lock_struct::last_s_file_name, rw_lock_struct::last_s_line, rw_lock_struct::last_x_file_name, rw_lock_struct::last_x_line, rw_lock_struct::lock_word, rw_lock_struct::mutex, os_event_create(), rw_lock_struct::recursive, rw_lock_create_func(), ut_ad, ut_d, UT_LIST_ADD_FIRST, UT_LIST_GET_FIRST, UT_LIST_INIT, UT_NOT_USED, rw_lock_struct::wait_ex_event, and rw_lock_struct::waiters.
Referenced by rw_lock_create_func().
UNIV_INTERN void rw_lock_free_func | ( | rw_lock_t * | lock | ) |
Calling this function is obligatory only if the memory buffer containing the rw-lock is freed. Removes an rw-lock object from the global list. The rw-lock is checked to be in the non-locked state. in: rw-lock
Calling this function is obligatory only if the memory buffer containing the rw-lock is freed. Removes an rw-lock object from the global list. The rw-lock is checked to be in the non-locked state.
lock | in: rw-lock |
Definition at line 310 of file sync0rw.cc.
References rw_lock_struct::event, rw_lock_struct::lock_word, os_event_free(), rw_lock_free_func(), ut_a, ut_ad, ut_d, UT_LIST_GET_NEXT, UT_LIST_GET_PREV, UT_LIST_REMOVE, and rw_lock_struct::wait_ex_event.
Referenced by rw_lock_free_func().
UNIV_INLINE ulint rw_lock_get_reader_count | ( | const rw_lock_t * | lock | ) |
Returns the number of readers.
Referenced by btr_search_guess_on_hash(), and rw_lock_is_locked().
UNIV_INLINE ulint rw_lock_get_waiters | ( | const rw_lock_t * | lock | ) |
Check if there are threads waiting for the rw-lock.
UNIV_INLINE ulint rw_lock_get_writer | ( | const rw_lock_t * | lock | ) |
Returns the write-status of the lock - this function made more sense with the old rw_lock implementation.
Referenced by btr_cur_search_to_nth_level(), btr_search_guess_on_hash(), row_search_for_mysql(), and rw_lock_is_locked().
UNIV_INLINE ulint rw_lock_get_x_lock_count | ( | const rw_lock_t * | lock | ) |
Returns the value of writer_count for the lock. Does not reserve the lock mutex, so the caller must be sure it is not changed during the call.
Referenced by ibuf_free_excess_pages().
UNIV_INTERN ibool rw_lock_is_locked | ( | rw_lock_t * | lock, |
ulint | lock_type | ||
) |
Checks if somebody has locked the rw-lock in the specified mode. in: lock type: RW_LOCK_SHARED, RW_LOCK_EX
Checks if somebody has locked the rw-lock in the specified mode.
lock | in: rw-lock |
lock_type | in: lock type: RW_LOCK_SHARED, RW_LOCK_EX |
Definition at line 873 of file sync0rw.cc.
References rw_lock_get_reader_count(), rw_lock_get_writer(), rw_lock_is_locked(), ut_ad, and ut_error.
Referenced by rw_lock_is_locked(), and rw_lock_x_lock_move_ownership().
UNIV_INLINE ibool rw_lock_lock_word_decr | ( | rw_lock_t * | lock, |
ulint | amount | ||
) |
Decrements lock_word the specified amount if it is greater than 0. This is used by both s_lock and x_lock operations.
lock | in/out: rw-lock |
UNIV_INLINE lint rw_lock_lock_word_incr | ( | rw_lock_t * | lock, |
ulint | amount | ||
) |
Increments lock_word the specified amount and returns new value.
lock | in/out: rw-lock |
UNIV_INLINE void rw_lock_s_lock_direct | ( | rw_lock_t * | lock, |
const char * | file_name, | ||
ulint | line | ||
) |
Low-level function which locks an rw-lock in s-mode when we know that it is possible and none else is currently accessing the rw-lock structure. Then we can do the locking without reserving the mutex. in: line where lock requested
lock | in/out: rw-lock |
file_name | in: file name where requested |
UNIV_INLINE void rw_lock_s_lock_func | ( | rw_lock_t * | lock, |
ulint | pass, | ||
const char * | file_name, | ||
ulint | line | ||
) |
NOTE! Use the corresponding macro, not directly this function, except if you supply the file name and line number. Lock an rw-lock in shared mode for the current thread. If the rw-lock is locked in exclusive mode, or there is an exclusive lock request waiting, the function spins a preset time (controlled by SYNC_SPIN_ROUNDS), waiting for the lock, before suspending the thread. in: line where requested
lock | in: pointer to rw-lock |
pass | in: pass value; != 0, if the lock will be passed to another thread to unlock |
file_name | in: file name where lock requested |
Referenced by buf_page_get_gen(), and row_mysql_freeze_data_dictionary_func().
UNIV_INLINE ibool rw_lock_s_lock_low | ( | rw_lock_t * | lock, |
ulint | , | ||
const char * | file_name, | ||
ulint | line | ||
) |
Low-level function which tries to lock an rw-lock in s-mode. Performs no spinning.
lock | in: pointer to rw-lock |
file_name | in: file name where lock requested |
UNIV_INLINE void rw_lock_s_unlock_direct | ( | rw_lock_t * | lock | ) |
Releases a shared mode lock when we know there are no waiters and none else will access the lock during the time this function is executed. in/out: rw-lock
UNIV_INLINE void rw_lock_s_unlock_func | ( | rw_lock_t * | lock | ) |
Releases a shared mode lock. in/out: rw-lock
UNIV_INLINE void rw_lock_set_writer_id_and_recursion_flag | ( | rw_lock_t * | lock, |
ibool | recursive | ||
) |
This function sets the lock->writer_thread and lock->recursive fields. For platforms where we are using atomic builtins instead of lock->mutex it sets the lock->writer_thread field using atomics to ensure memory ordering. Note that it is assumed that the caller of this function effectively owns the lock i.e.: nobody else is allowed to modify lock->writer_thread at this point in time. The protocol is that lock->writer_thread MUST be updated BEFORE the lock->recursive flag is set. in: TRUE if recursion allowed
lock | in/out: lock to work on |
Referenced by rw_lock_x_lock_move_ownership().
UNIV_INLINE void rw_lock_x_lock_direct | ( | rw_lock_t * | lock, |
const char * | file_name, | ||
ulint | line | ||
) |
Low-level function which locks an rw-lock in x-mode when we know that it is not locked and none else is currently accessing the rw-lock structure. Then we can do the locking without reserving the mutex. in: line where lock requested
lock | in/out: rw-lock |
file_name | in: file name where requested |
UNIV_INTERN void rw_lock_x_lock_func | ( | rw_lock_t * | lock, |
ulint | pass, | ||
const char * | file_name, | ||
ulint | line | ||
) |
NOTE! Use the corresponding macro, not directly this function! Lock an rw-lock in exclusive mode for the current thread. If the rw-lock is locked in shared or exclusive mode, or there is an exclusive lock request waiting, the function spins a preset time (controlled by SYNC_SPIN_ROUNDS), waiting for the lock, before suspending the thread. If the same thread has an x-lock on the rw-lock, locking succeed, with the following exception: if pass != 0, only a single x-lock may be taken on the lock. NOTE: If the same thread has an s-lock, locking does not succeed! in: line where requested
NOTE! Use the corresponding macro, not directly this function! Lock an rw-lock in exclusive mode for the current thread. If the rw-lock is locked in shared or exclusive mode, or there is an exclusive lock request waiting, the function spins a preset time (controlled by SYNC_SPIN_ROUNDS), waiting for the lock before suspending the thread. If the same thread has an x-lock on the rw-lock, locking succeed, with the following exception: if pass != 0, only a single x-lock may be taken on the lock. NOTE: If the same thread has an s-lock, locking does not succeed!
< index of the reserved wait cell
< spin round count
lock | in: pointer to rw-lock |
pass | in: pass value; != 0, if the lock will be passed to another thread to unlock |
file_name | in: file name where lock requested |
line | in: line where requested |
Definition at line 610 of file sync0rw.cc.
References rw_lock_struct::cfile_name, rw_lock_struct::count_os_wait, rw_lock_struct::lock_word, os_thread_get_curr_id(), os_thread_pf(), os_thread_yield(), rw_lock_x_lock_func(), rw_x_os_wait_count, rw_x_spin_round_count, rw_x_spin_wait_count, sync_array_free_cell(), sync_array_reserve_cell(), sync_array_wait_event(), sync_primary_wait_array, SYNC_SPIN_ROUNDS, ut_ad, ut_delay(), and ut_rnd_interval().
Referenced by buf_page_get_gen(), row_mysql_lock_data_dictionary_func(), and rw_lock_x_lock_func().
UNIV_INLINE ibool rw_lock_x_lock_func_nowait | ( | rw_lock_t * | lock, |
const char * | file_name, | ||
ulint | line | ||
) |
NOTE! Use the corresponding macro, not directly this function! Lock an rw-lock in exclusive mode for the current thread if the lock can be obtained immediately.
lock | in: pointer to rw-lock |
file_name | in: file name where lock requested |
Referenced by buf_page_get_known_nowait(), buf_page_optimistic_get(), and buf_page_try_get_func().
UNIV_INTERN void rw_lock_x_lock_move_ownership | ( | rw_lock_t * | lock | ) |
This function is used in the insert buffer to move the ownership of an x-latch on a buffer frame to the current thread. The x-latch was set by the buffer read operation and it protected the buffer frame while the read was done. The ownership is moved because we want that the current thread is able to acquire a second x-latch which is stored in an mtr. This, in turn, is needed to pass the debug checks of index page operations. in: lock which was x-locked in the buffer read
This function is used in the insert buffer to move the ownership of an x-latch on a buffer frame to the current thread. The x-latch was set by the buffer read operation and it protected the buffer frame while the read was done. The ownership is moved because we want that the current thread is able to acquire a second x-latch which is stored in an mtr. This, in turn, is needed to pass the debug checks of index page operations.
lock | in: lock which was x-locked in the buffer read |
Definition at line 467 of file sync0rw.cc.
References rw_lock_is_locked(), rw_lock_set_writer_id_and_recursion_flag(), rw_lock_x_lock_move_ownership(), and ut_ad.
Referenced by recv_recover_page_func(), and rw_lock_x_lock_move_ownership().
UNIV_INLINE void rw_lock_x_unlock_direct | ( | rw_lock_t * | lock | ) |
Releases an exclusive mode lock when we know there are no waiters, and none else will access the lock durint the time this function is executed. in/out: rw-lock
UNIV_INLINE void rw_lock_x_unlock_func | ( | rw_lock_t * | lock | ) |
Releases an exclusive mode lock. in/out: rw-lock
ib_int64_t rw_s_exit_count |
number of unlocks (that unlock shared locks), set only when UNIV_SYNC_PERF_STAT is defined
Definition at line 150 of file sync0rw.cc.
Referenced by sync_print_wait_info().
ib_int64_t rw_s_os_wait_count |
number of OS waits on rw-latches, resulted during shared (read) locks
Definition at line 146 of file sync0rw.cc.
Referenced by sync_print_wait_info().
ib_int64_t rw_s_spin_round_count |
number of spin loop rounds on rw-latches, resulted during exclusive (write) locks
number of spin loop rounds on rw-latches, resulted during shared (read) locks
Definition at line 142 of file sync0rw.cc.
Referenced by sync_print_wait_info().
ib_int64_t rw_s_spin_wait_count |
number of spin waits on rw-latches, resulted during exclusive (write) locks
number of spin waits on rw-latches, resulted during shared (read) locks
Definition at line 139 of file sync0rw.cc.
Referenced by sync_print_wait_info().
ib_int64_t rw_x_exit_count |
number of unlocks (that unlock exclusive locks), set only when UNIV_SYNC_PERF_STAT is defined
Definition at line 165 of file sync0rw.cc.
Referenced by sync_print_wait_info().
ib_int64_t rw_x_os_wait_count |
number of OS waits on rw-latches, resulted during exclusive (write) locks
Definition at line 161 of file sync0rw.cc.
Referenced by rw_lock_x_lock_func(), and sync_print_wait_info().
ib_int64_t rw_x_spin_round_count |
number of spin loop rounds on rw-latches, resulted during shared (read) locks
number of spin loop rounds on rw-latches, resulted during exclusive (write) locks
Definition at line 157 of file sync0rw.cc.
Referenced by rw_lock_x_lock_func(), and sync_print_wait_info().
ib_int64_t rw_x_spin_wait_count |
number of spin waits on rw-latches, resulted during shared (read) locks
number of spin waits on rw-latches, resulted during exclusive (write) locks
Definition at line 154 of file sync0rw.cc.
Referenced by rw_lock_x_lock_func(), and sync_print_wait_info().