James Lentini wrote:



On Tue, 2 Aug 2005, Arlin Davis wrote:

James Lentini wrote:



On Mon, 25 Jul 2005, Arlin Davis wrote:

James,

Here is a patch to fix dapl_os_wait_object_wait() returning
EINVAL when passing nsec == 1000000000 to pthread_cond_timedwait().
Hit a rare case where _microsecs was exactly 1000000.



What was the timeout_val being passed to dapl_os_wait_object_wait()? Was it 1000000000 or 1000000?


It was the calculated time of microsecs that resulted in exactly 1000000 (1 sec) not timeout_val..


I understand now. I think the code can be simplified further. Can you look over the patch below (and attached) and let me know if you see any problems?


No problems. Looks good.


Index: dapl/udapl/linux/dapl_osd.c
===================================================================
--- dapl/udapl/linux/dapl_osd.c (revision 2949)
+++ dapl/udapl/linux/dapl_osd.c (working copy)
@@ -241,17 +241,10 @@
        unsigned int microsecs;

        gettimeofday (&now, &tz);
-       microsecs = now.tv_usec + (timeout_val % 1000000);
-       if (microsecs > 1000000)
-       {
-           now.tv_sec = now.tv_sec + timeout_val / 1000000 + 1;
-           now.tv_usec = microsecs - 1000000;
-       }
-       else
-       {
-           now.tv_sec = now.tv_sec + timeout_val / 1000000;
-           now.tv_usec = microsecs;
-       }
+#define USEC_PER_SEC 1000000
+       microsecs = now.tv_usec + timeout_val;
+       now.tv_sec = now.tv_sec + microsecs/USEC_PER_SEC;
+       now.tv_usec = microsecs % USEC_PER_SEC;

        /* Convert timeval to timespec */
        future.tv_sec = now.tv_sec;

------------------------------------------------------------------------

Index: dapl/udapl/linux/dapl_osd.c
===================================================================
--- dapl/udapl/linux/dapl_osd.c (revision 2949)
+++ dapl/udapl/linux/dapl_osd.c (working copy)
@@ -241,17 +241,10 @@
        unsigned int microsecs;

        gettimeofday (&now, &tz);
-       microsecs = now.tv_usec + (timeout_val % 1000000);
-       if (microsecs > 1000000)
-       {
-           now.tv_sec = now.tv_sec + timeout_val / 1000000 + 1;
-           now.tv_usec = microsecs - 1000000;
-       }
-       else
-       {
-           now.tv_sec = now.tv_sec + timeout_val / 1000000;
-           now.tv_usec = microsecs;
-       }
+#define USEC_PER_SEC 1000000
+       microsecs = now.tv_usec + timeout_val;
+       now.tv_sec = now.tv_sec + microsecs/USEC_PER_SEC;
+       now.tv_usec = microsecs % USEC_PER_SEC;

        /* Convert timeval to timespec */
        future.tv_sec = now.tv_sec;

_______________________________________________
openib-general mailing list
[email protected]
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to