Commit 3d1a7cba authored by Sergey Vojtovich's avatar Sergey Vojtovich Committed by Daniel Black

MDEV-8684: Remove delaying maths in ut_delay

Also introduce compiler barrier properly on all architectures.
parent d4ba5047
...@@ -89,9 +89,11 @@ struct ut_when_dtor { ...@@ -89,9 +89,11 @@ struct ut_when_dtor {
independent way by using YieldProcessor. */ independent way by using YieldProcessor. */
# define UT_RELAX_CPU() YieldProcessor() # define UT_RELAX_CPU() YieldProcessor()
# else # else
# define UT_RELAX_CPU() __asm__ __volatile__ ("":::"memory") # define UT_RELAX_CPU() ((void)0) /* avoid warning for an empty statement */
# endif # endif
#define UT_COMPILER_BARRIER() __asm__ __volatile__ ("":::"memory")
# if defined(HAVE_HMT_PRIORITY_INSTRUCTION) # if defined(HAVE_HMT_PRIORITY_INSTRUCTION)
# define UT_LOW_PRIORITY_CPU() __asm__ __volatile__ ("or 1,1,1") # define UT_LOW_PRIORITY_CPU() __asm__ __volatile__ ("or 1,1,1")
# define UT_RESUME_PRIORITY_CPU() __asm__ __volatile__ ("or 2,2,2") # define UT_RESUME_PRIORITY_CPU() __asm__ __volatile__ ("or 2,2,2")
...@@ -345,7 +347,7 @@ Runs an idle loop on CPU. The argument gives the desired delay ...@@ -345,7 +347,7 @@ Runs an idle loop on CPU. The argument gives the desired delay
in microseconds on 100 MHz Pentium + Visual C++. in microseconds on 100 MHz Pentium + Visual C++.
@return dummy value */ @return dummy value */
UNIV_INTERN UNIV_INTERN
ulint void
ut_delay( ut_delay(
/*=====*/ /*=====*/
ulint delay); /*!< in: delay in microseconds on 100 MHz Pentium */ ulint delay); /*!< in: delay in microseconds on 100 MHz Pentium */
......
...@@ -394,25 +394,21 @@ Runs an idle loop on CPU. The argument gives the desired delay ...@@ -394,25 +394,21 @@ Runs an idle loop on CPU. The argument gives the desired delay
in microseconds on 100 MHz Pentium + Visual C++. in microseconds on 100 MHz Pentium + Visual C++.
@return dummy value */ @return dummy value */
UNIV_INTERN UNIV_INTERN
ulint void
ut_delay( ut_delay(
/*=====*/ /*=====*/
ulint delay) /*!< in: delay in microseconds on 100 MHz Pentium */ ulint delay) /*!< in: delay in microseconds on 100 MHz Pentium */
{ {
ulint i, j; ulint i;
UT_LOW_PRIORITY_CPU(); UT_LOW_PRIORITY_CPU();
j = 0;
for (i = 0; i < delay * 50; i++) { for (i = 0; i < delay * 50; i++) {
j += i;
UT_RELAX_CPU(); UT_RELAX_CPU();
UT_COMPILER_BARRIER();
} }
UT_RESUME_PRIORITY_CPU(); UT_RESUME_PRIORITY_CPU();
return(j);
} }
#endif /* !UNIV_HOTBACKUP */ #endif /* !UNIV_HOTBACKUP */
......
...@@ -86,9 +86,11 @@ struct ut_when_dtor { ...@@ -86,9 +86,11 @@ struct ut_when_dtor {
independent way by using YieldProcessor. */ independent way by using YieldProcessor. */
# define UT_RELAX_CPU() YieldProcessor() # define UT_RELAX_CPU() YieldProcessor()
# else # else
# define UT_RELAX_CPU() __asm__ __volatile__ ("":::"memory") # define UT_RELAX_CPU() ((void)0) /* avoid warning for an empty statement */
# endif # endif
#define UT_COMPILER_BARRIER() __asm__ __volatile__ ("":::"memory")
# if defined(HAVE_HMT_PRIORITY_INSTRUCTION) # if defined(HAVE_HMT_PRIORITY_INSTRUCTION)
# define UT_LOW_PRIORITY_CPU() __asm__ __volatile__ ("or 1,1,1") # define UT_LOW_PRIORITY_CPU() __asm__ __volatile__ ("or 1,1,1")
# define UT_RESUME_PRIORITY_CPU() __asm__ __volatile__ ("or 2,2,2") # define UT_RESUME_PRIORITY_CPU() __asm__ __volatile__ ("or 2,2,2")
...@@ -337,7 +339,7 @@ Runs an idle loop on CPU. The argument gives the desired delay ...@@ -337,7 +339,7 @@ Runs an idle loop on CPU. The argument gives the desired delay
in microseconds on 100 MHz Pentium + Visual C++. in microseconds on 100 MHz Pentium + Visual C++.
@return dummy value */ @return dummy value */
UNIV_INTERN UNIV_INTERN
ulint void
ut_delay( ut_delay(
/*=====*/ /*=====*/
ulint delay); /*!< in: delay in microseconds on 100 MHz Pentium */ ulint delay); /*!< in: delay in microseconds on 100 MHz Pentium */
......
...@@ -395,25 +395,21 @@ Runs an idle loop on CPU. The argument gives the desired delay ...@@ -395,25 +395,21 @@ Runs an idle loop on CPU. The argument gives the desired delay
in microseconds on 100 MHz Pentium + Visual C++. in microseconds on 100 MHz Pentium + Visual C++.
@return dummy value */ @return dummy value */
UNIV_INTERN UNIV_INTERN
ulint void
ut_delay( ut_delay(
/*=====*/ /*=====*/
ulint delay) /*!< in: delay in microseconds on 100 MHz Pentium */ ulint delay) /*!< in: delay in microseconds on 100 MHz Pentium */
{ {
ulint i, j; ulint i;
UT_LOW_PRIORITY_CPU(); UT_LOW_PRIORITY_CPU();
j = 0;
for (i = 0; i < delay * 50; i++) { for (i = 0; i < delay * 50; i++) {
j += i;
UT_RELAX_CPU(); UT_RELAX_CPU();
UT_COMPILER_BARRIER();
} }
UT_RESUME_PRIORITY_CPU(); UT_RESUME_PRIORITY_CPU();
return(j);
} }
#endif /* !UNIV_HOTBACKUP */ #endif /* !UNIV_HOTBACKUP */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment