diff --git a/lib/include/srslte/common/timeout.h b/lib/include/srslte/common/timeout.h index 2c9560729..4174b0237 100644 --- a/lib/include/srslte/common/timeout.h +++ b/lib/include/srslte/common/timeout.h @@ -84,7 +84,6 @@ public: } void thread_func() { - // substract time elapsed until now from timer duration gettimeofday(&start_time[2], NULL); get_time_interval(start_time); @@ -105,6 +104,14 @@ public: return false; } } + int32_t get_msec_to_expire() { + if (running) { + gettimeofday(&start_time[2], NULL); + get_time_interval(start_time); + return (duration_msec*1000 - start_time[0].tv_usec)/1000; + } + return 0; + } bool is_running() { return running; diff --git a/lib/test/common/timeout_test.cc b/lib/test/common/timeout_test.cc index 5c08e1b66..c2451cdb0 100644 --- a/lib/test/common/timeout_test.cc +++ b/lib/test/common/timeout_test.cc @@ -64,7 +64,43 @@ private: pthread_mutex_t mutex; }; -int main(int argc, char **argv) { + +int timer_thread_test() +{ + bool result; + uint32_t id = 0; + uint32_t duration_msec = 5; + uint32_t result_tolerance = 1; + + callback c; + timeout t; + + gettimeofday(&c.start_time[1], NULL); + t.start(duration_msec); + + while (t.is_running() && !t.expired()) { + printf("time to expire=%dms\n", t.get_msec_to_expire()); + usleep(1000); + } + + gettimeofday(&c.start_time[2], NULL); + get_time_interval(c.start_time); + uint32_t diff_ms = c.start_time[0].tv_usec*1e-3; + printf("Target duration: %dms, started: %ld:%ld, ended: %ld:%ld, actual duration %dms\n", + duration_msec, c.start_time[1].tv_sec, c.start_time[1].tv_usec, c.start_time[2].tv_sec, c.start_time[2].tv_usec, diff_ms); + + result = (duration_msec - result_tolerance <= diff_ms < duration_msec + result_tolerance); + + if(result) { + printf("Timer thread test passed\n"); + return 0; + }else{ + return -1; + } +} + +int single_thread_test() +{ bool result; uint32_t id = 0; uint32_t duration_msec = 5; @@ -84,10 +120,25 @@ int main(int argc, char **argv) { result = (diff_ms == duration_msec); if(result) { - printf("Passed\n"); - exit(0); + printf("Single thread test passed\n"); + return 0; }else{ - printf("Failed\n;"); - exit(1); + return -1; } } + + +int main(int argc, char **argv) +{ + if (single_thread_test()) { + printf("Single thread test failed.\n"); + return -1; + } + + if (timer_thread_test()) { + printf("Timer thread test failed.\n"); + return -1; + } + + return 0; +}