mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
BUG#24687 func_misc test fails on win64
- Use same precision (milliseconds) for all time functions used when calculating time for pthread_cond_timedwait - Use 'GetSystemTimeAsFileTime' for both start and curr time include/config-win.h: Move all defines for 'pthread_cond_timedwait' to my_pthread.h include/my_global.h: Move all defines for 'pthread_cond_timedwait' to my_pthread.h include/my_pthread.h: Redefine "struct timespec" to better suite the needs of 'pthread_cond_timedwait' for windows implementation Add windows specific define for set_timespec_nsec Move all defines related to pthread_cond_timed wait to same file Declare union for reading FILETIME as __int64 with correct alignment mysys/my_wincond.c: Use 'GetSystemTimeAsFileTime()' both for getting start and current time Use new members of "struct timespec" Make sure the calculated timeout value never exceeds the value passed to set_timespec/set_timespec_nsec server-tools/instance-manager/guardian.cc: Use set_timespec macro server-tools/instance-manager/instance.cc: Use set_timespec macro
This commit is contained in:
@ -249,7 +249,6 @@ inline double ulonglong2double(ulonglong value)
|
|||||||
#define tell(A) _telli64(A)
|
#define tell(A) _telli64(A)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define set_timespec(ABSTIME,SEC) { (ABSTIME).tv_sec=time((time_t*)0) + (time_t) (SEC); (ABSTIME).tv_nsec=0; }
|
|
||||||
|
|
||||||
#define STACK_DIRECTION -1
|
#define STACK_DIRECTION -1
|
||||||
|
|
||||||
|
@ -1010,41 +1010,7 @@ typedef char bool; /* Ordinary boolean values 0 1 */
|
|||||||
#define MY_HOW_OFTEN_TO_ALARM 2 /* How often we want info on screen */
|
#define MY_HOW_OFTEN_TO_ALARM 2 /* How often we want info on screen */
|
||||||
#define MY_HOW_OFTEN_TO_WRITE 1000 /* How often we want info on screen */
|
#define MY_HOW_OFTEN_TO_WRITE 1000 /* How often we want info on screen */
|
||||||
|
|
||||||
#ifdef HAVE_TIMESPEC_TS_SEC
|
|
||||||
#ifndef set_timespec
|
|
||||||
#define set_timespec(ABSTIME,SEC) \
|
|
||||||
{ \
|
|
||||||
(ABSTIME).ts_sec=time(0) + (time_t) (SEC); \
|
|
||||||
(ABSTIME).ts_nsec=0; \
|
|
||||||
}
|
|
||||||
#endif /* !set_timespec */
|
|
||||||
#ifndef set_timespec_nsec
|
|
||||||
#define set_timespec_nsec(ABSTIME,NSEC) \
|
|
||||||
{ \
|
|
||||||
ulonglong now= my_getsystime() + (NSEC/100); \
|
|
||||||
(ABSTIME).ts_sec= (now / ULL(10000000)); \
|
|
||||||
(ABSTIME).ts_nsec= (now % ULL(10000000) * 100 + ((NSEC) % 100)); \
|
|
||||||
}
|
|
||||||
#endif /* !set_timespec_nsec */
|
|
||||||
#else
|
|
||||||
#ifndef set_timespec
|
|
||||||
#define set_timespec(ABSTIME,SEC) \
|
|
||||||
{\
|
|
||||||
struct timeval tv;\
|
|
||||||
gettimeofday(&tv,0);\
|
|
||||||
(ABSTIME).tv_sec=tv.tv_sec+(time_t) (SEC);\
|
|
||||||
(ABSTIME).tv_nsec=tv.tv_usec*1000;\
|
|
||||||
}
|
|
||||||
#endif /* !set_timespec */
|
|
||||||
#ifndef set_timespec_nsec
|
|
||||||
#define set_timespec_nsec(ABSTIME,NSEC) \
|
|
||||||
{\
|
|
||||||
ulonglong now= my_getsystime() + (NSEC/100); \
|
|
||||||
(ABSTIME).tv_sec= (time_t) (now / ULL(10000000)); \
|
|
||||||
(ABSTIME).tv_nsec= (long) (now % ULL(10000000) * 100 + ((NSEC) % 100)); \
|
|
||||||
}
|
|
||||||
#endif /* !set_timespec_nsec */
|
|
||||||
#endif /* HAVE_TIMESPEC_TS_SEC */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Define-funktions for reading and storing in machine independent format
|
Define-funktions for reading and storing in machine independent format
|
||||||
|
@ -69,14 +69,6 @@ typedef struct {
|
|||||||
#endif
|
#endif
|
||||||
} pthread_cond_t;
|
} pthread_cond_t;
|
||||||
|
|
||||||
|
|
||||||
#ifndef OS2
|
|
||||||
struct timespec { /* For pthread_cond_timedwait() */
|
|
||||||
time_t tv_sec;
|
|
||||||
long tv_nsec;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef int pthread_mutexattr_t;
|
typedef int pthread_mutexattr_t;
|
||||||
#define win_pthread_self my_thread_var->pthread_self
|
#define win_pthread_self my_thread_var->pthread_self
|
||||||
#ifdef OS2
|
#ifdef OS2
|
||||||
@ -87,6 +79,34 @@ typedef void * (_Optlink *pthread_handler)(void *);
|
|||||||
typedef void * (__cdecl *pthread_handler)(void *);
|
typedef void * (__cdecl *pthread_handler)(void *);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
Struct and macros to be used in combination with the
|
||||||
|
windows implementation of pthread_cond_timedwait
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Declare a union to make sure FILETIME is properly aligned
|
||||||
|
so it can be used directly as a 64 bit value. The value
|
||||||
|
stored is in 100ns units.
|
||||||
|
*/
|
||||||
|
union ft64 {
|
||||||
|
FILETIME ft;
|
||||||
|
__int64 i64;
|
||||||
|
};
|
||||||
|
struct timespec {
|
||||||
|
union ft64 start;
|
||||||
|
/* The max timeout value in millisecond for pthread_cond_timedwait */
|
||||||
|
long timeout_msec;
|
||||||
|
};
|
||||||
|
#define set_timespec(ABSTIME,SEC) { \
|
||||||
|
GetSystemTimeAsFileTime(&((ABSTIME).start.ft)); \
|
||||||
|
(ABSTIME).timeout_msec= (long)((SEC)*1000); \
|
||||||
|
}
|
||||||
|
#define set_timespec_nsec(ABSTIME,NSEC) { \
|
||||||
|
GetSystemTimeAsFileTime(&((ABSTIME).start.ft)); \
|
||||||
|
(ABSTIME).timeout_msec= (long)((NSEC)/1000000); \
|
||||||
|
}
|
||||||
|
|
||||||
void win_pthread_init(void);
|
void win_pthread_init(void);
|
||||||
int win_pthread_setspecific(void *A,void *B,uint length);
|
int win_pthread_setspecific(void *A,void *B,uint length);
|
||||||
int pthread_create(pthread_t *,pthread_attr_t *,pthread_handler,void *);
|
int pthread_create(pthread_t *,pthread_attr_t *,pthread_handler,void *);
|
||||||
@ -164,8 +184,6 @@ extern int pthread_mutex_destroy (pthread_mutex_t *);
|
|||||||
#define pthread_condattr_init(A)
|
#define pthread_condattr_init(A)
|
||||||
#define pthread_condattr_destroy(A)
|
#define pthread_condattr_destroy(A)
|
||||||
|
|
||||||
/*Irena: compiler does not like this: */
|
|
||||||
/*#define my_pthread_getprio(pthread_t thread_id) pthread_dummy(0) */
|
|
||||||
#define my_pthread_getprio(thread_id) pthread_dummy(0)
|
#define my_pthread_getprio(thread_id) pthread_dummy(0)
|
||||||
|
|
||||||
#elif defined(HAVE_UNIXWARE7_THREADS)
|
#elif defined(HAVE_UNIXWARE7_THREADS)
|
||||||
@ -473,6 +491,47 @@ void my_pthread_attr_getstacksize(pthread_attr_t *attrib, size_t *size);
|
|||||||
int my_pthread_mutex_trylock(pthread_mutex_t *mutex);
|
int my_pthread_mutex_trylock(pthread_mutex_t *mutex);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
The defines set_timespec and set_timespec_nsec should be used
|
||||||
|
for calculating an absolute time at which
|
||||||
|
pthread_cond_timedwait should timeout
|
||||||
|
*/
|
||||||
|
#ifdef HAVE_TIMESPEC_TS_SEC
|
||||||
|
#ifndef set_timespec
|
||||||
|
#define set_timespec(ABSTIME,SEC) \
|
||||||
|
{ \
|
||||||
|
(ABSTIME).ts_sec=time(0) + (time_t) (SEC); \
|
||||||
|
(ABSTIME).ts_nsec=0; \
|
||||||
|
}
|
||||||
|
#endif /* !set_timespec */
|
||||||
|
#ifndef set_timespec_nsec
|
||||||
|
#define set_timespec_nsec(ABSTIME,NSEC) \
|
||||||
|
{ \
|
||||||
|
ulonglong now= my_getsystime() + (NSEC/100); \
|
||||||
|
(ABSTIME).ts_sec= (now / ULL(10000000)); \
|
||||||
|
(ABSTIME).ts_nsec= (now % ULL(10000000) * 100 + ((NSEC) % 100)); \
|
||||||
|
}
|
||||||
|
#endif /* !set_timespec_nsec */
|
||||||
|
#else
|
||||||
|
#ifndef set_timespec
|
||||||
|
#define set_timespec(ABSTIME,SEC) \
|
||||||
|
{\
|
||||||
|
struct timeval tv;\
|
||||||
|
gettimeofday(&tv,0);\
|
||||||
|
(ABSTIME).tv_sec=tv.tv_sec+(time_t) (SEC);\
|
||||||
|
(ABSTIME).tv_nsec=tv.tv_usec*1000;\
|
||||||
|
}
|
||||||
|
#endif /* !set_timespec */
|
||||||
|
#ifndef set_timespec_nsec
|
||||||
|
#define set_timespec_nsec(ABSTIME,NSEC) \
|
||||||
|
{\
|
||||||
|
ulonglong now= my_getsystime() + (NSEC/100); \
|
||||||
|
(ABSTIME).tv_sec= (time_t) (now / ULL(10000000)); \
|
||||||
|
(ABSTIME).tv_nsec= (long) (now % ULL(10000000) * 100 + ((NSEC) % 100)); \
|
||||||
|
}
|
||||||
|
#endif /* !set_timespec_nsec */
|
||||||
|
#endif /* HAVE_TIMESPEC_TS_SEC */
|
||||||
|
|
||||||
/* safe_mutex adds checking to mutex for easier debugging */
|
/* safe_mutex adds checking to mutex for easier debugging */
|
||||||
|
|
||||||
#if defined(__NETWARE__) && !defined(SAFE_MUTEX_DETECT_DESTROY)
|
#if defined(__NETWARE__) && !defined(SAFE_MUTEX_DETECT_DESTROY)
|
||||||
|
@ -54,14 +54,30 @@ int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
|
|||||||
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
|
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||||
struct timespec *abstime)
|
struct timespec *abstime)
|
||||||
{
|
{
|
||||||
struct _timeb curtime;
|
|
||||||
int result;
|
int result;
|
||||||
long timeout;
|
long timeout;
|
||||||
_ftime(&curtime);
|
union ft64 now;
|
||||||
timeout= ((long) (abstime->tv_sec - curtime.time)*1000L +
|
|
||||||
(long)((abstime->tv_nsec/1000) - curtime.millitm)/1000L);
|
GetSystemTimeAsFileTime(&now.ft);
|
||||||
if (timeout < 0) /* Some safety */
|
|
||||||
|
/*
|
||||||
|
- subtract start time from current time(values are in 100ns units
|
||||||
|
- convert to millisec by dividing with 10000
|
||||||
|
- subtract time since start from max timeout
|
||||||
|
*/
|
||||||
|
timeout= abstime->timeout_msec - (long)((now.i64 - abstime->start.i64) / 10000);
|
||||||
|
|
||||||
|
/* Don't allow the timeout to be negative */
|
||||||
|
if (timeout < 0)
|
||||||
timeout = 0L;
|
timeout = 0L;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Make sure the calucated time does not exceed original timeout
|
||||||
|
value which could cause "wait for ever" if system time changes
|
||||||
|
*/
|
||||||
|
if (timeout > abstime->timeout_msec)
|
||||||
|
timeout= abstime->timeout_msec;
|
||||||
|
|
||||||
InterlockedIncrement(&cond->waiting);
|
InterlockedIncrement(&cond->waiting);
|
||||||
LeaveCriticalSection(mutex);
|
LeaveCriticalSection(mutex);
|
||||||
result=WaitForSingleObject(cond->semaphore,timeout);
|
result=WaitForSingleObject(cond->semaphore,timeout);
|
||||||
|
@ -228,9 +228,8 @@ void Guardian_thread::run()
|
|||||||
|
|
||||||
node= node->next;
|
node= node->next;
|
||||||
}
|
}
|
||||||
timeout.tv_sec= time(NULL) + monitoring_interval;
|
set_timespec(timeout, monitoring_interval);
|
||||||
timeout.tv_nsec= 0;
|
|
||||||
|
|
||||||
/* check the loop predicate before sleeping */
|
/* check the loop predicate before sleeping */
|
||||||
if (!(shutdown_requested && (!(guarded_instances))))
|
if (!(shutdown_requested && (!(guarded_instances))))
|
||||||
thread_registry.cond_timedwait(&thread_info, &COND_guardian,
|
thread_registry.cond_timedwait(&thread_info, &COND_guardian,
|
||||||
|
@ -476,10 +476,9 @@ int Instance::stop()
|
|||||||
waitchild= options.shutdown_delay_val;
|
waitchild= options.shutdown_delay_val;
|
||||||
|
|
||||||
kill_instance(SIGTERM);
|
kill_instance(SIGTERM);
|
||||||
/* sleep on condition to wait for SIGCHLD */
|
|
||||||
|
|
||||||
timeout.tv_sec= time(NULL) + waitchild;
|
/* sleep on condition to wait for SIGCHLD */
|
||||||
timeout.tv_nsec= 0;
|
set_timespec(timeout, waitchild);
|
||||||
if (pthread_mutex_lock(&LOCK_instance))
|
if (pthread_mutex_lock(&LOCK_instance))
|
||||||
return ER_STOP_INSTANCE;
|
return ER_STOP_INSTANCE;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user