X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-common%2Ftimeval.c;h=2d0d69307c8c155551b446dc32d47c91b35d2ed8;hb=1b00ed03e1a2903b01565e270300f35c3d7db1ae;hp=e5732cdb7a1c95e406c5700419bb5918650921c7;hpb=5d047523c87ba11aad8c384f7ffde25b4dd746ed;p=catta diff --git a/avahi-common/timeval.c b/avahi-common/timeval.c index e5732cd..2d0d693 100644 --- a/avahi-common/timeval.c +++ b/avahi-common/timeval.c @@ -23,6 +23,7 @@ #include #endif +#include #include #include @@ -84,7 +85,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,8 +93,32 @@ 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 aggegrated better */ + + avahi_timeval_add(tv, (AvahiUsec) (jitter*1000.0*r/(RAND_MAX+1.0))); + } return tv; }