Hi Bert, Bert Huijben writes: > > -----Original Message----- > > From: Ramkumar Ramachandra [mailto:artag...@gmail.com] > > > > Index: subversion/libsvn_subr/io.c > > =================================================================== > > --- subversion/libsvn_subr/io.c (revision 1005706) > > +++ subversion/libsvn_subr/io.c (working copy) > > @@ -1269,7 +1269,8 @@ static svn_error_t * > > get_default_file_perms(apr_fileperms_t *perms, apr_pool_t > > *scratch_pool) > > { > > /* the default permissions as read from the temp folder */ > > - static apr_fileperms_t default_perms = 0; > > + static apr_fileperms_t default_perms; > > + apr_atomic_set32(&default_perms, 0); > > This shouldn't change. This = 0 is applied at application/library load (just > once). After your change it happens at every invocation.
Ok. > > > > /* Technically, this "racy": Multiple threads may use enter here and > > try to figure out the default permisission concurrently. That's > > fine > > @@ -1303,7 +1304,7 @@ get_default_file_perms(apr_fileperms_t *perms, > > apr > > SVN_ERR(svn_io_file_close(fd, scratch_pool)); > > > > *perms = finfo.protection; > > - default_perms = finfo.protection; > > + apr_atomic_set32(&default_perms, finfo.protection); > > Yes, assuming default_perms is a 32 bit integer (which I think it always is) > this makes it safe on all platforms. Without this it relies on cpu > architecture, alignment and possibly caching hints. > (As noted by others, without this patch it should be safe on x86 and x64 > architectures (where compilers handle the proper alignment for the static > variable). But we can't be sure about the other architectures) Right, got it. Can I get a +1 for the following patch? [[[ * subversion/libsvn_subr/io.c (get_default_file_perms): The 32-bit integer `default_perms` is only really atomic (and hence thread-safe) on x86 and x64 where compilers handle the proper alignment for static variables. Handle it in the more general case using `apr_atomic_set32`. Suggested by: Bert ]]] Index: subversion/libsvn_subr/io.c =================================================================== --- subversion/libsvn_subr/io.c (revision 1005706) +++ subversion/libsvn_subr/io.c (working copy) @@ -1303,7 +1303,7 @@ get_default_file_perms(apr_fileperms_t *perms, apr SVN_ERR(svn_io_file_close(fd, scratch_pool)); *perms = finfo.protection; - default_perms = finfo.protection; + apr_atomic_set32(&default_perms, finfo.protection); } else *perms = default_perms;