mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
5c85a9388a
This is a performance improvement fix. Removed the "volatile" property of PFS_events_waits::m_wait_class. Simplified the code accordingly.
185 lines
5 KiB
C
185 lines
5 KiB
C
/* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; version 2 of the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software Foundation,
|
|
51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */
|
|
|
|
#ifndef PFS_EVENTS_WAITS_H
|
|
#define PFS_EVENTS_WAITS_H
|
|
|
|
/**
|
|
@file storage/perfschema/pfs_events_waits.h
|
|
Events waits data structures (declarations).
|
|
*/
|
|
|
|
#include "pfs_column_types.h"
|
|
#include "pfs_lock.h"
|
|
|
|
struct PFS_mutex;
|
|
struct PFS_rwlock;
|
|
struct PFS_cond;
|
|
struct PFS_table;
|
|
struct PFS_file;
|
|
struct PFS_thread;
|
|
struct PFS_instr_class;
|
|
|
|
/** Class of a wait event. */
|
|
enum events_waits_class
|
|
{
|
|
NO_WAIT_CLASS= 0,
|
|
WAIT_CLASS_MUTEX,
|
|
WAIT_CLASS_RWLOCK,
|
|
WAIT_CLASS_COND,
|
|
WAIT_CLASS_TABLE,
|
|
WAIT_CLASS_FILE
|
|
};
|
|
|
|
/** State of a timer. */
|
|
enum timer_state
|
|
{
|
|
/**
|
|
Not timed.
|
|
In this state, TIMER_START, TIMER_END and TIMER_WAIT are NULL.
|
|
*/
|
|
TIMER_STATE_UNTIMED,
|
|
/**
|
|
About to start.
|
|
In this state, TIMER_START, TIMER_END and TIMER_WAIT are NULL.
|
|
*/
|
|
TIMER_STATE_STARTING,
|
|
/**
|
|
Started, but not yet ended.
|
|
In this state, TIMER_START has a value, TIMER_END and TIMER_WAIT are NULL.
|
|
*/
|
|
TIMER_STATE_STARTED,
|
|
/**
|
|
Ended.
|
|
In this state, TIMER_START, TIMER_END and TIMER_WAIT have a value.
|
|
*/
|
|
TIMER_STATE_TIMED
|
|
};
|
|
|
|
/** Target object a wait event is waiting on. */
|
|
union events_waits_target
|
|
{
|
|
/** Mutex waited on. */
|
|
PFS_mutex *m_mutex;
|
|
/** RWLock waited on. */
|
|
PFS_rwlock *m_rwlock;
|
|
/** Condition waited on. */
|
|
PFS_cond *m_cond;
|
|
/** Table waited on. */
|
|
PFS_table *m_table;
|
|
/** File waited on. */
|
|
PFS_file *m_file;
|
|
};
|
|
|
|
/** A wait event record. */
|
|
struct PFS_events_waits
|
|
{
|
|
/**
|
|
The type of wait.
|
|
Readers:
|
|
- the consumer threads.
|
|
Writers:
|
|
- the producer threads, in the instrumentation.
|
|
Out of bound Writers:
|
|
- TRUNCATE EVENTS_WAITS_CURRENT
|
|
- TRUNCATE EVENTS_WAITS_HISTORY
|
|
- TRUNCATE EVENTS_WAITS_HISTORY_LONG
|
|
*/
|
|
events_waits_class m_wait_class;
|
|
/** Executing thread. */
|
|
PFS_thread *m_thread;
|
|
/** Instrument metadata. */
|
|
PFS_instr_class *m_class;
|
|
/** Timer state. */
|
|
enum timer_state m_timer_state;
|
|
/** Event id. */
|
|
ulonglong m_event_id;
|
|
/**
|
|
Timer start.
|
|
This member is populated only if m_timed is true.
|
|
*/
|
|
ulonglong m_timer_start;
|
|
/**
|
|
Timer end.
|
|
This member is populated only if m_timed is true.
|
|
*/
|
|
ulonglong m_timer_end;
|
|
/** Schema name. */
|
|
const char *m_schema_name;
|
|
/** Length in bytes of @c m_schema_name. */
|
|
uint m_schema_name_length;
|
|
/** Object name. */
|
|
const char *m_object_name;
|
|
/** Length in bytes of @c m_object_name. */
|
|
uint m_object_name_length;
|
|
/** Address in memory of the object instance waited on. */
|
|
const void *m_object_instance_addr;
|
|
/** Location of the instrumentation in the source code (file name). */
|
|
const char *m_source_file;
|
|
/** Location of the instrumentation in the source code (line number). */
|
|
uint m_source_line;
|
|
/** Operation performed. */
|
|
enum_operation_type m_operation;
|
|
/**
|
|
Number of bytes read/written.
|
|
This member is populated for file READ/WRITE operations only.
|
|
*/
|
|
size_t m_number_of_bytes;
|
|
};
|
|
|
|
/**
|
|
A wait locker.
|
|
A locker is a transient helper structure used by the instrumentation
|
|
during the recording of a wait.
|
|
*/
|
|
struct PFS_wait_locker
|
|
{
|
|
/** The timer used to measure the wait. */
|
|
enum_timer_name m_timer_name;
|
|
/** The object waited on. */
|
|
events_waits_target m_target;
|
|
/** The wait data recorded. */
|
|
PFS_events_waits m_waits_current;
|
|
};
|
|
|
|
void insert_events_waits_history(PFS_thread *thread, PFS_events_waits *wait);
|
|
|
|
void insert_events_waits_history_long(PFS_events_waits *wait);
|
|
|
|
extern bool flag_events_waits_current;
|
|
extern bool flag_events_waits_history;
|
|
extern bool flag_events_waits_history_long;
|
|
extern bool flag_events_waits_summary_by_thread_by_event_name;
|
|
extern bool flag_events_waits_summary_by_event_name;
|
|
extern bool flag_events_waits_summary_by_instance;
|
|
extern bool flag_events_locks_summary_by_thread_by_name;
|
|
extern bool flag_events_locks_summary_by_event_name;
|
|
extern bool flag_events_locks_summary_by_instance;
|
|
extern bool flag_file_summary_by_event_name;
|
|
extern bool flag_file_summary_by_instance;
|
|
extern bool events_waits_history_long_full;
|
|
extern volatile uint32 events_waits_history_long_index;
|
|
extern PFS_events_waits *events_waits_history_long_array;
|
|
extern ulong events_waits_history_long_size;
|
|
|
|
int init_events_waits_history_long(uint events_waits_history_long_sizing);
|
|
void cleanup_events_waits_history_long();
|
|
|
|
void reset_events_waits_current();
|
|
void reset_events_waits_history();
|
|
void reset_events_waits_history_long();
|
|
|
|
#endif
|
|
|