MySQL 8.0.40
Source Code Documentation
|
The wait array used in synchronization primitives. More...
#include "sync0arr.h"
#include <sys/types.h>
#include <time.h>
#include "lock0lock.h"
#include "os0event.h"
#include "os0file.h"
#include "srv0srv.h"
#include "sync0arr_impl.h"
#include "sync0debug.h"
#include "sync0sync.h"
Macros | |
#define | sync_array_exit(a) mutex_exit(&(a)->mutex) |
#define | sync_array_enter(a) mutex_enter(&(a)->mutex) |
Functions | |
static bool | sync_array_detect_deadlock (sync_array_t *arr, sync_cell_t *cell, size_t depth) |
Detects a deadlock of one or more threads because of waits of semaphores. More... | |
static void | sync_array_validate (sync_array_t *arr) |
Validates the integrity of the wait array. More... | |
sync_cell_t * | sync_array_get_nth_cell (sync_array_t *arr, ulint n) |
Gets the nth cell in array. More... | |
static void | sync_array_free (sync_array_t *arr) |
Frees the resources in a wait array. More... | |
static os_event_t | sync_cell_get_event (sync_cell_t *cell) |
Returns the event that the thread owning the cell waits for. More... | |
sync_cell_t * | sync_array_reserve_cell (sync_array_t *arr, void *object, ulint type, ut::Location location) |
Reserves a wait array cell for waiting for an object. More... | |
void | sync_array_free_cell (sync_array_t *arr, sync_cell_t *&cell) |
Frees the cell. More... | |
void | sync_array_detect_deadlock () |
void | sync_array_wait_event (sync_array_t *arr, sync_cell_t *&cell) |
This function should be called when a thread starts to wait on a wait array cell. More... | |
template<typename Mutex > | |
static void | sync_array_mutex_print (FILE *file, const Mutex *mutex) |
Reports info about a mutex (seen locked a moment ago) into a file. More... | |
void | sync_array_cell_print (FILE *file, const sync_cell_t *cell) |
Reports info of a wait array cell into a file. More... | |
static sync_cell_t * | sync_array_find_thread (sync_array_t *arr, std::thread::id thread) |
Looks for a cell with the given thread id. More... | |
static bool | sync_array_deadlock_step (sync_array_t *arr, std::thread::id thread, size_t depth) |
Recursion step for deadlock detection. More... | |
template<typename Mutex > | |
static bool | sync_array_detect_mutex_deadlock (const Mutex *mutex, sync_array_t *arr, sync_cell_t *cell, size_t depth) |
A helper for sync_array_detect_deadlock() to handle the case when the cell contains a thread waiting for a mutex. More... | |
template<typename F > | |
bool | sync_array_detect_rwlock_deadlock (sync_cell_t *cell, sync_array_t *arr, const size_t depth, F &&conflicts) |
static bool | sync_array_detect_deadlock_low (sync_array_t *arr, sync_cell_t *cell, size_t depth) |
static bool | sync_arr_cell_can_wake_up (sync_cell_t *cell) |
Determines if we can wake up the thread waiting for a semaphore. More... | |
void | sync_array_object_signalled () |
Increments the signalled count. More... | |
static void | sync_array_wake_threads_if_sema_free_low (sync_array_t *arr) |
If the wakeup algorithm does not work perfectly at semaphore releases, this function will do the waking (see the comment in mutex_exit). More... | |
void | sync_arr_wake_threads_if_sema_free (void) |
If the wakeup algorithm does not work perfectly at semaphore releases, this function will do the waking (see the comment in mutex_exit). More... | |
static bool | sync_array_print_long_waits_low (sync_array_t *arr, std::thread::id *waiter, const void **sema, bool *noticed) |
Prints warnings of long semaphore waits to stderr. More... | |
bool | sync_array_print_long_waits (std::thread::id *waiter, const void **sema) |
Prints warnings of long semaphore waits to stderr. More... | |
static void | sync_array_print_info_low (FILE *file, sync_array_t *arr) |
Prints info of the wait array. More... | |
static void | sync_array_print_info (FILE *file, sync_array_t *arr) |
Prints info of the wait array. More... | |
void | sync_array_init (ulint n_threads) |
Create the primary system wait array(s), they are protected by an OS mutex. More... | |
void | sync_array_close (void) |
Close sync array wait sub-system. More... | |
void | sync_array_print (FILE *file) |
Print info about the sync array(s). More... | |
Variables | |
ulong | srv_sync_array_size = 1 |
User configured sync array size. More... | |
ulint | sync_array_size |
Locally stored copy of srv_sync_array_size. More... | |
sync_array_t ** | sync_wait_array |
The global array of wait cells for implementation of the database's own mutexes and read-write locks. More... | |
static ulint | sg_count |
count of how many times an object has been signalled More... | |
The wait array used in synchronization primitives.
Created 9/5/1995 Heikki Tuuri
#define sync_array_enter | ( | a | ) | mutex_enter(&(a)->mutex) |
#define sync_array_exit | ( | a | ) | mutex_exit(&(a)->mutex) |
|
static |
Determines if we can wake up the thread waiting for a semaphore.
cell | in: cell to search |
void sync_arr_wake_threads_if_sema_free | ( | void | ) |
If the wakeup algorithm does not work perfectly at semaphore releases, this function will do the waking (see the comment in mutex_exit).
This function should be called about every 1 second in the server.
Note that there's a race condition between this thread and mutex_exit changing the lock_word and calling signal_object, so sometimes this finds threads to wake up even when nothing has gone wrong.
void sync_array_cell_print | ( | FILE * | file, |
const sync_cell_t * | cell | ||
) |
Reports info of a wait array cell into a file.
[in] | file | File where to print. |
[in] | cell | Sync array cell to report. |
void sync_array_close | ( | void | ) |
Close sync array wait sub-system.
|
static |
Recursion step for deadlock detection.
[in] | arr | The wait array we limit our search for cycle to. The caller must own the arr->mutex. |
[in] | thread | The thread which blocking other threads, which we want to find in the arr, to know if and why it's blocked, too |
[in] | depth | The recursion depth |
void sync_array_detect_deadlock | ( | ) |
|
static |
Detects a deadlock of one or more threads because of waits of semaphores.
Reports a fatal error (and thus does not return) in case it finds one. The return value is only used in recursive calls (depth>0).
[in] | arr | The wait array we limit our search for cycle to. The caller must own the arr->mutex. |
[in] | cell | The cell to check |
[in] | depth | The recursion depth |
|
static |
|
static |
A helper for sync_array_detect_deadlock() to handle the case when the cell contains a thread waiting for a mutex.
[in] | mutex | the mutex to check |
[in] | arr | wait array; NOTE! the caller must own the mutex to array |
[in] | cell | the cell which contains the mutex |
[in] | depth | recursion depth |
bool sync_array_detect_rwlock_deadlock | ( | sync_cell_t * | cell, |
sync_array_t * | arr, | ||
const size_t | depth, | ||
F && | conflicts | ||
) |
|
static |
Looks for a cell with the given thread id.
arr | in: wait array |
thread | in: thread id |
|
static |
Frees the resources in a wait array.
arr | in, own: sync wait array |
void sync_array_free_cell | ( | sync_array_t * | arr, |
sync_cell_t *& | cell | ||
) |
Frees the cell.
NOTE! sync_array_wait_event frees the cell automatically!
arr | in: wait array |
cell | in/out: the cell in the array |
sync_cell_t * sync_array_get_nth_cell | ( | sync_array_t * | arr, |
ulint | n | ||
) |
Gets the nth cell in array.
[in] | arr | Sync array to get cell from. |
[in] | n | Index of cell to retrieve. |
void sync_array_init | ( | ulint | n_threads | ) |
Create the primary system wait array(s), they are protected by an OS mutex.
in: Number of slots to create
n_threads | in: Number of slots to create in all arrays |
|
static |
Reports info about a mutex (seen locked a moment ago) into a file.
[in] | file | File where to print. |
[in] | mutex | The mutex to describe. |
void sync_array_object_signalled | ( | ) |
Increments the signalled count.
Note that one of the wait objects was signalled.
void sync_array_print | ( | FILE * | file | ) |
Print info about the sync array(s).
Prints info of the wait array.
file | in/out: Print to this stream |
|
static |
Prints info of the wait array.
file | in: file where to print |
arr | in: wait array |
|
static |
Prints info of the wait array.
file | in: file where to print |
arr | in: wait array |
bool sync_array_print_long_waits | ( | std::thread::id * | waiter, |
const void ** | sema | ||
) |
Prints warnings of long semaphore waits to stderr.
waiter | out: longest waiting thread |
sema | out: longest-waited-for semaphore |
|
static |
Prints warnings of long semaphore waits to stderr.
arr | in: sync array instance |
waiter | out: longest waiting thread |
sema | out: longest-waited-for semaphore |
noticed | out: true if long wait noticed |
sync_cell_t * sync_array_reserve_cell | ( | sync_array_t * | arr, |
void * | object, | ||
ulint | type, | ||
ut::Location | location | ||
) |
Reserves a wait array cell for waiting for an object.
The event of the cell is reset to nonsignalled state.
[in] | arr | wait array |
[in] | object | pointer to the object to wait for |
[in] | type | lock request type |
[in] | location | location where requested |
|
static |
Validates the integrity of the wait array.
Checks that the number of reserved cells equals the count variable.
arr | in: sync wait array |
void sync_array_wait_event | ( | sync_array_t * | arr, |
sync_cell_t *& | cell | ||
) |
This function should be called when a thread starts to wait on a wait array cell.
In the debug version this function checks if the wait for a semaphore will result in a deadlock, in which case prints info and asserts.
arr | in: wait array |
cell | in: index of the reserved cell |
|
static |
If the wakeup algorithm does not work perfectly at semaphore releases, this function will do the waking (see the comment in mutex_exit).
This function should be called about every 1 second in the server.
Note that there's a race condition between this thread and mutex_exit changing the lock_word and calling signal_object, so sometimes this finds threads to wake up even when nothing has gone wrong.
|
static |
Returns the event that the thread owning the cell waits for.
cell | in: non-empty sync array cell |
|
static |
count of how many times an object has been signalled
ulong srv_sync_array_size = 1 |
User configured sync array size.
ulint sync_array_size |
Locally stored copy of srv_sync_array_size.
sync_array_t** sync_wait_array |
The global array of wait cells for implementation of the database's own mutexes and read-write locks.