MySQL  8.0.19
Source Code Documentation
sync0rw.h File Reference
#include "univ.i"
#include "os0event.h"
#include "ut0counter.h"
#include "ut0mutex.h"
#include "sync0rw.ic"

Go to the source code of this file.

Classes

struct  rw_lock_stats_t
 Counters for RW locks. More...
 
struct  rw_lock_t
 The structure used in the spin lock implementation of a read-write lock. More...
 
struct  rw_lock_debug_t
 The structure for storing debug info of an rw-lock. More...
 

Macros

#define X_LOCK_DECR   0x20000000
 
#define X_LOCK_HALF_DECR   0x10000000
 
#define rw_lock_create(K, L, level)   pfs_rw_lock_create_func((K), (L), (level), #L, __FILE__, __LINE__)
 
#define rw_lock_s_lock(M)   pfs_rw_lock_s_lock_func((M), 0, __FILE__, __LINE__)
 
#define rw_lock_s_lock_inline(M, P, F, L)   pfs_rw_lock_s_lock_func((M), (P), (F), (L))
 
#define rw_lock_s_lock_gen(M, P)   pfs_rw_lock_s_lock_func((M), (P), __FILE__, __LINE__)
 
#define rw_lock_s_lock_nowait(M, F, L)   pfs_rw_lock_s_lock_low((M), 0, (F), (L))
 
#define rw_lock_s_unlock_gen(L, P)   pfs_rw_lock_s_unlock_func(P, L)
 
#define rw_lock_sx_lock(M)   pfs_rw_lock_sx_lock_func((M), 0, __FILE__, __LINE__)
 
#define rw_lock_sx_lock_inline(M, P, F, L)   pfs_rw_lock_sx_lock_func((M), (P), (F), (L))
 
#define rw_lock_sx_lock_gen(M, P)   pfs_rw_lock_sx_lock_func((M), (P), __FILE__, __LINE__)
 
#define rw_lock_sx_lock_nowait(M, P)   pfs_rw_lock_sx_lock_low((M), (P), __FILE__, __LINE__)
 
#define rw_lock_sx_unlock(L)   pfs_rw_lock_sx_unlock_func(0, L)
 
#define rw_lock_sx_unlock_gen(L, P)   pfs_rw_lock_sx_unlock_func(P, L)
 
#define rw_lock_x_lock(M)   pfs_rw_lock_x_lock_func((M), 0, __FILE__, __LINE__)
 
#define rw_lock_x_lock_inline(M, P, F, L)   pfs_rw_lock_x_lock_func((M), (P), (F), (L))
 
#define rw_lock_x_lock_gen(M, P)   pfs_rw_lock_x_lock_func((M), (P), __FILE__, __LINE__)
 
#define rw_lock_x_lock_nowait(M)   pfs_rw_lock_x_lock_func_nowait((M), __FILE__, __LINE__)
 
#define rw_lock_x_lock_func_nowait_inline(M, F, L)   pfs_rw_lock_x_lock_func_nowait((M), (F), (L))
 
#define rw_lock_x_unlock_gen(L, P)   pfs_rw_lock_x_unlock_func(P, L)
 
#define rw_lock_free(M)   pfs_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)
 
#define RW_LOCK_MAGIC_N   22643
 Value of rw_lock_t::magic_n. More...
 

Enumerations

enum  rw_lock_type_t { RW_S_LATCH = 1, RW_X_LATCH = 2, RW_SX_LATCH = 4, RW_NO_LATCH = 8 }
 

Functions

typedef UT_LIST_BASE_NODE_T (rw_lock_t) rw_lock_list_t
 
void rw_lock_create_func (rw_lock_t *lock, latch_level_t level, const char *cmutex_name, const char *cfile_name, ulint cline)
 Creates, or rather, initializes an rw-lock object in a specified memory location (which must be appropriately aligned). More...
 
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. More...
 
