On Mon, Nov 19, 2012 at 6:24 PM, Daniel Shahaf <d...@daniel.shahaf.name>wrote:

> A few questions about named_atomic.c:
>
> Index: subversion/libsvn_subr/named_atomic.c
> ===================================================================
> --- subversion/libsvn_subr/named_atomic.c       (revision 1411269)
> +++ subversion/libsvn_subr/named_atomic.c       (working copy)
> @@ -309,6 +309,7 @@ delete_lock_file(void *arg)
>
>    /* locks have already been cleaned up. Simply close the file */
>    apr_file_close(mutex->lock_file);
> +  /* ### check the return value? */
>

Yup. Fixed in r1413420.


>    /* Remove the file from disk. This will fail if there ares still other
>     * users of this lock file, i.e. namespace. */
> @@ -324,6 +325,7 @@ delete_lock_file(void *arg)
>  static svn_error_t *
>  validate(svn_named_atomic__t *atomic)
>  {
> +  /* ### What is the purpose of this validation?  What does it do? */
>

Tries to catch callers of the named atomics API that did not check
the results of a failed call toe.g. svn_named_atomic__get. Basically
a paranoia check for NULL before dereferencing.


>    return atomic && atomic->data && atomic->mutex
>      ? SVN_NO_ERROR
>      : svn_error_create(SVN_ERR_BAD_ATOMIC, 0, _("Not a valid atomic"));
> @@ -394,6 +396,7 @@ svn_atomic_namespace__create(svn_atomic_namespace_
>    const char *shm_name, *lock_name;
>    apr_finfo_t finfo;
>
> +  /* ### Use a scratch_pool provided by caller? */
>

Hm, maybe. But the only caller doesn't have such a thing handy,
so changing this API would potentially ripple through much code
without giving an actual benefit.


>    apr_pool_t *subpool = svn_pool_create(result_pool);
>
>    /* allocate the namespace data structure
> @@ -421,10 +424,15 @@ svn_atomic_namespace__create(svn_atomic_namespace_
>    apr_pool_cleanup_register(result_pool, &new_ns->mutex,
>                              delete_lock_file,
>                              apr_pool_cleanup_null);
> +  /* ### If svn_atomic_namespace__create() is called twice, the cleanup
> +     ### handler will be installed twice - so the lock will be removed
> +     ### as soon as _either_ if them is fired. Problem?  */
>

According to the APR docs on apr_file_remove, this should not
be a problem. Now documented in the code.

   /* Prevent concurrent initialization.
>     */
>    SVN_ERR(lock(&new_ns->mutex));
> +  /* ### What if two functions reach this line of code concurrently?
>  Should
> +     ### the rest of the function be an svn_atomic__init_once() callback?
> */
>

No. It is permitted by design that the same process may open
the same process multiple time (holding independent references /
handles to it). The lock only prevents concurrent / racy initializations
of the shared data.


>    /* First, make sure that the underlying file exists.  If it doesn't
>     * exist, create one and initialize its content.
> Index: subversion/include/private/svn_named_atomic.h
> ===================================================================
> --- subversion/include/private/svn_named_atomic.h       (revision 1411269)
> +++ subversion/include/private/svn_named_atomic.h       (working copy)
> @@ -104,8 +104,10 @@ svn_atomic_namespace__cleanup(const char *name,
>   * characters and an error will be returned if the specified name is
> longer
>   * than supported.
>   *
> - * @note The lifetime of the atomic is bound to the lifetime
> + * @note The lifetime of the atomic object is bound to the lifetime
>   * of the @a ns object, i.e. the pool the latter was created in.
> + * The namespace persists as long as at least one process holds
> + * an #svn_atomic_namespace__t object corresponding to it.
>   */
>

Committed with some additional clarification.


>  svn_error_t *
>  svn_named_atomic__get(svn_named_atomic__t **atomic,
>
> I've skipped some details, but those that I haven't appear to be
> straightforward.
>

Perfectly fine review. Thanks!

-- Stefan^2.

-- 
Certified & Supported Apache Subversion Downloads:
*

http://www.wandisco.com/subversion/download
*

Reply via email to