Преглед изворни кода

ZOOKEEPER-1062. Net-ZooKeeper: Net::ZooKeeper consumes 100% cpu on wait (Botond Hejj via michim)

git-svn-id: https://svn.apache.org/repos/asf/zookeeper/trunk@1595374 13f79535-47bb-0310-9956-ffa450edef68
Michi Mutsuzaki пре 11 година
родитељ
комит
fa7fe4d667
2 измењених фајлова са 10 додато и 12 уклоњено
  1. 3 0
      CHANGES.txt
  2. 7 12
      src/contrib/zkperl/ZooKeeper.xs

+ 3 - 0
CHANGES.txt

@@ -645,6 +645,9 @@ BUGFIXES:
   ZOOKEEPER-1836. addrvec_next() fails to set next parameter if
   addrvec_hasnext() returns false (Dutch T. Meyer via michim)
 
+  ZOOKEEPER-1062. Net-ZooKeeper: Net::ZooKeeper consumes 100% cpu on wait
+  (Botond Hejj via michim)
+
 IMPROVEMENTS:
 
   ZOOKEEPER-1170. Fix compiler (eclipse) warnings: unused imports,

+ 7 - 12
src/contrib/zkperl/ZooKeeper.xs

@@ -2604,6 +2604,7 @@ zkw_wait(zkwh, ...)
         unsigned int timeout;
         struct timeval end_timeval;
         int i, done;
+        struct timespec wait_timespec;
     PPCODE:
         watch = _zkw_get_handle_outer(aTHX_ zkwh, NULL);
 
@@ -2630,25 +2631,19 @@ zkw_wait(zkwh, ...)
         end_timeval.tv_sec += timeout / 1000;
         end_timeval.tv_usec += (timeout % 1000) * 1000;
 
+        wait_timespec.tv_sec = end_timeval.tv_sec;
+        wait_timespec.tv_nsec = end_timeval.tv_usec * 1000;
+
         pthread_mutex_lock(&watch->mutex);
 
         while (!watch->done) {
             struct timeval curr_timeval;
-            struct timespec wait_timespec;
 
             gettimeofday(&curr_timeval, NULL);
 
-            wait_timespec.tv_sec = end_timeval.tv_sec - curr_timeval.tv_sec;
-            wait_timespec.tv_nsec =
-                (end_timeval.tv_usec - curr_timeval.tv_usec) * 1000;
-
-            if (wait_timespec.tv_nsec < 0) {
-                --wait_timespec.tv_sec;
-                wait_timespec.tv_nsec += 1000000000;
-            }
-
-            if (wait_timespec.tv_sec < 0 ||
-                (wait_timespec.tv_sec == 0 && wait_timespec.tv_nsec <= 0)) {
+            if (end_timeval.tv_sec < curr_timeval.tv_sec ||
+                (end_timeval.tv_sec == curr_timeval.tv_sec &&
+                 end_timeval.tv_usec <= curr_timeval.tv_usec)) {
                 break;
             }