bool rw_lock_validate (const rw_lock_t *lock)
 Checks that the rw-lock has been initialized and that there are no simultaneous shared and exclusive locks. More...
 
UNIV_INLINE ibool rw_lock_s_lock_low (rw_lock_t *lock, ulint pass, const char *file_name, ulint line)
 Low-level function which tries to lock an rw-lock in s-mode. More...
 
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. More...
 
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. More...
 
UNIV_INLINE void rw_lock_s_unlock_func (ulint pass, rw_lock_t *lock)
 Releases a shared mode lock. More...
 
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. More...
 
ibool rw_lock_sx_lock_low (rw_lock_t *lock, ulint pass, const char *file_name, ulint line)
 Low-level function for acquiring an sx lock. More...
 
void rw_lock_sx_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 SX mode for the current thread. More...
 
UNIV_INLINE void rw_lock_x_unlock_func (ulint pass, rw_lock_t *lock)
 Releases an exclusive mode lock. More...
 
UNIV_INLINE void rw_lock_sx_unlock_func (ulint pass, rw_lock_t *lock)
 Releases an sx mode lock. More...
 
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. More...
 
UNIV_INLINE ulint rw_lock_get_x_lock_count (const rw_lock_t *lock)
 Returns the value of writer_count for the lock. More...
 
UNIV_INLINE ulint rw_lock_get_sx_lock_count (const rw_lock_t *lock)
 Returns the number of sx-lock for the lock. More...
 
UNIV_INLINE ulint rw_lock_get_waiters (const rw_lock_t *lock)
 Check if there are threads waiting for the rw-lock. More...
 
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. More...
 
UNIV_INLINE ulint rw_lock_get_reader_count (const rw_lock_t *lock)
 Returns the number of readers (s-locks). More...
 
UNIV_INLINE bool rw_lock_lock_word_decr (rw_lock_t *lock, ulint amount, lint threshold)
 Decrements lock_word the specified amount if it is greater than 0. More...
 
UNIV_INLINE lint rw_lock_lock_word_incr (rw_lock_t *lock, ulint amount)
 Increments lock_word the specified amount and returns new value. More...
 
UNIV_INLINE void rw_lock_set_writer_id_and_recursion_flag (rw_lock_t *lock, bool recursive)
 This function sets the lock->writer_thread and lock->recursive fields. More...
 
ibool rw_lock_own (rw_lock_t *lock, ulint lock_type)
 Checks if the thread has locked the rw-lock in the specified mode, with the pass value == 0. More...
 
bool rw_lock_own_flagged (const rw_lock_t *lock, rw_lock_flags_t flags)
 Checks if the thread has locked the rw-lock in the specified mode, with the pass value == 0. More...
 
bool rw_lock_is_locked (rw_lock_t *lock, ulint lock_type)
 Checks if somebody has locked the rw-lock in the specified mode. More...
 
void rw_lock_list_print_info (FILE *file)
 Prints debug info of currently locked rw-locks. More...
 
void rw_lock_debug_print (FILE *f, const rw_lock_debug_t *info)
 Prints info of a debug struct. More...
 
UNIV_INLINE void pfs_rw_lock_create_func (mysql_pfs_key_t key, rw_lock_t *lock, latch_level_t level, const char *cmutex_name, const char *cfile_name, ulint cline)
 Performance schema instrumented wrap function for rw_lock_create_func() NOTE! Please use the corresponding macro rw_lock_create(), not directly this function! More...
 
UNIV_INLINE void pfs_rw_lock_x_lock_func (rw_lock_t *lock, ulint pass, const char *file_name, ulint line)
 Performance schema instrumented wrap function for rw_lock_x_lock_func() NOTE! Please use the corresponding macro rw_lock_x_lock(), not directly this function! More...
 
UNIV_INLINE ibool pfs_rw_lock_x_lock_func_nowait (rw_lock_t *lock, const char *file_name, ulint line)
 Performance schema instrumented wrap function for rw_lock_x_lock_func_nowait() NOTE! Please use the corresponding macro, not directly this function! More...
 
UNIV_INLINE void pfs_rw_lock_s_lock_func (rw_lock_t *lock, ulint pass, const char *file_name, ulint line)
 Performance schema instrumented wrap function for rw_lock_s_lock_func() NOTE! Please use the corresponding macro rw_lock_s_lock(), not directly this function! More...
 
UNIV_INLINE ibool pfs_rw_lock_s_lock_low (rw_lock_t *lock, ulint pass, const char *file_name, ulint line)
 Performance schema instrumented wrap function for rw_lock_s_lock_func() NOTE! Please use the corresponding macro rw_lock_s_lock(), not directly this function! More...
 
UNIV_INLINE void pfs_rw_lock_s_unlock_func (ulint pass, rw_lock_t *lock)
 Performance schema instrumented wrap function for rw_lock_s_unlock_func() NOTE! Please use the corresponding macro rw_lock_s_unlock(), not directly this function! More...
 
UNIV_INLINE void pfs_rw_lock_x_unlock_func (ulint pass, rw_lock_t *lock)
 Performance schema instrumented wrap function for rw_lock_x_unlock_func() NOTE! Please use the corresponding macro rw_lock_x_unlock(), not directly this function! More...
 
UNIV_INLINE void pfs_rw_lock_sx_lock_func (rw_lock_t *lock, ulint pass, const char *file_name, ulint line)
 Performance schema instrumented wrap function for rw_lock_sx_lock_func() NOTE! Please use the corresponding macro rw_lock_sx_lock(), not directly this function! More...
 
UNIV_INLINE ibool pfs_rw_lock_sx_lock_low (rw_lock_t *lock, ulint pass, const char *file_name, ulint line)
 Performance schema instrumented wrap function for rw_lock_sx_lock_nowait() NOTE! Please use the corresponding macro, not directly this function! More...
 
UNIV_INLINE void pfs_rw_lock_sx_unlock_func (ulint pass, rw_lock_t *lock)
 Performance schema instrumented wrap function for rw_lock_sx_unlock_func() NOTE! Please use the corresponding macro rw_lock_sx_unlock(), not directly this function! More...
 
UNIV_INLINE void pfs_rw_lock_free_func (rw_lock_t *lock)
 Performance schema instrumented wrap function for rw_lock_free_func() NOTE! Please use the corresponding macro rw_lock_free(), not directly this function! More...
 

Variables

rw_lock_list_t rw_lock_list
 
ib_mutex_t rw_lock_list_mutex
 
rw_lock_stats_t rw_lock_stats
 Counters for RW locks. More...
 

Detailed Description

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

Created 9/11/1995 Heikki Tuuri

Macro Definition Documentation

◆ rw_lock_create

#define rw_lock_create (   K,
  L,
  level 
)    pfs_rw_lock_create_func((K), (L), (level), #L, __FILE__, __LINE__)

◆ rw_lock_free

#define rw_lock_free (   M)    pfs_rw_lock_free_func(M)

◆ RW_LOCK_MAGIC_N

#define RW_LOCK_MAGIC_N   22643

Value of rw_lock_t::magic_n.

◆ rw_lock_s_lock

#define rw_lock_s_lock (   M)    pfs_rw_lock_s_lock_func((M), 0, __FILE__, __LINE__)

◆ rw_lock_s_lock_gen

#define rw_lock_s_lock_gen (   M,
  P 
)    pfs_rw_lock_s_lock_func((M), (P), __FILE__, __LINE__)

◆ rw_lock_s_lock_inline

#define rw_lock_s_lock_inline (   M,
  P,
  F,
  L 
)    pfs_rw_lock_s_lock_func((M), (P), (F), (L))

◆ rw_lock_s_lock_nowait

#define rw_lock_s_lock_nowait (   M,
  F,
  L 
)    pfs_rw_lock_s_lock_low((M), 0, (F), (L))

