| 1 | /* Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. | 
| 2 |    Copyright (c) 2017, MariaDB Corporation. | 
| 3 |  | 
| 4 |   This program is free software; you can redistribute it and/or modify | 
| 5 |   it under the terms of the GNU General Public License as published by | 
| 6 |   the Free Software Foundation; version 2 of the License. | 
| 7 |  | 
| 8 |   This program is distributed in the hope that it will be useful, | 
| 9 |   but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 10 |   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
| 11 |   GNU General Public License for more details. | 
| 12 |  | 
| 13 |   You should have received a copy of the GNU General Public License | 
| 14 |   along with this program; if not, write to the Free Software Foundation, | 
| 15 |   51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */ | 
| 16 |  | 
| 17 | #ifndef PFS_EVENTS_WAITS_H | 
| 18 | #define PFS_EVENTS_WAITS_H | 
| 19 |  | 
| 20 | /** | 
| 21 |   @file storage/perfschema/pfs_events_waits.h | 
| 22 |   Events waits data structures (declarations). | 
| 23 | */ | 
| 24 |  | 
| 25 | #include "pfs_column_types.h" | 
| 26 | #include "pfs_lock.h" | 
| 27 | #include "pfs_events.h" | 
| 28 |  | 
| 29 | struct PFS_mutex; | 
| 30 | struct PFS_rwlock; | 
| 31 | struct PFS_cond; | 
| 32 | struct PFS_table; | 
| 33 | struct PFS_file; | 
| 34 | struct PFS_thread; | 
| 35 | struct PFS_socket; | 
| 36 | struct PFS_instr_class; | 
| 37 | struct PFS_table_share; | 
| 38 | struct PFS_account; | 
| 39 | struct PFS_user; | 
| 40 | struct PFS_host; | 
| 41 |  | 
| 42 | /** Class of a wait event. */ | 
| 43 | enum events_waits_class | 
| 44 | { | 
| 45 |   NO_WAIT_CLASS= 0, | 
| 46 |   WAIT_CLASS_MUTEX, | 
| 47 |   WAIT_CLASS_RWLOCK, | 
| 48 |   WAIT_CLASS_COND, | 
| 49 |   WAIT_CLASS_TABLE, | 
| 50 |   WAIT_CLASS_FILE, | 
| 51 |   WAIT_CLASS_SOCKET, | 
| 52 |   WAIT_CLASS_IDLE | 
| 53 | }; | 
| 54 |  | 
| 55 | /** A wait event record. */ | 
| 56 | struct PFS_events_waits : public PFS_events | 
| 57 | { | 
| 58 |   /** | 
| 59 |     The type of wait. | 
| 60 |     Readers: | 
| 61 |     - the consumer threads. | 
| 62 |     Writers: | 
| 63 |     - the producer threads, in the instrumentation. | 
| 64 |     Out of bound Writers: | 
| 65 |     - TRUNCATE EVENTS_WAITS_CURRENT | 
| 66 |     - TRUNCATE EVENTS_WAITS_HISTORY | 
| 67 |     - TRUNCATE EVENTS_WAITS_HISTORY_LONG | 
| 68 |   */ | 
| 69 |   events_waits_class m_wait_class; | 
| 70 |   /** Executing thread. */ | 
| 71 |   PFS_thread *m_thread; | 
| 72 |   /** Object type */ | 
| 73 |   enum_object_type m_object_type; | 
| 74 |   /** Table share, for table operations only. */ | 
| 75 |   PFS_table_share *m_weak_table_share; | 
| 76 |   /** File, for file operations only. */ | 
| 77 |   PFS_file *m_weak_file; | 
| 78 |   /** Socket, for socket operations only. */ | 
| 79 |   PFS_socket *m_weak_socket; | 
| 80 |   /** For weak pointers, target object version. */ | 
| 81 |   uint32 m_weak_version; | 
| 82 |   /** Address in memory of the object instance waited on. */ | 
| 83 |   const void *m_object_instance_addr; | 
| 84 |   /** Operation performed. */ | 
| 85 |   enum_operation_type m_operation; | 
| 86 |   /** | 
| 87 |     Number of bytes read/written. | 
| 88 |     This member is populated for file READ/WRITE operations only. | 
| 89 |   */ | 
| 90 |   size_t m_number_of_bytes; | 
| 91 |   /** | 
| 92 |     Index used. | 
| 93 |     This member is populated for TABLE IO operations only. | 
| 94 |   */ | 
| 95 |   uint m_index; | 
| 96 |   /** Flags */ | 
| 97 |   ulong m_flags; | 
| 98 | }; | 
| 99 |  | 
| 100 | /** TIMED bit in the state flags bitfield. */ | 
| 101 | #define STATE_FLAG_TIMED (1U<<0) | 
| 102 | /** THREAD bit in the state flags bitfield. */ | 
| 103 | #define STATE_FLAG_THREAD (1U<<1) | 
| 104 | /** EVENT bit in the state flags bitfield. */ | 
| 105 | #define STATE_FLAG_EVENT (1U<<2) | 
| 106 | /** DIGEST bit in the state flags bitfield. */ | 
| 107 | #define STATE_FLAG_DIGEST (1U<<3) | 
| 108 |  | 
| 109 | void insert_events_waits_history(PFS_thread *thread, PFS_events_waits *wait); | 
| 110 |  | 
| 111 | void insert_events_waits_history_long(PFS_events_waits *wait); | 
| 112 |  | 
| 113 | extern bool flag_events_waits_current; | 
| 114 | extern bool flag_events_waits_history; | 
| 115 | extern bool flag_events_waits_history_long; | 
| 116 | extern bool flag_global_instrumentation; | 
| 117 | extern bool flag_thread_instrumentation; | 
| 118 |  | 
| 119 | extern bool events_waits_history_long_full; | 
| 120 | extern volatile uint32 events_waits_history_long_index; | 
| 121 | extern PFS_events_waits *events_waits_history_long_array; | 
| 122 | extern ulong events_waits_history_long_size; | 
| 123 |  | 
| 124 | int init_events_waits_history_long(uint events_waits_history_long_sizing); | 
| 125 | void cleanup_events_waits_history_long(); | 
| 126 |  | 
| 127 | void reset_events_waits_current(); | 
| 128 | void reset_events_waits_history(); | 
| 129 | void reset_events_waits_history_long(); | 
| 130 | void reset_events_waits_by_thread(); | 
| 131 | void reset_events_waits_by_account(); | 
| 132 | void reset_events_waits_by_user(); | 
| 133 | void reset_events_waits_by_host(); | 
| 134 | void reset_events_waits_global(); | 
| 135 | void aggregate_account_waits(PFS_account *account); | 
| 136 | void aggregate_user_waits(PFS_user *user); | 
| 137 | void aggregate_host_waits(PFS_host *host); | 
| 138 |  | 
| 139 | void reset_table_waits_by_table(); | 
| 140 | void reset_table_io_waits_by_table(); | 
| 141 | void reset_table_lock_waits_by_table(); | 
| 142 | void reset_table_waits_by_table_handle(); | 
| 143 | void reset_table_io_waits_by_table_handle(); | 
| 144 | void reset_table_lock_waits_by_table_handle(); | 
| 145 |  | 
| 146 | #endif | 
| 147 |  | 
| 148 |  |