summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormsvensson@shellback. <>2006-12-18 11:09:47 +0100
committermsvensson@shellback. <>2006-12-18 11:09:47 +0100
commitc3fb91b782816dc726217713afcfba97efd3a357 (patch)
tree0bfd45a59903cc983e25b689312596a8ff9a76a1
parent74e3857b8d3ba83d7a4466601d6ea91dc0316cc7 (diff)
downloadmariadb-git-c3fb91b782816dc726217713afcfba97efd3a357.tar.gz
Change windows pthread_cond_timedwait to use an absolute time value
-rw-r--r--include/my_pthread.h14
-rw-r--r--mysys/my_wincond.c19
2 files changed, 18 insertions, 15 deletions
diff --git a/include/my_pthread.h b/include/my_pthread.h
index ebba0ab32e1..631ca1d7c03 100644
--- a/include/my_pthread.h
+++ b/include/my_pthread.h
@@ -94,17 +94,19 @@ typedef void * (__cdecl *pthread_handler)(void *);
__int64 i64;
};
struct timespec {
- union ft64 start;
+ union ft64 tv;
/* The max timeout value in millisecond for pthread_cond_timedwait */
- long timeout_msec;
+ long max_timeout_msec;
};
#define set_timespec(ABSTIME,SEC) { \
- GetSystemTimeAsFileTime(&((ABSTIME).start.ft)); \
- (ABSTIME).timeout_msec= (long)((SEC)*1000); \
+ GetSystemTimeAsFileTime(&((ABSTIME).tv.ft)); \
+ (ABSTIME).tv.i64+= (__int64)(SEC)*10000000; \
+ (ABSTIME).max_timeout_msec= (long)((SEC)*1000); \
}
#define set_timespec_nsec(ABSTIME,NSEC) { \
- GetSystemTimeAsFileTime(&((ABSTIME).start.ft)); \
- (ABSTIME).timeout_msec= (long)((NSEC)/1000000); \
+ GetSystemTimeAsFileTime(&((ABSTIME).tv.ft)); \
+ (ABSTIME).tv.i64+= (__int64)(NSEC)/100; \
+ (ABSTIME).max_timeout_msec= (long)((NSEC)/1000000); \
}
void win_pthread_init(void);
diff --git a/mysys/my_wincond.c b/mysys/my_wincond.c
index 327addff2cc..b56dacc135a 100644
--- a/mysys/my_wincond.c
+++ b/mysys/my_wincond.c
@@ -37,7 +37,7 @@ int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr)
int pthread_cond_destroy(pthread_cond_t *cond)
{
- return CloseHandle(cond->semaphore) ? 0 : EINVAL;
+ return CloseHandle(cond->semaphore) ? 0 : EINVAL;
}
@@ -51,6 +51,7 @@ int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
return 0 ;
}
+
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
struct timespec *abstime)
{
@@ -61,26 +62,26 @@ int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
GetSystemTimeAsFileTime(&now.ft);
/*
- - subtract start time from current time(values are in 100ns units
+ Calculate time left to abstime
+ - 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);
+ timeout= (long)((abstime->tv.i64 - now.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
+ Make sure the calucated timeout 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;
+ if (timeout > abstime->max_timeout_msec)
+ timeout= abstime->max_timeout_msec;
InterlockedIncrement(&cond->waiting);
LeaveCriticalSection(mutex);
- result=WaitForSingleObject(cond->semaphore,timeout);
+ result= WaitForSingleObject(cond->semaphore,timeout);
InterlockedDecrement(&cond->waiting);
EnterCriticalSection(mutex);