◆ rw_lock_s_unlock

#define rw_lock_s_unlock (   L)    rw_lock_s_unlock_gen(L, 0)

◆ rw_lock_s_unlock_gen

#define rw_lock_s_unlock_gen (   L,
  P 
)    pfs_rw_lock_s_unlock_func(P, L)

◆ rw_lock_sx_lock

#define rw_lock_sx_lock (   M)    pfs_rw_lock_sx_lock_func((M), 0, __FILE__, __LINE__)

◆ rw_lock_sx_lock_gen

#define rw_lock_sx_lock_gen (   M,
  P 
)    pfs_rw_lock_sx_lock_func((M), (P), __FILE__, __LINE__)

◆ rw_lock_sx_lock_inline

#define rw_lock_sx_lock_inline (   M,
  P,
  F,
  L 
)    pfs_rw_lock_sx_lock_func((M), (P), (F), (L))

◆ rw_lock_sx_lock_nowait

#define rw_lock_sx_lock_nowait (   M,
  P 
)    pfs_rw_lock_sx_lock_low((M), (P), __FILE__, __LINE__)

◆ rw_lock_sx_unlock

#define rw_lock_sx_unlock (   L)    pfs_rw_lock_sx_unlock_func(0, L)

◆ rw_lock_sx_unlock_gen

#define rw_lock_sx_unlock_gen (   L,
  P 
)    pfs_rw_lock_sx_unlock_func(P, L)

◆ rw_lock_x_lock

#define rw_lock_x_lock (   M)    pfs_rw_lock_x_lock_func((M), 0, __FILE__, __LINE__)

◆ rw_lock_x_lock_func_nowait_inline

#define rw_lock_x_lock_func_nowait_inline (   M,
  F,
  L 
)    pfs_rw_lock_x_lock_func_nowait((M), (F), (L))

◆ rw_lock_x_lock_gen

#define rw_lock_x_lock_gen (   M,
  P 
)    pfs_rw_lock_x_lock_func((M), (P), __FILE__, __LINE__)

◆ rw_lock_x_lock_inline

#define rw_lock_x_lock_inline (   M,
  P,
  F,
  L 
)    pfs_rw_lock_x_lock_func((M), (P), (F), (L))

◆ rw_lock_x_lock_nowait

#define rw_lock_x_lock_nowait (   M)    pfs_rw_lock_x_lock_func_nowait((M), __FILE__, __LINE__)

◆ rw_lock_x_unlock

#define rw_lock_x_unlock (   L)    rw_lock_x_unlock_gen(L, 0)

◆ rw_lock_x_unlock_gen

#define rw_lock_x_unlock_gen (   L,
  P 
)    pfs_rw_lock_x_unlock_func(P, L)

◆ X_LOCK_DECR

#define X_LOCK_DECR   0x20000000

◆ X_LOCK_HALF_DECR

#define X_LOCK_HALF_DECR   0x10000000

Enumeration Type Documentation

◆ rw_lock_type_t

Enumerator
RW_S_LATCH 
RW_X_LATCH 
RW_SX_LATCH 
RW_NO_LATCH 

Function Documentation

◆ pfs_rw_lock_create_func()

UNIV_INLINE void pfs_rw_lock_create_func ( mysql_pfs_key_t  key,
rw_lock_t lock,
latch_level_t  level,
const char *  cmutex_name,
const char *  cfile_name,
ulint  cline 
)

Performance schema instrumented wrap function for rw_lock_create_func() NOTE! Please use the corresponding macro rw_lock_create(), not directly this function!

Parameters
[in]keykey registered with performance schema
[in]lockrw lock
[in]levellevel
[in]cmutex_namemutex name
[in]clinefile line where created
[in]cfile_namefile name where created

◆ pfs_rw_lock_free_func()

UNIV_INLINE void pfs_rw_lock_free_func ( rw_lock_t lock)

