[irati] [PATCH] Fixing improper timeout calculation for pthread_cond_timed_wait() in librina's concurrency.h

  • From: Marc Sune <marc.sune@xxxxxxxx>
  • To: irati@xxxxxxxxxxxxx
  • Date: Tue, 3 Feb 2015 14:25:06 +0100

Signed-off-by: Marc Sune <marc.sune@xxxxxxxx>
---
 librina/src/concurrency.cc | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/librina/src/concurrency.cc b/librina/src/concurrency.cc
index 32469dc..5ac6cf8 100644
--- a/librina/src/concurrency.cc
+++ b/librina/src/concurrency.cc
@@ -30,6 +30,9 @@
 
 namespace rina {
 
+/* Timed wait constants */
+#define CONCURRENCY_1S_TO_NS 1000000000
+
 /* CLASS CONCURRENT EXCEPTION */
 const std::string ConcurrentException::error_initialize_thread_attributes =
                "Cannot initialize thread attribues";
@@ -581,8 +584,18 @@ void ConditionVariable::doWait(){
 
 void ConditionVariable::timedwait(long seconds, long nanoseconds){
        timespec waitTime;
-       waitTime.tv_sec = time(0) + seconds;
-       waitTime.tv_nsec = nanoseconds;
+
+       //Prepare timespec struct
+       clock_gettime(CLOCK_REALTIME, &waitTime);
+       waitTime.tv_nsec += nanoseconds;
+
+       //Make sure it does not overflow
+       while(waitTime.tv_nsec >= CONCURRENCY_1S_TO_NS){
+               waitTime.tv_sec++;
+               waitTime.tv_nsec -= CONCURRENCY_1S_TO_NS;
+       }
+       waitTime.tv_sec += seconds;
+
        int response = pthread_cond_timedwait(&cond_, getMutex(), &waitTime);
        if (response == 0){
                return;
-- 
2.1.4


Other related posts:

  • » [irati] [PATCH] Fixing improper timeout calculation for pthread_cond_timed_wait() in librina's concurrency.h - Marc Sune