X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-common%2Ftimeval.c;h=cdb0f099ec10cd40c1f634e935b1fc8ff0d64a9d;hb=9c0f9c65093cfa53d45f9b68782321eb8063a032;hp=e5732cdb7a1c95e406c5700419bb5918650921c7;hpb=5d047523c87ba11aad8c384f7ffde25b4dd746ed;p=catta diff --git a/avahi-common/timeval.c b/avahi-common/timeval.c index e5732cd..cdb0f09 100644 --- a/avahi-common/timeval.c +++ b/avahi-common/timeval.c @@ -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 #endif +#include #include #include @@ -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; }