Below is the list of changes that have just been committed into a local
5.0 repository of . When does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2006-12-18 11:09:47+01:00, msvensson@shellback. +2 -0
Change windows pthread_cond_timedwait to use an absolute time value
include/my_pthread.h@stripped, 2006-12-18 11:09:42+01:00, msvensson@shellback. +8 -6
Calculate absolute time value int set_timespec_*
mysys/my_wincond.c@stripped, 2006-12-18 11:09:43+01:00, msvensson@shellback. +10 -9
Use absolute timevalue in pthread_cond_timedwwait
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: msvensson
# Host: shellback.
# Root: C:/mysql/mysql-5.0-maint
--- 1.93/include/my_pthread.h 2006-12-14 15:22:05 +01:00
+++ 1.94/include/my_pthread.h 2006-12-18 11:09:42 +01:00
@@ -94,17 +94,19 @@
__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);
--- 1.7/mysys/my_wincond.c 2006-12-14 15:22:05 +01:00
+++ 1.8/mysys/my_wincond.c 2006-12-18 11:09:43 +01:00
@@ -37,7 +37,7 @@
int pthread_cond_destroy(pthread_cond_t *cond)
{
- return CloseHandle(cond->semaphore) ? 0 : EINVAL;
+ return CloseHandle(cond->semaphore) ? 0 : EINVAL;
}
@@ -51,6 +51,7 @@
return 0 ;
}
+
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
struct timespec *abstime)
{
@@ -61,26 +62,26 @@
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);
| Thread |
|---|
| • bk commit into 5.0 tree (msvensson:1.2357) | msvensson | 18 Dec |