Drizzled Public API Documentation

sync0rw.h File Reference

#include "univ.i"
#include "ut0lst.h"
#include "sync0sync.h"
#include "os0sync.h"
#include "sync0rw.ic"

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

Detailed Description

The read-write lock (for threads, not for database transactions)

Created 9/11/1995 Heikki Tuuri

Definition in file sync0rw.h.


Define Documentation

#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__)

Function Documentation

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.

Parameters:
lockin: pointer to memory
cfile_namein: file name where created
clinein: 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.

Parameters:
lockin: 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.

Returns:
number of readers in: rw-lock

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.

Returns:
1 if waiters, 0 otherwise in: 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.

Returns:
RW_LOCK_NOT_LOCKED, RW_LOCK_EX, RW_LOCK_WAIT_EX in: rw-lock

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.

Returns:
value of writer_count in: rw-lock

Referenced by fseg_alloc_free_page_general(), fseg_create_general(), and 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.

Returns:
TRUE if locked
Parameters:
lockin: rw-lock
lock_typein: 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.

Returns:
TRUE if decr occurs in: amount to decrement
Parameters:
lockin/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.

Returns:
lock->lock_word after increment in: amount to increment
Parameters:
lockin/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

Parameters:
lockin/out: rw-lock
file_namein: 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

Parameters:
lockin: pointer to rw-lock
passin: pass value; != 0, if the lock will be passed to another thread to unlock
file_namein: 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.

Returns:
TRUE if success in: line where requested
Parameters:
lockin: pointer to rw-lock
file_namein: 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

Parameters:
lockin/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

Parameters:
lockin/out: rw-lock
file_namein: 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

Parameters:
lockin: pointer to rw-lock
passin: pass value; != 0, if the lock will be passed to another thread to unlock
file_namein: file name where lock requested
linein: 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.

Returns:
TRUE if success in: line where requested
Parameters:
lockin: pointer to rw-lock
file_namein: 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.

Parameters:
lockin: 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


Variable Documentation

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().

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().

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().

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().

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().