Browse Source
Replace ut_timer() with my_interval_timer()
Replace ut_timer() with my_interval_timer()
The function pointer ut_timer() was only used by the InnoDB defragmenting thread. Let InnoDB use a single monotonic high-precision timer, my_interval_timer() [in nanoseconds], occasionally wrapped by microsecond_interval_timer(). srv_defragment_interval: Change from "timer" units to nanoseconds. This concludes the InnoDB time function cleanup that was motivated by MDEV-14154. Only ut_time_ms() will remain for now, wrapping my_interval_timer().pull/1387/head
14 changed files with 19 additions and 467 deletions
-
3storage/innobase/CMakeLists.txt
-
17storage/innobase/btr/btr0defragment.cc
-
4storage/innobase/handler/ha_innodb.cc
-
69storage/innobase/include/ut0timer.h
-
56storage/innobase/include/ut0timer.ic
-
4storage/innobase/srv/srv0start.cc
-
90storage/innobase/ut/ut0timer.cc
-
3storage/xtradb/CMakeLists.txt
-
16storage/xtradb/btr/btr0defragment.cc
-
4storage/xtradb/handler/ha_innodb.cc
-
69storage/xtradb/include/ut0timer.h
-
56storage/xtradb/include/ut0timer.ic
-
4storage/xtradb/srv/srv0start.cc
-
91storage/xtradb/ut/ut0timer.cc
@ -1,69 +0,0 @@ |
|||
/***************************************************************************** |
|||
|
|||
Copyright (c) 2013, 2014, Facebook, Inc. All Rights Reserved. |
|||
Copyright (c) 2014, 2018, MariaDB Corporation. |
|||
|
|||
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, Inc., |
|||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA |
|||
|
|||
*****************************************************************************/ |
|||
|
|||
/********************************************************************//** |
|||
@file include/ut0timer.h |
|||
Timer routines |
|||
|
|||
Created 30/07/2014 Jan Lindström jan.lindstrom@skysql.com |
|||
modified from https://github.com/facebook/mysql-5.6/commit/c75a413edeb96eb99bf11d7269bdfea06f96d6b6 |
|||
*************************************************************************/ |
|||
#ifndef ut0timer_h |
|||
#define ut0timer_h |
|||
|
|||
#include "univ.i" |
|||
|
|||
/* Current timer stats */ |
|||
extern struct my_timer_unit_info ut_timer; |
|||
|
|||
/**************************************************************//** |
|||
Function pointer to point selected timer function. |
|||
@return timer current value */ |
|||
extern ulonglong (*ut_timer_now)(void); |
|||
|
|||
/**************************************************************//** |
|||
Sets up the data required for use of my_timer_* functions. |
|||
Selects the best timer by high frequency, and tight resolution. |
|||
Points my_timer_now() to the selected timer function. |
|||
Initializes my_timer struct to contain the info for selected timer.*/ |
|||
UNIV_INTERN |
|||
void ut_init_timer(void); |
|||
|
|||
/**************************************************************//** |
|||
Convert native timer units in a ulonglong into microseconds in a double |
|||
@return time in microseconds */ |
|||
UNIV_INLINE |
|||
double |
|||
ut_timer_to_microseconds( |
|||
/*=====================*/ |
|||
ulonglong when); /*!< in: time where to calculate */ |
|||
/**************************************************************//** |
|||
Convert microseconds in a double to native timer units in a ulonglong |
|||
@return time in microseconds */ |
|||
UNIV_INLINE |
|||
ulonglong |
|||
ut_microseconds_to_timer( |
|||
/*=====================*/ |
|||
ulonglong when); /*!< in: time where to calculate */ |
|||
|
|||
#ifndef UNIV_NONINL |
|||
#include "ut0timer.ic" |
|||
#endif |
|||
|
|||
#endif |
@ -1,56 +0,0 @@ |
|||
/***************************************************************************** |
|||
|
|||
Copyright (c) 2013, 2014, Facebook, Inc. All Rights Reserved. |
|||
Copyright (c) 2014, 2018, MariaDB Corporation. |
|||
|
|||
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, Inc., |
|||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA |
|||
|
|||
*****************************************************************************/ |
|||
|
|||
/********************************************************************//** |
|||
@file include/ut0timer.ic |
|||
Timer routines |
|||
|
|||
Created 30/07/2014 Jan Lindström jan.lindstrom@skysql.com |
|||
modified from https://github.com/facebook/mysql-5.6/commit/c75a413edeb96eb99bf11d7269bdfea06f96d6b6 |
|||
*************************************************************************/ |
|||
|
|||
/**************************************************************//** |
|||
Convert native timer units in a ulonglong into microseconds in a double |
|||
@return time in microseconds */ |
|||
UNIV_INLINE |
|||
double |
|||
ut_timer_to_microseconds( |
|||
/*=====================*/ |
|||
ulonglong when) /*!< in: time where to calculate */ |
|||
{ |
|||
double ret = (double)(when); |
|||
ret *= 1000000.0; |
|||
ret /= (double)(ut_timer.frequency); |
|||
return ret; |
|||
} |
|||
|
|||
/**************************************************************//** |
|||
Convert microseconds in a double to native timer units in a ulonglong |
|||
@return time in microseconds */ |
|||
UNIV_INLINE |
|||
ulonglong |
|||
ut_microseconds_to_timer( |
|||
/*=====================*/ |
|||
ulonglong when) /*!< in: time where to calculate */ |
|||
{ |
|||
double ret = (double)when; |
|||
ret *= (double)(ut_timer.frequency); |
|||
ret /= 1000000.0; |
|||
return (ulonglong)ret; |
|||
} |
@ -1,90 +0,0 @@ |
|||
/*****************************************************************************
|
|||
|
|||
Copyright (c) 2013, 2014, Facebook, Inc. All Rights Reserved. |
|||
Copyright (c) 2014, SkySQL Ab. 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, Inc., |
|||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA |
|||
|
|||
*****************************************************************************/ |
|||
|
|||
/********************************************************************//**
|
|||
@file ut/ut0timer.cc |
|||
Timer rountines |
|||
|
|||
Created 30/07/2014 Jan Lindström jan.lindstrom@skysql.com |
|||
modified from https://github.com/facebook/mysql-5.6/commit/c75a413edeb96eb99bf11d7269bdfea06f96d6b6
|
|||
*************************************************************************/ |
|||
|
|||
#include "data0type.h"
|
|||
#include <my_rdtsc.h>
|
|||
#include <ut0timer.h>
|
|||
|
|||
/**************************************************************//**
|
|||
Initial timer definition |
|||
@return 0 */ |
|||
static |
|||
ulonglong |
|||
ut_timer_none(void) |
|||
/*===============*/ |
|||
{ |
|||
return 0; |
|||
} |
|||
|
|||
/**************************************************************//**
|
|||
Function pointer to point selected timer function. |
|||
@return timer current value */ |
|||
ulonglong (*ut_timer_now)(void) = &ut_timer_none; |
|||
|
|||
struct my_timer_unit_info ut_timer; |
|||
extern MYSQL_PLUGIN_IMPORT MY_TIMER_INFO sys_timer_info; |
|||
|
|||
/**************************************************************//**
|
|||
Sets up the data required for use of my_timer_* functions. |
|||
Selects the best timer by high frequency, and tight resolution. |
|||
Points my_timer_now() to the selected timer function. |
|||
Initializes my_timer struct to contain the info for selected timer.*/ |
|||
UNIV_INTERN |
|||
void |
|||
ut_init_timer(void) |
|||
/*===============*/ |
|||
{ |
|||
if (sys_timer_info.cycles.frequency > 1000000 && |
|||
sys_timer_info.cycles.resolution == 1) { |
|||
ut_timer = sys_timer_info.cycles; |
|||
ut_timer_now = &my_timer_cycles; |
|||
} else if (sys_timer_info.nanoseconds.frequency > 1000000 && |
|||
sys_timer_info.nanoseconds.resolution == 1) { |
|||
ut_timer = sys_timer_info.nanoseconds; |
|||
ut_timer_now = &my_timer_nanoseconds; |
|||
} else if (sys_timer_info.microseconds.frequency >= 1000000 && |
|||
sys_timer_info.microseconds.resolution == 1) { |
|||
ut_timer = sys_timer_info.microseconds; |
|||
ut_timer_now = &my_timer_microseconds; |
|||
|
|||
} else if (sys_timer_info.milliseconds.frequency >= 1000 && |
|||
sys_timer_info.milliseconds.resolution == 1) { |
|||
ut_timer = sys_timer_info.milliseconds; |
|||
ut_timer_now = &my_timer_milliseconds; |
|||
} else if (sys_timer_info.ticks.frequency >= 1000 && |
|||
/* Will probably be false */ |
|||
sys_timer_info.ticks.resolution == 1) { |
|||
ut_timer = sys_timer_info.ticks; |
|||
ut_timer_now = &my_timer_ticks; |
|||
} else { |
|||
/* None are acceptable, so leave it as "None", and fill in struct */ |
|||
ut_timer.frequency = 1; /* Avoid div-by-zero */ |
|||
ut_timer.overhead = 0; /* Since it doesn't do anything */ |
|||
ut_timer.resolution = 10; /* Another sign it's bad */ |
|||
ut_timer.routine = 0; /* None */ |
|||
} |
|||
} |
@ -1,69 +0,0 @@ |
|||
/***************************************************************************** |
|||
|
|||
Copyright (c) 2013, 2014, Facebook, Inc. All Rights Reserved. |
|||
Copyright (c) 2014, 2018, MariaDB Corporation. |
|||
|
|||
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, Inc., |
|||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA |
|||
|
|||
*****************************************************************************/ |
|||
|
|||
/********************************************************************//** |
|||
@file include/ut0timer.h |
|||
Timer routines |
|||
|
|||
Created 30/07/2014 Jan Lindström jan.lindstrom@skysql.com |
|||
modified from https://github.com/facebook/mysql-5.6/commit/c75a413edeb96eb99bf11d7269bdfea06f96d6b6 |
|||
*************************************************************************/ |
|||
#ifndef ut0timer_h |
|||
#define ut0timer_h |
|||
|
|||
#include "univ.i" |
|||
|
|||
/* Current timer stats */ |
|||
extern struct my_timer_unit_info ut_timer; |
|||
|
|||
/**************************************************************//** |
|||
Function pointer to point selected timer function. |
|||
@return timer current value */ |
|||
extern ulonglong (*ut_timer_now)(void); |
|||
|
|||
/**************************************************************//** |
|||
Sets up the data required for use of my_timer_* functions. |
|||
Selects the best timer by high frequency, and tight resolution. |
|||
Points my_timer_now() to the selected timer function. |
|||
Initializes my_timer struct to contain the info for selected timer.*/ |
|||
UNIV_INTERN |
|||
void ut_init_timer(void); |
|||
|
|||
/**************************************************************//** |
|||
Convert native timer units in a ulonglong into microseconds in a double |
|||
@return time in microseconds */ |
|||
UNIV_INLINE |
|||
double |
|||
ut_timer_to_microseconds( |
|||
/*=====================*/ |
|||
ulonglong when); /*!< in: time where to calculate */ |
|||
/**************************************************************//** |
|||
Convert microseconds in a double to native timer units in a ulonglong |
|||
@return time in microseconds */ |
|||
UNIV_INLINE |
|||
ulonglong |
|||
ut_microseconds_to_timer( |
|||
/*=====================*/ |
|||
ulonglong when); /*!< in: time where to calculate */ |
|||
|
|||
#ifndef UNIV_NONINL |
|||
#include "ut0timer.ic" |
|||
#endif |
|||
|
|||
#endif |
@ -1,56 +0,0 @@ |
|||
/***************************************************************************** |
|||
|
|||
Copyright (c) 2013, 2014, Facebook, Inc. All Rights Reserved. |
|||
Copyright (c) 2014, 2018, MariaDB Corporation. |
|||
|
|||
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, Inc., |
|||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA |
|||
|
|||
*****************************************************************************/ |
|||
|
|||
/********************************************************************//** |
|||
@file include/ut0timer.ic |
|||
Timer routines |
|||
|
|||
Created 30/07/2014 Jan Lindström jan.lindstrom@skysql.com |
|||
modified from https://github.com/facebook/mysql-5.6/commit/c75a413edeb96eb99bf11d7269bdfea06f96d6b6 |
|||
*************************************************************************/ |
|||
|
|||
/**************************************************************//** |
|||
Convert native timer units in a ulonglong into microseconds in a double |
|||
@return time in microseconds */ |
|||
UNIV_INLINE |
|||
double |
|||
ut_timer_to_microseconds( |
|||
/*=====================*/ |
|||
ulonglong when) /*!< in: time where to calculate */ |
|||
{ |
|||
double ret = (double)(when); |
|||
ret *= 1000000.0; |
|||
ret /= (double)(ut_timer.frequency); |
|||
return ret; |
|||
} |
|||
|
|||
/**************************************************************//** |
|||
Convert microseconds in a double to native timer units in a ulonglong |
|||
@return time in microseconds */ |
|||
UNIV_INLINE |
|||
ulonglong |
|||
ut_microseconds_to_timer( |
|||
/*=====================*/ |
|||
ulonglong when) /*!< in: time where to calculate */ |
|||
{ |
|||
double ret = (double)when; |
|||
ret *= (double)(ut_timer.frequency); |
|||
ret /= 1000000.0; |
|||
return (ulonglong)ret; |
|||
} |
@ -1,91 +0,0 @@ |
|||
/*****************************************************************************
|
|||
|
|||
Copyright (c) 2013, 2014, Facebook, Inc. All Rights Reserved. |
|||
Copyright (c) 2014, SkySQL Ab. 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, Inc., |
|||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA |
|||
|
|||
*****************************************************************************/ |
|||
|
|||
/********************************************************************//**
|
|||
@file ut/ut0timer.cc |
|||
Timer rountines |
|||
|
|||
Created 30/07/2014 Jan Lindström jan.lindstrom@skysql.com |
|||
modified from https://github.com/facebook/mysql-5.6/commit/c75a413edeb96eb99bf11d7269bdfea06f96d6b6
|
|||
*************************************************************************/ |
|||
|
|||
#include "data0type.h"
|
|||
#include <my_rdtsc.h>
|
|||
#include <ut0timer.h>
|
|||
|
|||
/**************************************************************//**
|
|||
Initial timer definition |
|||
@return 0 */ |
|||
static |
|||
ulonglong |
|||
ut_timer_none(void) |
|||
/*===============*/ |
|||
{ |
|||
return 0; |
|||
} |
|||
|
|||
/**************************************************************//**
|
|||
Function pointer to point selected timer function. |
|||
@return timer current value */ |
|||
ulonglong (*ut_timer_now)(void) = &ut_timer_none; |
|||
|
|||
struct my_timer_unit_info ut_timer; |
|||
|
|||
extern MYSQL_PLUGIN_IMPORT MY_TIMER_INFO sys_timer_info; |
|||
|
|||
/**************************************************************//**
|
|||
Sets up the data required for use of my_timer_* functions. |
|||
Selects the best timer by high frequency, and tight resolution. |
|||
Points my_timer_now() to the selected timer function. |
|||
Initializes my_timer struct to contain the info for selected timer.*/ |
|||
UNIV_INTERN |
|||
void |
|||
ut_init_timer(void) |
|||
/*===============*/ |
|||
{ |
|||
if (sys_timer_info.cycles.frequency > 1000000 && |
|||
sys_timer_info.cycles.resolution == 1) { |
|||
ut_timer = sys_timer_info.cycles; |
|||
ut_timer_now = &my_timer_cycles; |
|||
} else if (sys_timer_info.nanoseconds.frequency > 1000000 && |
|||
sys_timer_info.nanoseconds.resolution == 1) { |
|||
ut_timer = sys_timer_info.nanoseconds; |
|||
ut_timer_now = &my_timer_nanoseconds; |
|||
} else if (sys_timer_info.microseconds.frequency >= 1000000 && |
|||
sys_timer_info.microseconds.resolution == 1) { |
|||
ut_timer = sys_timer_info.microseconds; |
|||
ut_timer_now = &my_timer_microseconds; |
|||
|
|||
} else if (sys_timer_info.milliseconds.frequency >= 1000 && |
|||
sys_timer_info.milliseconds.resolution == 1) { |
|||
ut_timer = sys_timer_info.milliseconds; |
|||
ut_timer_now = &my_timer_milliseconds; |
|||
} else if (sys_timer_info.ticks.frequency >= 1000 && |
|||
/* Will probably be false */ |
|||
sys_timer_info.ticks.resolution == 1) { |
|||
ut_timer = sys_timer_info.ticks; |
|||
ut_timer_now = &my_timer_ticks; |
|||
} else { |
|||
/* None are acceptable, so leave it as "None", and fill in struct */ |
|||
ut_timer.frequency = 1; /* Avoid div-by-zero */ |
|||
ut_timer.overhead = 0; /* Since it doesn't do anything */ |
|||
ut_timer.resolution = 10; /* Another sign it's bad */ |
|||
ut_timer.routine = 0; /* None */ |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue