1 /* Copyright (c) 2010, 2021, Oracle and/or its affiliates. 2 3 This program is free software; you can redistribute it and/or modify 4 it under the terms of the GNU General Public License, version 2.0, 5 as published by the Free Software Foundation. 6 7 This program is also distributed with certain software (including 8 but not limited to OpenSSL) that is licensed under separate terms, 9 as designated in a particular file or component or in included license 10 documentation. The authors of MySQL hereby grant you an additional 11 permission to link the program and your derivative works with the 12 separately licensed software that they have included with MySQL. 13 14 This program is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License, version 2.0, for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with this program; if not, write to the Free Software Foundation, 21 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */ 22 23 #ifndef PFS_VISITOR_H 24 #define PFS_VISITOR_H 25 26 #include "pfs_stat.h" 27 28 typedef struct system_status_var STATUS_VAR; 29 30 /** 31 @file storage/perfschema/pfs_visitor.h 32 Visitors (declarations). 33 */ 34 35 /** 36 @addtogroup Performance_schema_buffers 37 @{ 38 */ 39 40 struct PFS_user; 41 struct PFS_account; 42 struct PFS_host; 43 struct PFS_thread; 44 struct PFS_instr_class; 45 struct PFS_mutex_class; 46 struct PFS_rwlock_class; 47 struct PFS_cond_class; 48 struct PFS_file_class; 49 struct PFS_socket_class; 50 struct PFS_memory_class; 51 struct PFS_table_share; 52 struct PFS_mutex; 53 struct PFS_rwlock; 54 struct PFS_cond; 55 struct PFS_file; 56 struct PFS_table; 57 struct PFS_stage_class; 58 struct PFS_statement_class; 59 struct PFS_transaction_class; 60 struct PFS_socket; 61 struct PFS_connection_slice; 62 63 /** 64 Interface class to visit groups of connections. 65 @sa PFS_connection_iterator 66 */ 67 class PFS_connection_visitor 68 { 69 public: PFS_connection_visitor()70 PFS_connection_visitor() {} ~PFS_connection_visitor()71 virtual ~PFS_connection_visitor() {} 72 /** Visit all connections. */ visit_global()73 virtual void visit_global() {} 74 /** Visit all connections of a host. */ visit_host(PFS_host * pfs)75 virtual void visit_host(PFS_host *pfs) {} 76 /** Visit all connections of a user+host. */ visit_account(PFS_account * pfs)77 virtual void visit_account(PFS_account *pfs) {} 78 /** Visit all connections of a user. */ visit_user(PFS_user * pfs)79 virtual void visit_user(PFS_user *pfs) {} 80 /** Visit a thread. */ visit_thread(PFS_thread * pfs)81 virtual void visit_thread(PFS_thread *pfs) {} 82 /** Visit a THD associated with a thread. */ visit_THD(THD * thd)83 virtual void visit_THD(THD *thd) {} 84 }; 85 86 /** 87 Iterator over groups of connections. 88 @sa PFS_connection_visitor 89 */ 90 class PFS_connection_iterator 91 { 92 public: 93 /** 94 Visit all connections. 95 @param with_hosts when true, visit also all hosts. 96 @param with_users when true, visit also all users. 97 @param with_accounts when true, visit also all user+host. 98 @param with_threads when true, visit also all threads. 99 @param with_THDs when true, visit also all threads THD. 100 @param visitor the visitor to call 101 */ 102 static void visit_global(bool with_hosts, bool with_users, 103 bool with_accounts, bool with_threads, 104 bool with_THDs, 105 PFS_connection_visitor *visitor); 106 /** 107 Visit all connections of a host. 108 @param host the host to visit. 109 @param with_accounts when true, visit also all related user+host. 110 @param with_threads when true, visit also all related threads. 111 @param with_THDs when true, visit also all related threads THD. 112 @param visitor the visitor to call 113 */ 114 static void visit_host(PFS_host *host, bool with_accounts, bool with_threads, 115 bool with_THDs, 116 PFS_connection_visitor *visitor); 117 /** 118 Visit all connections of a user. 119 @param user the user to visit. 120 @param with_accounts when true, visit also all related user+host. 121 @param with_threads when true, visit also all related threads. 122 @param with_THDs when true, visit also all related threads THD. 123 @param visitor the visitor to call 124 */ 125 static void visit_user(PFS_user *user, bool with_accounts, bool with_threads, 126 bool with_THDs, 127 PFS_connection_visitor *visitor); 128 /** 129 Visit all connections of a user+host. 130 @param account the user+host to visit. 131 @param with_threads when true, visit also all related threads. 132 @param with_THDs when true, visit also all related threads THD. 133 @param visitor the visitor to call 134 */ 135 static void visit_account(PFS_account *account, bool with_threads, 136 bool with_THDs, 137 PFS_connection_visitor *visitor); 138 /** 139 Visit a thread or connection. 140 @param thread the thread to visit. 141 @param visitor the visitor to call 142 */ visit_thread(PFS_thread * thread,PFS_connection_visitor * visitor)143 static inline void visit_thread(PFS_thread *thread, 144 PFS_connection_visitor *visitor) 145 { visitor->visit_thread(thread); } 146 147 /** 148 Visit THD. 149 @param thd the THD to visit. 150 @param visitor the visitor to call. 151 */ 152 static void visit_THD(THD *thd, PFS_connection_visitor *visitor); 153 }; 154 155 /** 156 Interface class to visit groups of instrumentation point instances. 157 @sa PFS_instance_iterator 158 */ 159 class PFS_instance_visitor 160 { 161 public: PFS_instance_visitor()162 PFS_instance_visitor() {} ~PFS_instance_visitor()163 virtual ~PFS_instance_visitor() {} 164 /** Visit a mutex class. */ visit_mutex_class(PFS_mutex_class * pfs)165 virtual void visit_mutex_class(PFS_mutex_class *pfs) {} 166 /** Visit a rwlock class. */ visit_rwlock_class(PFS_rwlock_class * pfs)167 virtual void visit_rwlock_class(PFS_rwlock_class *pfs) {} 168 /** Visit a cond class. */ visit_cond_class(PFS_cond_class * pfs)169 virtual void visit_cond_class(PFS_cond_class *pfs) {} 170 /** Visit a file class. */ visit_file_class(PFS_file_class * pfs)171 virtual void visit_file_class(PFS_file_class *pfs) {} 172 /** Visit a socket class. */ visit_socket_class(PFS_socket_class * pfs)173 virtual void visit_socket_class(PFS_socket_class *pfs) {} 174 /** Visit a mutex instance. */ visit_mutex(PFS_mutex * pfs)175 virtual void visit_mutex(PFS_mutex *pfs) {} 176 /** Visit a rwlock instance. */ visit_rwlock(PFS_rwlock * pfs)177 virtual void visit_rwlock(PFS_rwlock *pfs) {} 178 /** Visit a cond instance. */ visit_cond(PFS_cond * pfs)179 virtual void visit_cond(PFS_cond *pfs) {} 180 /** Visit a file instance. */ visit_file(PFS_file * pfs)181 virtual void visit_file(PFS_file *pfs) {} 182 /** Visit a socket instance. */ visit_socket(PFS_socket * pfs)183 virtual void visit_socket(PFS_socket *pfs) {} 184 }; 185 186 /** 187 Iterator over groups of instrumentation point instances. 188 @sa PFS_instance_visitor 189 */ 190 class PFS_instance_iterator 191 { 192 public: 193 static void visit_all(PFS_instance_visitor *visitor); 194 static void visit_all_mutex(PFS_instance_visitor *visitor); 195 static void visit_all_mutex_classes(PFS_instance_visitor *visitor); 196 static void visit_all_mutex_instances(PFS_instance_visitor *visitor); 197 static void visit_all_rwlock(PFS_instance_visitor *visitor); 198 static void visit_all_rwlock_classes(PFS_instance_visitor *visitor); 199 static void visit_all_rwlock_instances(PFS_instance_visitor *visitor); 200 static void visit_all_cond(PFS_instance_visitor *visitor); 201 static void visit_all_cond_classes(PFS_instance_visitor *visitor); 202 static void visit_all_cond_instances(PFS_instance_visitor *visitor); 203 static void visit_all_file(PFS_instance_visitor *visitor); 204 static void visit_all_file_classes(PFS_instance_visitor *visitor); 205 static void visit_all_file_instances(PFS_instance_visitor *visitor); 206 207 /** 208 Visit a mutex class and related instances. 209 @param klass the klass to visit. 210 @param visitor the visitor to call 211 */ 212 static void visit_mutex_instances(PFS_mutex_class *klass, 213 PFS_instance_visitor *visitor); 214 /** 215 Visit a rwlock class and related instances. 216 @param klass the klass to visit. 217 @param visitor the visitor to call 218 */ 219 static void visit_rwlock_instances(PFS_rwlock_class *klass, 220 PFS_instance_visitor *visitor); 221 /** 222 Visit a cond class and related instances. 223 @param klass the klass to visit. 224 @param visitor the visitor to call 225 */ 226 static void visit_cond_instances(PFS_cond_class *klass, 227 PFS_instance_visitor *visitor); 228 /** 229 Visit a file class and related instances. 230 @param klass the klass to visit. 231 @param visitor the visitor to call 232 */ 233 static void visit_file_instances(PFS_file_class *klass, 234 PFS_instance_visitor *visitor); 235 /** 236 Visit a socket class and related instances. 237 @param klass the klass to visit. 238 @param visitor the visitor to call 239 */ 240 static void visit_socket_instances(PFS_socket_class *klass, 241 PFS_instance_visitor *visitor); 242 /** 243 Visit a socket class and related instances. 244 @param klass the klass to visit. 245 @param visitor the visitor to call 246 @param thread the owning thread to match 247 @param visit_class if true then visit the socket class 248 */ 249 static void visit_socket_instances(PFS_socket_class *klass, 250 PFS_instance_visitor *visitor, 251 PFS_thread *thread, 252 bool visit_class= true); 253 /** 254 Visit an instrument class and related instances. 255 @param klass the klass to visit. 256 @param visitor the visitor to call 257 @param thread comparison criteria 258 @param visit_class if true then visit the class 259 */ 260 static void visit_instances(PFS_instr_class *klass, 261 PFS_instance_visitor *visitor, 262 PFS_thread *thread, 263 bool visit_class= true); 264 }; 265 266 /** 267 Interface class to visit groups of SQL objects. 268 @sa PFS_object_iterator 269 */ 270 class PFS_object_visitor 271 { 272 public: PFS_object_visitor()273 PFS_object_visitor() {} ~PFS_object_visitor()274 virtual ~PFS_object_visitor() {} 275 /** Visit global data. */ visit_global()276 virtual void visit_global() {} 277 /** Visit a table share. */ visit_table_share(PFS_table_share * pfs)278 virtual void visit_table_share(PFS_table_share *pfs) {} 279 /** Visit a table share index. */ visit_table_share_index(PFS_table_share * pfs,uint index)280 virtual void visit_table_share_index(PFS_table_share *pfs, uint index) {} 281 /** Visit a table. */ visit_table(PFS_table * pfs)282 virtual void visit_table(PFS_table *pfs) {} 283 /** Visit a table index. */ visit_table_index(PFS_table * pfs,uint index)284 virtual void visit_table_index(PFS_table *pfs, uint index) {} 285 }; 286 287 /** 288 Iterator over groups of SQL objects. 289 @sa PFS_object_visitor 290 */ 291 class PFS_object_iterator 292 { 293 public: 294 /** Visit all objects. */ 295 static void visit_all(PFS_object_visitor *visitor); 296 /** Visit all tables and related handles. */ 297 static void visit_all_tables(PFS_object_visitor *visitor); 298 /** Visit a table and related table handles. */ 299 static void visit_tables(PFS_table_share *share, 300 PFS_object_visitor *visitor); 301 /** Visit a table index and related table handles indexes. */ 302 static void visit_table_indexes(PFS_table_share *share, 303 uint index, 304 PFS_object_visitor *visitor); 305 }; 306 307 /** 308 A concrete connection visitor that aggregates 309 wait statistics for a given event_name. 310 */ 311 class PFS_connection_wait_visitor : public PFS_connection_visitor 312 { 313 public: 314 /** Constructor. */ 315 PFS_connection_wait_visitor(PFS_instr_class *klass); 316 virtual ~PFS_connection_wait_visitor(); 317 virtual void visit_global(); 318 virtual void visit_host(PFS_host *pfs); 319 virtual void visit_account(PFS_account *pfs); 320 virtual void visit_user(PFS_user *pfs); 321 virtual void visit_thread(PFS_thread *pfs); 322 323 /** EVENT_NAME instrument index. */ 324 uint m_index; 325 /** Wait statistic collected. */ 326 PFS_single_stat m_stat; 327 }; 328 329 /** 330 A concrete connection visitor that aggregates 331 wait statistics for all events. 332 */ 333 class PFS_connection_all_wait_visitor : public PFS_connection_visitor 334 { 335 public: 336 /** Constructor. */ 337 PFS_connection_all_wait_visitor(); 338 virtual ~PFS_connection_all_wait_visitor(); 339 virtual void visit_global(); 340 virtual void visit_host(PFS_host *pfs); 341 virtual void visit_account(PFS_account *pfs); 342 virtual void visit_user(PFS_user *pfs); 343 virtual void visit_thread(PFS_thread *pfs); 344 345 /** Wait statistic collected. */ 346 PFS_single_stat m_stat; 347 348 private: 349 void visit_connection_slice(PFS_connection_slice *pfs); 350 }; 351 352 /** 353 A concrete connection visitor that aggregates 354 stage statistics. 355 */ 356 class PFS_connection_stage_visitor : public PFS_connection_visitor 357 { 358 public: 359 /** Constructor. */ 360 PFS_connection_stage_visitor(PFS_stage_class *klass); 361 virtual ~PFS_connection_stage_visitor(); 362 virtual void visit_global(); 363 virtual void visit_host(PFS_host *pfs); 364 virtual void visit_account(PFS_account *pfs); 365 virtual void visit_user(PFS_user *pfs); 366 virtual void visit_thread(PFS_thread *pfs); 367 368 /** EVENT_NAME instrument index. */ 369 uint m_index; 370 /** Stage statistic collected. */ 371 PFS_stage_stat m_stat; 372 }; 373 374 /** 375 A concrete connection visitor that aggregates 376 statement statistics for a given event_name. 377 */ 378 class PFS_connection_statement_visitor : public PFS_connection_visitor 379 { 380 public: 381 /** Constructor. */ 382 PFS_connection_statement_visitor(PFS_statement_class *klass); 383 virtual ~PFS_connection_statement_visitor(); 384 virtual void visit_global(); 385 virtual void visit_host(PFS_host *pfs); 386 virtual void visit_account(PFS_account *pfs); 387 virtual void visit_user(PFS_user *pfs); 388 virtual void visit_thread(PFS_thread *pfs); 389 390 /** EVENT_NAME instrument index. */ 391 uint m_index; 392 /** Statement statistic collected. */ 393 PFS_statement_stat m_stat; 394 }; 395 396 /** 397 A concrete connection visitor that aggregates 398 statement statistics for all events. 399 */ 400 class PFS_connection_all_statement_visitor : public PFS_connection_visitor 401 { 402 public: 403 /** Constructor. */ 404 PFS_connection_all_statement_visitor(); 405 virtual ~PFS_connection_all_statement_visitor(); 406 virtual void visit_global(); 407 virtual void visit_host(PFS_host *pfs); 408 virtual void visit_account(PFS_account *pfs); 409 virtual void visit_user(PFS_user *pfs); 410 virtual void visit_thread(PFS_thread *pfs); 411 412 /** Statement statistic collected. */ 413 PFS_statement_stat m_stat; 414 415 private: 416 void visit_connection_slice(PFS_connection_slice *pfs); 417 }; 418 419 /** 420 A concrete connection visitor that aggregates 421 transaction statistics for a given event_name. 422 */ 423 class PFS_connection_transaction_visitor : public PFS_connection_visitor 424 { 425 public: 426 /** Constructor. */ 427 PFS_connection_transaction_visitor(PFS_transaction_class *klass); 428 virtual ~PFS_connection_transaction_visitor(); 429 virtual void visit_global(); 430 virtual void visit_host(PFS_host *pfs); 431 virtual void visit_account(PFS_account *pfs); 432 virtual void visit_user(PFS_user *pfs); 433 virtual void visit_thread(PFS_thread *pfs); 434 435 /** EVENT_NAME instrument index. */ 436 uint m_index; 437 /** Statement statistic collected. */ 438 PFS_transaction_stat m_stat; 439 }; 440 441 /** Disabled pending code review */ 442 #if 0 443 /** 444 A concrete connection visitor that aggregates 445 transaction statistics for all events. 446 */ 447 class PFS_connection_all_transaction_visitor : public PFS_connection_visitor 448 { 449 public: 450 /** Constructor. */ 451 PFS_connection_all_transaction_visitor(); 452 virtual ~PFS_connection_all_transaction_visitor(); 453 virtual void visit_global(); 454 virtual void visit_host(PFS_host *pfs); 455 virtual void visit_account(PFS_account *pfs); 456 virtual void visit_user(PFS_user *pfs); 457 virtual void visit_thread(PFS_thread *pfs); 458 459 /** Statement statistic collected. */ 460 PFS_transaction_stat m_stat; 461 462 private: 463 void visit_connection_slice(PFS_connection_slice *pfs); 464 }; 465 #endif 466 467 /** 468 A concrete connection visitor that aggregates 469 connection statistics. 470 */ 471 class PFS_connection_stat_visitor : public PFS_connection_visitor 472 { 473 public: 474 /** Constructor. */ 475 PFS_connection_stat_visitor(); 476 virtual ~PFS_connection_stat_visitor(); 477 virtual void visit_global(); 478 virtual void visit_host(PFS_host *pfs); 479 virtual void visit_account(PFS_account *pfs); 480 virtual void visit_user(PFS_user *pfs); 481 virtual void visit_thread(PFS_thread *pfs); 482 483 /** Connection statistic collected. */ 484 PFS_connection_stat m_stat; 485 }; 486 487 /** 488 A concrete connection visitor that aggregates 489 memory statistics for a given event_name. 490 */ 491 class PFS_connection_memory_visitor : public PFS_connection_visitor 492 { 493 public: 494 /** Constructor. */ 495 PFS_connection_memory_visitor(PFS_memory_class *klass); 496 virtual ~PFS_connection_memory_visitor(); 497 virtual void visit_global(); 498 virtual void visit_host(PFS_host *pfs); 499 virtual void visit_account(PFS_account *pfs); 500 virtual void visit_user(PFS_user *pfs); 501 virtual void visit_thread(PFS_thread *pfs); 502 503 /** EVENT_NAME instrument index. */ 504 uint m_index; 505 /** Statement statistic collected. */ 506 PFS_memory_stat m_stat; 507 }; 508 509 /** 510 A concrete connection visitor that aggregates 511 status variables. 512 */ 513 class PFS_connection_status_visitor : public PFS_connection_visitor 514 { 515 public: 516 /** Constructor. */ 517 PFS_connection_status_visitor(STATUS_VAR *status_vars); 518 virtual ~PFS_connection_status_visitor(); 519 virtual void visit_global(); 520 virtual void visit_host(PFS_host *pfs); 521 virtual void visit_account(PFS_account *pfs); 522 virtual void visit_user(PFS_user *pfs); 523 virtual void visit_thread(PFS_thread *pfs); 524 virtual void visit_THD(THD *thd); 525 526 private: 527 STATUS_VAR *m_status_vars; 528 }; 529 530 /** 531 A concrete instance visitor that aggregates 532 wait statistics. 533 */ 534 class PFS_instance_wait_visitor : public PFS_instance_visitor 535 { 536 public: 537 PFS_instance_wait_visitor(); 538 virtual ~PFS_instance_wait_visitor(); 539 virtual void visit_mutex_class(PFS_mutex_class *pfs); 540 virtual void visit_rwlock_class(PFS_rwlock_class *pfs); 541 virtual void visit_cond_class(PFS_cond_class *pfs); 542 virtual void visit_file_class(PFS_file_class *pfs); 543 virtual void visit_socket_class(PFS_socket_class *pfs); 544 virtual void visit_mutex(PFS_mutex *pfs); 545 virtual void visit_rwlock(PFS_rwlock *pfs); 546 virtual void visit_cond(PFS_cond *pfs); 547 virtual void visit_file(PFS_file *pfs); 548 virtual void visit_socket(PFS_socket *pfs); 549 550 /** Wait statistic collected. */ 551 PFS_single_stat m_stat; 552 }; 553 554 /** 555 A concrete object visitor that aggregates 556 object wait statistics. 557 */ 558 class PFS_object_wait_visitor : public PFS_object_visitor 559 { 560 public: 561 PFS_object_wait_visitor(); 562 virtual ~PFS_object_wait_visitor(); 563 virtual void visit_global(); 564 virtual void visit_table_share(PFS_table_share *pfs); 565 virtual void visit_table(PFS_table *pfs); 566 567 /** Object wait statistic collected. */ 568 PFS_single_stat m_stat; 569 }; 570 571 /** 572 A concrete object visitor that aggregates 573 table io wait statistics. 574 */ 575 class PFS_table_io_wait_visitor : public PFS_object_visitor 576 { 577 public: 578 PFS_table_io_wait_visitor(); 579 virtual ~PFS_table_io_wait_visitor(); 580 virtual void visit_global(); 581 virtual void visit_table_share(PFS_table_share *pfs); 582 virtual void visit_table(PFS_table *pfs); 583 584 /** Table io wait statistic collected. */ 585 PFS_single_stat m_stat; 586 }; 587 588 /** 589 A concrete object visitor that aggregates 590 table io statistics. 591 */ 592 class PFS_table_io_stat_visitor : public PFS_object_visitor 593 { 594 public: 595 PFS_table_io_stat_visitor(); 596 virtual ~PFS_table_io_stat_visitor(); 597 virtual void visit_table_share(PFS_table_share *pfs); 598 virtual void visit_table(PFS_table *pfs); 599 600 /** Table io statistic collected. */ 601 PFS_table_io_stat m_stat; 602 }; 603 604 /** 605 A concrete object visitor that aggregates 606 index io statistics. 607 */ 608 class PFS_index_io_stat_visitor : public PFS_object_visitor 609 { 610 public: 611 PFS_index_io_stat_visitor(); 612 virtual ~PFS_index_io_stat_visitor(); 613 virtual void visit_table_share_index(PFS_table_share *pfs, uint index); 614 virtual void visit_table_index(PFS_table *pfs, uint index); 615 616 /** Index io statistic collected. */ 617 PFS_table_io_stat m_stat; 618 }; 619 620 /** 621 A concrete object visitor that aggregates 622 table lock wait statistics. 623 */ 624 class PFS_table_lock_wait_visitor : public PFS_object_visitor 625 { 626 public: 627 PFS_table_lock_wait_visitor(); 628 virtual ~PFS_table_lock_wait_visitor(); 629 virtual void visit_global(); 630 virtual void visit_table_share(PFS_table_share *pfs); 631 virtual void visit_table(PFS_table *pfs); 632 633 /** Table lock wait statistic collected. */ 634 PFS_single_stat m_stat; 635 }; 636 637 /** 638 A concrete object visitor that aggregates 639 table lock statistics. 640 */ 641 class PFS_table_lock_stat_visitor : public PFS_object_visitor 642 { 643 public: 644 PFS_table_lock_stat_visitor(); 645 virtual ~PFS_table_lock_stat_visitor(); 646 virtual void visit_table_share(PFS_table_share *pfs); 647 virtual void visit_table(PFS_table *pfs); 648 649 /** Table lock statistic collected. */ 650 PFS_table_lock_stat m_stat; 651 }; 652 653 /** 654 A concrete instance visitor that aggregates 655 socket wait and byte count statistics. 656 */ 657 class PFS_instance_socket_io_stat_visitor : public PFS_instance_visitor 658 { 659 public: 660 PFS_instance_socket_io_stat_visitor(); 661 virtual ~PFS_instance_socket_io_stat_visitor(); 662 virtual void visit_socket_class(PFS_socket_class *pfs); 663 virtual void visit_socket(PFS_socket *pfs); 664 665 /** Wait and byte count statistics collected. */ 666 PFS_socket_io_stat m_socket_io_stat; 667 }; 668 669 /** 670 A concrete instance visitor that aggregates 671 file wait and byte count statistics. 672 */ 673 class PFS_instance_file_io_stat_visitor : public PFS_instance_visitor 674 { 675 public: 676 PFS_instance_file_io_stat_visitor(); 677 virtual ~PFS_instance_file_io_stat_visitor(); 678 virtual void visit_file_class(PFS_file_class *pfs); 679 virtual void visit_file(PFS_file *pfs); 680 681 /** Wait and byte count statistics collected. */ 682 PFS_file_io_stat m_file_io_stat; 683 }; 684 685 /** @} */ 686 #endif 687 688