]> git.meshlink.io Git - catta/blobdiff - avahi-common/timeval.c
forgot to pull the publish_no_reverse change to the example.
[catta] / avahi-common / timeval.c
index e5732cdb7a1c95e406c5700419bb5918650921c7..cdb0f099ec10cd40c1f634e935b1fc8ff0d64a9d 100644 (file)
@@ -1,18 +1,16 @@
-/* $Id$ */
-
 /***
   This file is part of avahi.
+
   avahi is free software; you can redistribute it and/or modify it
   under the terms of the GNU Lesser General Public License as
   published by the Free Software Foundation; either version 2.1 of the
   License, or (at your option) any later version.
+
   avahi is distributed in the hope that it will be useful, but WITHOUT
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
   or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
   Public License for more details.
+
   You should have received a copy of the GNU Lesser General Public
   License along with avahi; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
@@ -23,6 +21,7 @@
 #include <config.h>
 #endif
 
+#include <pthread.h>
 #include <stdlib.h>
 #include <assert.h>
 
@@ -76,7 +75,7 @@ struct timeval* avahi_timeval_add(struct timeval *a, AvahiUsec usec) {
 
 AvahiUsec avahi_age(const struct timeval *a) {
     struct timeval now;
-    
+
     assert(a);
 
     gettimeofday(&now, NULL);
@@ -84,7 +83,6 @@ AvahiUsec avahi_age(const struct timeval *a) {
     return avahi_timeval_diff(&now, a);
 }
 
-
 struct timeval *avahi_elapse_time(struct timeval *tv, unsigned msec, unsigned jitter) {
     assert(tv);
 
@@ -93,9 +91,33 @@ struct timeval *avahi_elapse_time(struct timeval *tv, unsigned msec, unsigned ji
     if (msec)
         avahi_timeval_add(tv, (AvahiUsec) msec*1000);
 
-    if (jitter)
-        avahi_timeval_add(tv, (AvahiUsec) (jitter*1000.0*rand()/(RAND_MAX+1.0)));
-        
+    if (jitter) {
+        static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+        static int last_rand;
+        static time_t timestamp = 0;
+
+        time_t now;
+        int r;
+
+        now = time(NULL);
+
+        pthread_mutex_lock(&mutex);
+        if (now >= timestamp + 10) {
+            timestamp = now;
+            last_rand = rand();
+        }
+
+        r = last_rand;
+
+        pthread_mutex_unlock(&mutex);
+
+        /* We use the same jitter for 10 seconds. That way our
+         * time events elapse in bursts which has the advantage that
+         * packet data can be aggregated better */
+
+        avahi_timeval_add(tv, (AvahiUsec) (jitter*1000.0*r/(RAND_MAX+1.0)));
+    }
+
     return tv;
 }