- fixed event queue for events >36min
This commit is contained in:
@@ -85,7 +85,6 @@ static event_t *event_create(timeval_t time, job_t *job)
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
typedef struct private_event_queue_t private_event_queue_t;
|
typedef struct private_event_queue_t private_event_queue_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -118,31 +117,21 @@ struct private_event_queue_t {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the difference of to timeval structs in microseconds
|
* Returns the difference of to timeval structs in milliseconds
|
||||||
*
|
|
||||||
* @param end_time end time
|
|
||||||
* @param start_time start time
|
|
||||||
*
|
|
||||||
* @warning this function is also defined in the tester class
|
|
||||||
* In later improvements, this function can be added to a general
|
|
||||||
* class type!
|
|
||||||
*
|
|
||||||
* @return difference in microseconds (end time - start time)
|
|
||||||
*/
|
*/
|
||||||
static long time_difference(struct timeval *end_time, struct timeval *start_time)
|
static long time_difference(struct timeval *end_time, struct timeval *start_time)
|
||||||
{
|
{
|
||||||
long seconds, microseconds;
|
long seconds, microseconds;
|
||||||
|
|
||||||
seconds = (end_time->tv_sec - start_time->tv_sec);
|
seconds = (end_time->tv_sec - start_time->tv_sec);
|
||||||
microseconds = (end_time->tv_usec - start_time->tv_usec);
|
microseconds = (end_time->tv_usec - start_time->tv_usec);
|
||||||
return ((seconds * 1000000) + microseconds);
|
return ((seconds * 1000) + microseconds/1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implements event_queue_t.get_count
|
* Implements event_queue_t.get_count
|
||||||
*/
|
*/
|
||||||
static int get_count (private_event_queue_t *this)
|
static int get_count(private_event_queue_t *this)
|
||||||
{
|
{
|
||||||
int count;
|
int count;
|
||||||
pthread_mutex_lock(&(this->mutex));
|
pthread_mutex_lock(&(this->mutex));
|
||||||
@@ -161,9 +150,9 @@ static job_t *get(private_event_queue_t *this)
|
|||||||
event_t * next_event;
|
event_t * next_event;
|
||||||
job_t *job;
|
job_t *job;
|
||||||
int oldstate;
|
int oldstate;
|
||||||
|
|
||||||
pthread_mutex_lock(&(this->mutex));
|
pthread_mutex_lock(&(this->mutex));
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
while(this->list->get_count(this->list) == 0)
|
while(this->list->get_count(this->list) == 0)
|
||||||
@@ -171,28 +160,28 @@ static job_t *get(private_event_queue_t *this)
|
|||||||
/* add mutex unlock handler for cancellation, enable cancellation */
|
/* add mutex unlock handler for cancellation, enable cancellation */
|
||||||
pthread_cleanup_push((void(*)(void*))pthread_mutex_unlock, (void*)&(this->mutex));
|
pthread_cleanup_push((void(*)(void*))pthread_mutex_unlock, (void*)&(this->mutex));
|
||||||
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstate);
|
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstate);
|
||||||
|
|
||||||
pthread_cond_wait( &(this->condvar), &(this->mutex));
|
pthread_cond_wait( &(this->condvar), &(this->mutex));
|
||||||
|
|
||||||
/* reset cancellation, remove mutex-unlock handler (without executing) */
|
/* reset cancellation, remove mutex-unlock handler (without executing) */
|
||||||
pthread_setcancelstate(oldstate, NULL);
|
pthread_setcancelstate(oldstate, NULL);
|
||||||
pthread_cleanup_pop(0);
|
pthread_cleanup_pop(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
this->list->get_first(this->list,(void **) &next_event);
|
this->list->get_first(this->list,(void **) &next_event);
|
||||||
|
|
||||||
gettimeofday(¤t_time,NULL);
|
gettimeofday(¤t_time, NULL);
|
||||||
long difference = time_difference(¤t_time,&(next_event->time));
|
long difference = time_difference(¤t_time,&(next_event->time));
|
||||||
if (difference <= 0)
|
if (difference <= 0)
|
||||||
{
|
{
|
||||||
timeout.tv_sec = next_event->time.tv_sec;
|
timeout.tv_sec = next_event->time.tv_sec;
|
||||||
timeout.tv_nsec = next_event->time.tv_usec * 1000;
|
timeout.tv_nsec = next_event->time.tv_usec * 1000;
|
||||||
|
|
||||||
/* add mutex unlock handler for cancellation, enable cancellation */
|
/* add mutex unlock handler for cancellation, enable cancellation */
|
||||||
pthread_cleanup_push((void(*)(void*))pthread_mutex_unlock, (void*)&(this->mutex));
|
pthread_cleanup_push((void(*)(void*))pthread_mutex_unlock, (void*)&(this->mutex));
|
||||||
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstate);
|
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstate);
|
||||||
|
|
||||||
pthread_cond_timedwait( &(this->condvar), &(this->mutex),&timeout);
|
pthread_cond_timedwait(&(this->condvar), &(this->mutex), &timeout);
|
||||||
|
|
||||||
/* reset cancellation, remove mutex-unlock handler (without executing) */
|
/* reset cancellation, remove mutex-unlock handler (without executing) */
|
||||||
pthread_setcancelstate(oldstate, NULL);
|
pthread_setcancelstate(oldstate, NULL);
|
||||||
@@ -202,18 +191,16 @@ static job_t *get(private_event_queue_t *this)
|
|||||||
{
|
{
|
||||||
/* event available */
|
/* event available */
|
||||||
this->list->remove_first(this->list,(void **) &next_event);
|
this->list->remove_first(this->list,(void **) &next_event);
|
||||||
|
|
||||||
job = next_event->job;
|
job = next_event->job;
|
||||||
|
|
||||||
next_event->destroy(next_event);
|
next_event->destroy(next_event);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
pthread_cond_signal( &(this->condvar));
|
pthread_cond_signal( &(this->condvar));
|
||||||
|
|
||||||
pthread_mutex_unlock(&(this->mutex));
|
pthread_mutex_unlock(&(this->mutex));
|
||||||
|
|
||||||
return job;
|
return job;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user