You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by jo...@apache.org on 2004/06/01 12:03:51 UTC

cvs commit: apr/test testshm.c

jorton      2004/06/01 03:03:51

  Modified:    .        CHANGES
               include  apr_shm.h
               shmem/beos shm.c
               shmem/os2 shm.c
               shmem/unix shm.c
               shmem/win32 shm.c
               test     testshm.c
  Log:
  * include/apr_shm.c (apr_shm_remove): Add prototype.
  
  * shmem/unix/shm.c (apr_shm_remove): New function.
  
  * shmem/beos/shm.c, shmem/win32/shm.c, shmem/os2/shm.c
  (apr_shm_remove): APR_ENOTIMPL stubs.
  
  Submitted by: Amit Athavale <am...@persistent.co.in>
  
  Revision  Changes    Path
  1.471     +3 -0      apr/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/apr/CHANGES,v
  retrieving revision 1.470
  retrieving revision 1.471
  diff -d -u -r1.470 -r1.471
  --- CHANGES	24 May 2004 09:33:25 -0000	1.470
  +++ CHANGES	1 Jun 2004 10:03:47 -0000	1.471
  @@ -7,6 +7,9 @@
   
   Changes with APR 1.0
   
  +  *) Add apr_shm_remove() function for removing a named shared
  +     memory segment.  [Amit Athavale <amit_athavale persistent.co.in>]
  +
     *) Add apr_strtoff() function for converting numeric strings into 
        apr_off_t values.  [Andr� Malo <nd perlig.de>, Joe Orton]
   
  
  
  
  1.7       +12 -0     apr/include/apr_shm.h
  
  Index: apr_shm.h
  ===================================================================
  RCS file: /home/cvs/apr/include/apr_shm.h,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -d -u -r1.6 -r1.7
  --- apr_shm.h	13 Feb 2004 09:38:28 -0000	1.6
  +++ apr_shm.h	1 Jun 2004 10:03:49 -0000	1.7
  @@ -70,6 +70,18 @@
                                            apr_pool_t *pool);
   
   /**
  + * Remove shared memory segment associated with a filename.
  + * @param filename The filename associated with shared-memory segment which
  + *        needs to be removed
  + * @param pool The pool used for file operations
  + * @remark This function is only supported on platforms which support
  + * name-based shared memory segments, and will return APR_ENOTIMPL on
  + * platforms without such support.
  + */
  +APR_DECLARE(apr_status_t) apr_shm_remove(const char *filename,
  +                                         apr_pool_t *pool);
  +
  +/**
    * Destroy a shared memory segment and associated memory.
    * @param m The shared memory segment structure to destroy.
    */
  
  
  
  1.12      +5 -0      apr/shmem/beos/shm.c
  
  Index: shm.c
  ===================================================================
  RCS file: /home/cvs/apr/shmem/beos/shm.c,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -d -u -r1.11 -r1.12
  --- shm.c	13 Feb 2004 09:38:33 -0000	1.11
  +++ shm.c	1 Jun 2004 10:03:50 -0000	1.12
  @@ -69,6 +69,11 @@
       return APR_SUCCESS;
   }
   
  +APR_DECLARE(apr_status_t) apr_shm_remove(const char *filename,
  +                                         apr_pool_t *pool)
  +{
  +    return APR_ENOTIMPL;
  +}
   
   APR_DECLARE(apr_status_t) apr_shm_attach(apr_shm_t **m,
                                            const char *filename,
  
  
  
  1.10      +6 -0      apr/shmem/os2/shm.c
  
  Index: shm.c
  ===================================================================
  RCS file: /home/cvs/apr/shmem/os2/shm.c,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -d -u -r1.9 -r1.10
  --- shm.c	13 Feb 2004 09:38:33 -0000	1.9
  +++ shm.c	1 Jun 2004 10:03:50 -0000	1.10
  @@ -61,6 +61,12 @@
       return APR_SUCCESS;
   }
   
  +APR_DECLARE(apr_status_t) apr_shm_remove(const char *filename,
  +                                         apr_pool_t *pool)
  +{
  +    return APR_ENOTIMPL;
  +}
  +
   APR_DECLARE(apr_status_t) apr_shm_attach(apr_shm_t **m,
                                            const char *filename,
                                            apr_pool_t *pool)
  
  
  
  1.27      +51 -0     apr/shmem/unix/shm.c
  
  Index: shm.c
  ===================================================================
  RCS file: /home/cvs/apr/shmem/unix/shm.c,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -d -u -r1.26 -r1.27
  --- shm.c	27 May 2004 16:00:05 -0000	1.26
  +++ shm.c	1 Jun 2004 10:03:50 -0000	1.27
  @@ -354,6 +354,57 @@
       return APR_ENOTIMPL;
   }
   
  +APR_DECLARE(apr_status_t) apr_shm_remove(const char *filename,
  +                                         apr_pool_t *pool)
  +{
  +#if APR_USE_SHMEM_SHMGET
  +    apr_status_t status;
  +    apr_file_t *file;  
  +    key_t shmkey;
  +    int shmid;
  +#endif
  +
  +#if APR_USE_SHMEM_MMAP_TMP
  +    return apr_file_remove(filename, pool);
  +#endif
  +#if APR_USE_SHMEM_MMAP_SHM
  +    if (shm_unlink(filename) == -1) {
  +        return errno;
  +    }
  +    return APR_SUCCESS;
  +#endif
  +#if APR_USE_SHMEM_SHMGET
  +    /* Presume that the file already exists; just open for writing */    
  +    status = apr_file_open(&file, filename, APR_WRITE,
  +                           APR_OS_DEFAULT, pool);
  +    if (status) {
  +        return status;
  +    }
  +
  +    /* ftok() (on solaris at least) requires that the file actually
  +     * exist before calling ftok(). */
  +    shmkey = ftok(filename, 1);
  +    if (shmkey == (key_t)-1) {
  +        return errno;
  +    }
  +
  +    if ((shmid = shmget(shmkey, 0, SHM_R | SHM_W)) < 0) {
  +        return errno;
  +    }
  +
  +    /* Indicate that the segment is to be destroyed as soon
  +     * as all processes have detached. This also disallows any
  +     * new attachments to the segment. */
  +    if (shmctl(shmid, IPC_RMID, NULL) == -1) {
  +        return errno;
  +    }
  +    return apr_file_remove(filename, pool);
  +#endif
  +
  +    /* No support for anonymous shm */
  +    return APR_ENOTIMPL;
  +} 
  +
   APR_DECLARE(apr_status_t) apr_shm_destroy(apr_shm_t *m)
   {
       return apr_pool_cleanup_run(m->pool, m, shm_cleanup_owner);
  
  
  
  1.18      +6 -0      apr/shmem/win32/shm.c
  
  Index: shm.c
  ===================================================================
  RCS file: /home/cvs/apr/shmem/win32/shm.c,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -d -u -r1.17 -r1.18
  --- shm.c	13 Feb 2004 09:38:34 -0000	1.17
  +++ shm.c	1 Jun 2004 10:03:50 -0000	1.18
  @@ -162,6 +162,12 @@
       return rv;
   }
   
  +APR_DECLARE(apr_status_t) apr_shm_remove(const char *filename,
  +                                         apr_pool_t *pool)
  +{
  +    return APR_ENOTIMPL;
  +}
  +
   APR_DECLARE(apr_status_t) apr_shm_attach(apr_shm_t **m,
                                            const char *file,
                                            apr_pool_t *pool)
  
  
  
  1.17      +31 -0     apr/test/testshm.c
  
  Index: testshm.c
  ===================================================================
  RCS file: /home/cvs/apr/test/testshm.c,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -d -u -r1.16 -r1.17
  --- testshm.c	15 May 2004 19:51:50 -0000	1.16
  +++ testshm.c	1 Jun 2004 10:03:51 -0000	1.17
  @@ -214,6 +214,36 @@
       ABTS_INT_EQUAL(tc, sent, received);
   
   }
  +
  +static void test_named_remove(abts_case *tc, void *data)
  +{
  +    apr_status_t rv;
  +    apr_shm_t *shm;
  +
  +    rv = apr_shm_create(&shm, SHARED_SIZE, SHARED_FILENAME, p);
  +    apr_assert_success(tc, "Error allocating shared memory block", rv);
  +    if (rv != APR_SUCCESS) {
  +        return;
  +    }
  +    ABTS_PTR_NOTNULL(tc, shm);
  +
  +    rv = apr_shm_remove(SHARED_FILENAME, p);
  +    apr_assert_success(tc, "Error removing shared memory block", rv);
  +    if (rv != APR_SUCCESS) {
  +        return ;
  +    }
  +
  +    rv = apr_shm_create(&shm, SHARED_SIZE, SHARED_FILENAME, p);
  +    apr_assert_success(tc, "Error allocating shared memory block", rv);
  +    if (rv != APR_SUCCESS) {
  +        return;
  +    }
  +    ABTS_PTR_NOTNULL(tc, shm);
  +
  +    rv = apr_shm_destroy(shm);
  +    apr_assert_success(tc, "Error destroying shared memory block", rv);
  +}
  +
   #endif
   
   abts_suite *testshm(abts_suite *suite)
  @@ -228,6 +258,7 @@
       abts_run_test(suite, test_anon, NULL);
   #endif
       abts_run_test(suite, test_named, NULL); 
  +    abts_run_test(suite, test_named_remove, NULL); 
   #endif
   
       return suite;