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