On Thu, Feb 13, 2014 at 7:55 PM, Ivan Zhakov <i...@visualsvn.com> wrote:
> On 13 February 2014 22:24, <stef...@apache.org> wrote: > > Author: stefan2 > > Date: Thu Feb 13 18:24:17 2014 > > New Revision: 1567996 > > > > URL: http://svn.apache.org/r1567996 > > > +/* Count a hit in ENTRY within CACHE. > > + */ > > +static void > > +increment_hit_counters(svn_membuffer_t *cache, entry_t *entry) > > +{ > > + /* To minimize the memory footprint of the cache index, we limit local > > + * hit counters to 32 bits. These may overflow and we must make sure > that > > + * the global sums are still (roughly due to races) the sum of all > local > > + * counters. */ > > + if (++entry->hit_count == 0) > > + cache->hit_count -= APR_UINT32_MAX; > > + else > > + cache->hit_count++; > > + > As far I understand this counters are updated from several threads > without mutex? That is correct. > In that case we have to use atomic functions to > increment them, otherwise we may skip hit_count == 0 in some cases. > No. Assuming that the system does not split 32 bit read nor write operations, one (or more) of the threads must increment the value to APR_UINT32_MAX+1==0. No thread will accidentally add by 2 (or more) missing the actual overflow. -- Stefan^2.