You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by GitBox <gi...@apache.org> on 2021/11/03 13:38:36 UTC

[GitHub] [incubator-nuttx] gustavonihei commented on a change in pull request #4779: libs/libc/wqueue/work_usrthread.c: Correct time calculation in work_p…

gustavonihei commented on a change in pull request #4779:
URL: https://github.com/apache/incubator-nuttx/pull/4779#discussion_r741945947



##########
File path: libs/libc/wqueue/work_usrthread.c
##########
@@ -193,15 +193,18 @@ static void work_process(FAR struct usr_wqueue_s *wqueue)
     {
       struct timespec rqtp;
       time_t sec;
+      uint64_t nsec;
 
       /* Wait awhile to check the work list.  We will wait here until
        * either the time elapses or until we are awakened by a semaphore.
        * Interrupts will be re-enabled while we wait.
        */
 
-      sec          = next / 1000000;
-      rqtp.tv_sec  = sec;
-      rqtp.tv_nsec = (next - (sec * 1000000)) * 1000;
+      clock_gettime(CLOCK_REALTIME, &rqtp);
+      nsec = 1000 * TICK2USEC(next);
+      sec = nsec / (1000 * 1000 * 1000);
+      rqtp.tv_sec  += sec;
+      rqtp.tv_nsec += (uint32_t)(nsec - sec * 1000 * 1000 * 1000);

Review comment:
       ```suggestion
         clock_gettime(CLOCK_REALTIME, &rqtp);
         nsec = TICK2NSEC(next);
         sec = nsec / NSEC_PER_SEC;
         rqtp.tv_sec  += sec;
         rqtp.tv_nsec += nsec - sec * NSEC_PER_SEC;
   
         if (rqtp.tv_nsec >= NSEC_PER_SEC)
           {
             rqtp.tv_sec++;
             rqtp.tv_nsec -= NSEC_PER_SEC;
           }
   ```
   Some considerations here:
   1) Suggest using the nanoseconds macros for achieving cleaner code.
   2) The cast to `uint32_t` might end up narrowing the value on 64 bits architectures, since `tv_nsec` type is `long`.
   3) After incrementing `tv_nsec`, we still need to check if the final value is within the valid range of \[0, 1000000000\] (https://en.cppreference.com/w/c/chrono/timespec)




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@nuttx.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org