Performance schema instrumented wrap function for rw_lock_free_func() NOTE! Please use the corresponding macro rw_lock_free(), not directly this function!

in: rw-lock

◆ pfs_rw_lock_s_lock_func()

UNIV_INLINE void pfs_rw_lock_s_lock_func ( rw_lock_t lock,
ulint  pass,
const char *  file_name,
ulint  line 
)

Performance schema instrumented wrap function for rw_lock_s_lock_func() NOTE! Please use the corresponding macro rw_lock_s_lock(), not directly this function!

Parameters
[in]lockpointer to rw-lock
[in]passpass value; != 0, if the lock will be passed to another thread to unlock
[in]file_namefile name where lock requested
[in]lineline where requested

◆ pfs_rw_lock_s_lock_low()

UNIV_INLINE ibool pfs_rw_lock_s_lock_low ( rw_lock_t lock,
ulint  pass,
const char *  file_name,
ulint  line 
)

Performance schema instrumented wrap function for rw_lock_s_lock_func() NOTE! Please use the corresponding macro rw_lock_s_lock(), not directly this function!

Parameters
[in]lockpointer to rw-lock
[in]passpass value; != 0, if the lock will be passed to another thread to unlock
[in]file_namefile name where lock requested
[in]lineline where requested
Returns
true if success

◆ pfs_rw_lock_s_unlock_func()

UNIV_INLINE void pfs_rw_lock_s_unlock_func ( ulint  pass,
rw_lock_t lock 
)

Performance schema instrumented wrap function for rw_lock_s_unlock_func() NOTE! Please use the corresponding macro rw_lock_s_unlock(), not directly this function!

Parameters
[in]passpass value; != 0, if the lock may have been passed to another thread to unlock
[in,out]lockrw-lock

◆ pfs_rw_lock_sx_lock_func()

UNIV_INLINE void pfs_rw_lock_sx_lock_func ( rw_lock_t lock,
ulint  pass,
const char *  file_name,
ulint  line 
)

Performance schema instrumented wrap function for rw_lock_sx_lock_func() NOTE! Please use the corresponding macro rw_lock_sx_lock(), not directly this function!

Parameters
[in]lockpointer to rw-lock
[in]passpass value; != 0, if the lock will be passed to another thread to unlock
[in]file_namefile name where lock requested
[in]lineline where requested

◆ pfs_rw_lock_sx_lock_low()

UNIV_INLINE ibool pfs_rw_lock_sx_lock_low ( rw_lock_t lock,
ulint  pass,
const char *  file_name,
ulint  line 
)

Performance schema instrumented wrap function for rw_lock_sx_lock_nowait() NOTE! Please use the corresponding macro, not directly this function!

Parameters
[in]lockpointer to rw-lock
[in]passpass value; != 0, if the lock will be passed to another thread to unlock
[in]file_namefile name where lock requested
[in]lineline where requested

◆ pfs_rw_lock_sx_unlock_func()

UNIV_INLINE void pfs_rw_lock_sx_unlock_func ( ulint  pass,
rw_lock_t lock 
)

Performance schema instrumented wrap function for rw_lock_sx_unlock_func() NOTE! Please use the corresponding macro rw_lock_sx_unlock(), not directly this function!

Parameters
[in,out]lockpointer to rw-lock
[in]passpass value; != 0, if the lock will be passed to another thread to unlock

◆ pfs_rw_lock_x_lock_func()

UNIV_INLINE void pfs_rw_lock_x_lock_func ( rw_lock_t lock,
ulint  pass,
const char *  file_name,
ulint  line 
)

Performance schema instrumented wrap function for rw_lock_x_lock_func() NOTE! Please use the corresponding macro rw_lock_x_lock(), not directly this function!

Parameters
[in]lockpointer to rw-lock
[in]passpass value; != 0, if the lock will be passed to another thread to unlock
[in]file_namefile name where lock requested
[in]lineline where requested

◆ pfs_rw_lock_x_lock_func_nowait()

UNIV_INLINE ibool pfs_rw_lock_x_lock_func_nowait ( rw_lock_t lock,
const char *  file_name,
ulint  line 
)

Performance schema instrumented wrap function for rw_lock_x_lock_func_nowait() NOTE! Please use the corresponding macro, not directly this function!

Parameters
[in]lockpointer to rw-lock
[in]file_namefile name where lock requested
[in]lineline where requested
Returns
true if success

◆ pfs_rw_lock_x_unlock_func()

UNIV_INLINE void pfs_rw_lock_x_unlock_func ( ulint  pass,
rw_lock_t lock 
)

Performance schema instrumented wrap function for rw_lock_x_unlock_func() NOTE! Please use the corresponding macro rw_lock_x_unlock(), not directly this function!

Parameters
[in]passpass value; != 0, if the lock may have been passed to another thread to unlock
[in,out]lockrw-lock

◆ rw_lock_create_func()

void rw_lock_create_func ( rw_lock_t lock,
latch_level_t  level,
const char *  cmutex_name,
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

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.

◆ rw_lock_debug_print()

void rw_lock_debug_print ( FILE *  f,
const rw_lock_debug_t info 
)

Prints info of a debug struct.

in: debug struct

Parameters
fin: output stream

◆ rw_lock_free_func()

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

Removes an rw-lock object from the global list. The rw-lock is checked to be in the non-locked state.

◆ rw_lock_get_reader_count()

UNIV_INLINE ulint rw_lock_get_reader_count ( const rw_lock_t lock)

Returns the number of readers (s-locks).

Returns
number of readers in: rw-lock

◆ rw_lock_get_sx_lock_count()

UNIV_INLINE ulint rw_lock_get_sx_lock_count ( const rw_lock_t lock)

Returns the number of sx-lock 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

◆ rw_lock_get_waiters()

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

◆ rw_lock_get_writer()

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_X, RW_LOCK_X_WAIT, RW_LOCK_SX in: rw-lock

◆ rw_lock_get_x_lock_count()

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

◆ rw_lock_is_locked()

bool rw_lock_is_locked ( rw_lock_t lock,
ulint  lock_type 
)

Checks if somebody has locked the rw-lock in the specified mode.

Returns
true if locked in: lock type: RW_LOCK_S, RW_LOCK_X or RW_LOCK_SX
true if locked

◆ rw_lock_list_print_info()

void rw_lock_list_print_info ( FILE *  file)

Prints debug info of currently locked rw-locks.

in: file where to print

◆ rw_lock_lock_word_decr()

UNIV_INLINE bool rw_lock_lock_word_decr ( rw_lock_t lock,
ulint  amount,
lint  threshold 
)

Decrements lock_word the specified amount if it is greater than 0.

This is used by both s_lock and x_lock operations.

Parameters
[in,out]lockrw-lock
[in]amountamount to decrement
[in]thresholdthreshold of judgement
Returns
true if decr occurs

◆ rw_lock_lock_word_incr()

UNIV_INLINE lint rw_lock_lock_word_incr ( rw_lock_t lock,
ulint  amount 
)

Increments lock_word the specified amount and returns new value.

Parameters
[in,out]lockrw-lock
[in]amountamount to decrement
Returns
lock->lock_word after increment

◆ rw_lock_own()

ibool rw_lock_own ( rw_lock_t lock,
ulint  lock_type 
)

Checks if the thread has locked the rw-lock in the specified mode, with the pass value == 0.

Returns
true if locked

◆ rw_lock_own_flagged()

bool rw_lock_own_flagged ( const rw_lock_t lock,
rw_lock_flags_t  flags 
)

Checks if the thread has locked the rw-lock in the specified mode, with the pass value == 0.

Parameters
[in]lockrw-lock
[in]flagsspecify lock types with OR of the rw_lock_flag_t values
Returns
true if locked

◆ rw_lock_s_lock_func()

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 srv_n_spin_wait_rounds), waiting for the lock, before suspending the thread.

