use monotonic time source in convar->timed_wait, and in the scheduler using it
This commit is contained in:
@@ -47,7 +47,7 @@ struct lock_profile_t {
|
||||
/**
|
||||
* how long threads have waited for the lock in this mutex so far
|
||||
*/
|
||||
struct timeval waited;
|
||||
timeval_t waited;
|
||||
|
||||
/**
|
||||
* backtrace where mutex has been created
|
||||
@@ -81,10 +81,10 @@ static void profiler_init(lock_profile_t *profile)
|
||||
|
||||
#define profiler_start(profile) { \
|
||||
struct timeval _start, _end, _diff; \
|
||||
gettimeofday(&_start, NULL);
|
||||
time_monotonic(&_start);
|
||||
|
||||
#define profiler_end(profile) \
|
||||
gettimeofday(&_end, NULL); \
|
||||
time_monotonic(&_end); \
|
||||
timersub(&_end, &_start, &_diff); \
|
||||
timeradd(&(profile)->waited, &_diff, &(profile)->waited); }
|
||||
|
||||
@@ -368,7 +368,7 @@ static bool timed_wait(private_condvar_t *this, private_mutex_t *mutex,
|
||||
timeval_t tv;
|
||||
u_int s, ms;
|
||||
|
||||
gettimeofday(&tv, NULL);
|
||||
time_monotonic(&tv);
|
||||
|
||||
s = timeout / 1000;
|
||||
ms = timeout % 1000;
|
||||
@@ -419,17 +419,23 @@ condvar_t *condvar_create(condvar_type_t type)
|
||||
case CONDVAR_TYPE_DEFAULT:
|
||||
default:
|
||||
{
|
||||
pthread_condattr_t condattr;
|
||||
private_condvar_t *this = malloc_thing(private_condvar_t);
|
||||
|
||||
|
||||
this->public.wait = (void(*)(condvar_t*, mutex_t *mutex))_wait;
|
||||
this->public.timed_wait = (bool(*)(condvar_t*, mutex_t *mutex, u_int timeout))timed_wait;
|
||||
this->public.timed_wait_abs = (bool(*)(condvar_t*, mutex_t *mutex, timeval_t time))timed_wait_abs;
|
||||
this->public.signal = (void(*)(condvar_t*))_signal;
|
||||
this->public.broadcast = (void(*)(condvar_t*))broadcast;
|
||||
this->public.destroy = (void(*)(condvar_t*))condvar_destroy;
|
||||
|
||||
pthread_cond_init(&this->condvar, NULL);
|
||||
|
||||
|
||||
pthread_condattr_init(&condattr);
|
||||
#ifdef HAVE_CONDATTR_CLOCK_MONOTONIC
|
||||
pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC);
|
||||
#endif
|
||||
pthread_cond_init(&this->condvar, &condattr);
|
||||
pthread_condattr_destroy(&condattr);
|
||||
|
||||
return &this->public;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,11 +98,11 @@ struct mutex_t {
|
||||
* Release the lock on the mutex.
|
||||
*/
|
||||
void (*unlock)(mutex_t *this);
|
||||
|
||||
|
||||
/**
|
||||
* Destroy a mutex instance.
|
||||
*/
|
||||
void (*destroy)(mutex_t *this);
|
||||
* Destroy a mutex instance.
|
||||
*/
|
||||
void (*destroy)(mutex_t *this);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -128,12 +128,15 @@ struct condvar_t {
|
||||
|
||||
/**
|
||||
* Wait on a condvar until it gets signalized, or times out.
|
||||
*
|
||||
*
|
||||
* The passed timeval should be calculated based on the time_monotonic()
|
||||
* function.
|
||||
*
|
||||
* @param mutex mutex to release while waiting
|
||||
* @param time absolute time until timeout
|
||||
* @param tv absolute time until timeout
|
||||
* @return TRUE if timed out, FALSE otherwise
|
||||
*/
|
||||
bool (*timed_wait_abs)(condvar_t *this, mutex_t *mutex, timeval_t timeout);
|
||||
bool (*timed_wait_abs)(condvar_t *this, mutex_t *mutex, timeval_t tv);
|
||||
|
||||
/**
|
||||
* Wake up a single thread in a condvar.
|
||||
|
||||
Reference in New Issue
Block a user