diff options
-rw-r--r-- | Source/charon/event_queue.c | 22 | ||||
-rw-r--r-- | Source/charon/event_queue.h | 18 | ||||
-rw-r--r-- | Source/charon/tests/event_queue_test.c | 2 |
3 files changed, 37 insertions, 5 deletions
diff --git a/Source/charon/event_queue.c b/Source/charon/event_queue.c index 02deb19ba..132e489a5 100644 --- a/Source/charon/event_queue.c +++ b/Source/charon/event_queue.c @@ -221,7 +221,7 @@ static status_t get(private_event_queue_t *this, job_t **job) /** * @brief implements function add of event_queue_t */ -static status_t add(private_event_queue_t *this, job_t *job, timeval_t time) +static status_t add_absolute(private_event_queue_t *this, job_t *job, timeval_t time) { event_t *event = event_create(time,job); linked_list_element_t * current_list_element; @@ -319,6 +319,23 @@ static status_t add(private_event_queue_t *this, job_t *job, timeval_t time) return status; } +/** + * @brief implements function add of event_queue_t + */ +static status_t add_relative(event_queue_t *this, job_t *job, u_int32_t ms) +{ + timeval_t current_time; + timeval_t time; + int micros = ms * 1000; + + gettimeofday(¤t_time, NULL); + + time.tv_usec = ((current_time.tv_usec + micros) % 1000000); + time.tv_sec = current_time.tv_sec + ((current_time.tv_usec + micros)/ 1000000); + + return this->add_absolute(this, job, time); +} + /** * @brief implements function destroy of event_queue_t @@ -371,7 +388,8 @@ event_queue_t *event_queue_create() this->public.get_count = (status_t (*) (event_queue_t *event_queue, int *count)) get_count; this->public.get = (status_t (*) (event_queue_t *event_queue, job_t **job)) get; - this->public.add = (status_t (*) (event_queue_t *event_queue, job_t *job, timeval_t time)) add; + this->public.add_absolute = (status_t (*) (event_queue_t *event_queue, job_t *job, timeval_t time)) add_absolute; + this->public.add_relative = (status_t (*) (event_queue_t *event_queue, job_t *job, u_int32_t ms)) add_relative; this->public.destroy = (status_t (*) (event_queue_t *event_queue)) event_queue_destroy; this->list = linked_list; diff --git a/Source/charon/event_queue.h b/Source/charon/event_queue.h index b63f0a1f9..cd2829e40 100644 --- a/Source/charon/event_queue.h +++ b/Source/charon/event_queue.h @@ -59,7 +59,7 @@ struct event_queue_s { status_t (*get) (event_queue_t *event_queue, job_t **job); /** - * @brief adds a event to the queue + * @brief adds a event to the queue, using a relative time * * This function is non blocking and adds a job_t at a specific time to the list. * The specific job-object has to get destroyed by the thread which @@ -70,7 +70,21 @@ struct event_queue_s { * @param[in] time time, when the event has to get fired * @returns SUCCESS if succeeded, FAILED otherwise */ - status_t (*add) (event_queue_t *event_queue, job_t *job, timeval_t time); + status_t (*add_relative) (event_queue_t *event_queue, job_t *job, u_int32_t ms); + + /** + * @brief adds a event to the queue, using an absolute time + * + * This function is non blocking and adds a job_t at a specific time to the list. + * The specific job-object has to get destroyed by the thread which + * removes the job. + * + * @param event_queue calling object + * @param[in] job job to add to the queue (job is not copied) + * @param[in] time time, when the event has to get fired + * @returns SUCCESS if succeeded, FAILED otherwise + */ + status_t (*add_absolute) (event_queue_t *event_queue, job_t *job, timeval_t time); /** * @brief destroys a event_queue object diff --git a/Source/charon/tests/event_queue_test.c b/Source/charon/tests/event_queue_test.c index a07d726d3..2cad71c42 100644 --- a/Source/charon/tests/event_queue_test.c +++ b/Source/charon/tests/event_queue_test.c @@ -82,7 +82,7 @@ static void event_queue_insert_thread(event_queue_test_t * testinfos) time.tv_usec = 0; time.tv_sec = current_time.tv_sec + i; - tester->assert_true(tester,(testinfos->event_queue->add(testinfos->event_queue,job,time) == SUCCESS), "add call check"); + tester->assert_true(tester,(testinfos->event_queue->add_absolute(testinfos->event_queue,job,time) == SUCCESS), "add call check"); } } } |