Parameters
[in]lockpointer to rw-lock
[in]passpass value; != 0, if the lock will be passed to another thread to unlock
[in]file_namefile name where lock requested
[in]lineline where requested

◆ rw_lock_s_lock_low()

UNIV_INLINE ibool rw_lock_s_lock_low ( rw_lock_t lock,
ulint  pass,
const char *  file_name,
ulint  line 
)

Low-level function which tries to lock an rw-lock in s-mode.

Performs no spinning.

Parameters
[in]lockpointer to rw-lock
[in]passpass value; != 0, if the lock will be passed to another thread to unlock
[in]file_namefile name where lock requested
[in]lineline where requested
Returns
true if success

◆ rw_lock_s_unlock_func()

UNIV_INLINE void rw_lock_s_unlock_func ( ulint  pass,
rw_lock_t lock 
)

Releases a shared mode lock.

Parameters
[in]passpass value; != 0, if the lock will be passed to another thread to unlock
[in,out]lockrw-lock

◆ rw_lock_set_writer_id_and_recursion_flag()

UNIV_INLINE void rw_lock_set_writer_id_and_recursion_flag ( rw_lock_t lock,
bool  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.

Parameters
[in,out]locklock to work on
[in]recursivetrue if recursion allowed

◆ rw_lock_sx_lock_func()

void rw_lock_sx_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 SX 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. If the same thread has an x-lock on the rw-lock, locking succeed, with the following exception: if pass != 0, only a single sx-lock may be taken on the lock. NOTE: If the same thread has an s-lock, locking does not succeed! in: line where requested

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. If the same thread has an x-lock on the rw-lock, locking succeed, with the following exception: if pass != 0, only a single sx-lock may be taken on the lock. NOTE: If the same thread has an s-lock, locking does not succeed!

◆ rw_lock_sx_lock_low()

ibool rw_lock_sx_lock_low ( rw_lock_t lock,
ulint  pass,
const char *  file_name,
ulint  line 
)

Low-level function for acquiring an sx lock.

Returns
false if did not succeed, true if success. in: line where requested
false if did not succeed, true if success.

◆ rw_lock_sx_unlock_func()

UNIV_INLINE void rw_lock_sx_unlock_func ( ulint  pass,
rw_lock_t lock 
)

Releases an sx mode lock.

Parameters
[in]passpass value; != 0, if the lock will be passed to another thread to unlock
[in,out]lockrw-lock

◆ rw_lock_validate()

bool rw_lock_validate ( const rw_lock_t lock)

Checks that the rw-lock has been initialized and that there are no simultaneous shared and exclusive locks.

Returns
true in: rw-lock
true

◆ rw_lock_x_lock_func()

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 srv_n_spin_wait_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

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 srv_n_spin_wait_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!

◆ rw_lock_x_lock_func_nowait()

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.

Parameters
[in]lockpointer to rw-lock
[in]file_namefile name where lock requested
[in]lineline where requested
Returns
true if success

◆ rw_lock_x_lock_move_ownership()

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

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.

◆ rw_lock_x_unlock_func()

UNIV_INLINE void rw_lock_x_unlock_func ( ulint  pass,
rw_lock_t lock 
)

Releases an exclusive mode lock.

Parameters
[in]passpass value; != 0, if the lock will be passed to another thread to unlock
[in,out]lockrw-lock

◆ UT_LIST_BASE_NODE_T()

typedef UT_LIST_BASE_NODE_T ( rw_lock_t  )

Variable Documentation

◆ rw_lock_list

rw_lock_list_t rw_lock_list

◆ rw_lock_list_mutex

ib_mutex_t rw_lock_list_mutex

◆ rw_lock_stats

rw_lock_stats_t rw_lock_stats

Counters for RW locks.