On 18 August 2014 19:50, <stef...@apache.org> wrote: > Author: stefan2 > Date: Mon Aug 18 15:50:44 2014 > New Revision: 1618641 > > URL: http://svn.apache.org/r1618641 > Log: > Within FSFS, replace the use of svn__strtol with a variant that > provides overflow detection. FSFS needs a locale-independent > and preferrably quick number parser. > [...]
> ============================================================================== > --- subversion/trunk/subversion/libsvn_fs_fs/id.c (original) > +++ subversion/trunk/subversion/libsvn_fs_fs/id.c Mon Aug 18 15:50:44 2014 > @@ -48,12 +48,55 @@ typedef struct fs_fs__id_t > > > > +/** Like strtol but with a fixed base of 10, locale independent and limited > + * to non-negative values. Overflows are indicated by a FALSE return value > + * in which case *RESULT_P will not be modified. > + * > + * This allows the compiler to generate massively faster code. > + * (E.g. Avoiding locale specific processing). ID parsing is one of the > + * most CPU consuming parts of FSFS data access. Better be quick. > + */ > +static svn_boolean_t > +fast__strtol(long *result_p, > + const char* buffer, > + const char** end) > +{ > + /* We allow positive values only. Unsigned arithmetics tend to be faster > + * as they allow for a wider range of compiler-side optimizations. */ > + unsigned long result = 0; > + while (1) > + { > + unsigned long c = (unsigned char)*buffer - (unsigned char)'0'; > + unsigned long next; > + > + /* This implies the NUL check. */ > + if (c > 9) > + break; > + > + next = result * 10 + c; > + > + /* Overflow check. */ > + if (next < result) > + return FALSE; > + > + result = next; > + ++buffer; > + } > + > + *end = buffer; > + *result_p = (long)result; > + > + return TRUE; > +} > + Stefan, It maybe worth to make tests for this function (making it private to libsvn_subr for this). What do you think? -- Ivan Zhakov CTO | VisualSVN | http://www.visualsvn.com