stef...@apache.org writes:

> Author: stefan2
> Date: Wed Oct 31 12:27:29 2012
> New Revision: 1404112
>
> URL: http://svn.apache.org/viewvc?rev=1404112&view=rev
> Log:
> Change the way we implement shared memory setup for our named atomics.
> Instead of using APR's SHM API, we create a persistent file and simply
> mmap it.

> +/* Make sure the revprop_namespace member in FS is set. */
> +static svn_error_t *
> +cleanup_revprop_namespace(svn_fs_t *fs)
> +{
> +  const char* name = svn_dirent_join(fs->path,

     const char *name 

> +  err = svn_io_check_path(shm_name, &kind, sub_pool);
> +  if (!err && kind != svn_node_file)
>      {
> -      apr_err = apr_shm_attach(&shared_mem, shm_name, result_pool);
> -      if (!apr_err)
> -        {
> -          new_ns->data = apr_shm_baseaddr_get(shared_mem);
> -          break;
> -        }
> -
> -      /* First race: failed to attach but another process could create. */
> -
> -      apr_err = apr_shm_create(&shared_mem,
> -                               sizeof(*new_ns->data),
> -                               shm_name,
> -                               result_pool);
> -      if (!apr_err)
> +      err = svn_io_file_open(&file, shm_name,
> +                             APR_READ | APR_WRITE | APR_CREATE,
> +                             APR_OS_DEFAULT,
> +                             result_pool);
> +      if (!err)
>          {
> -          new_ns->data = apr_shm_baseaddr_get(shared_mem);
> -
> -          /* Zero all counters, values and names. */
> -          memset(new_ns->data, 0, sizeof(*new_ns->data));
> -          break;
> +           /* Zero all counters, values and names.
> +            */
> +           struct shared_data_t initial_data;
> +           memset(&initial_data, 0, sizeof(initial_data));
> +           err = svn_io_file_write_full(file, &initial_data,
> +                                        sizeof(initial_data), NULL,
> +                                        sub_pool);
>          }
> -
> -      /* Second race: failed to create but another process could delete. */
> +    }
> +  else
> +    {
> +      err = svn_io_file_open(&file, shm_name,
> +                             APR_READ | APR_WRITE, APR_OS_DEFAULT,
> +                             result_pool);
>      }
>  
> -  if (apr_err)
> -    return unlock(&new_ns->mutex,
> -                  svn_error_wrap_apr(apr_err,
> -                          _("Can't get shared memory for named atomics")));
> +  /* Now, map it into memory.
> +   */

Need to do something with err, at present it leaks.  The mmap call
probably doesn't make sense if err is set.

> +  apr_err = apr_mmap_create(&mmap, file, 0, sizeof(*new_ns->data),
> +                            APR_MMAP_READ | APR_MMAP_WRITE , result_pool);
> +  if (!apr_err)
> +    new_ns->data = mmap->mm;
>  
> +  svn_pool_destroy(sub_pool);

-- 
Certified & Supported Apache Subversion Downloads:
http://www.wandisco.com/subversion/download

Reply via email to