From 6ddb2a0687ccf361a99bc96229dc15dec2b0f062 Mon Sep 17 00:00:00 2001 From: rbb Date: Thu, 27 Jan 2000 23:49:36 +0000 Subject: A first pass at shared memory for Unix. This is still pretty ugly, but I will clean it up over the next few days. At least this gives everybody some idea of where I want the shared memory stuff to go in APR. git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@59625 13f79535-47bb-0310-9956-ffa450edef68 --- shmem/shmem.c | 157 --------------------------------------- shmem/unix/Makefile.in | 5 +- shmem/unix/shmem.c | 198 ++++++++++++++++++++++++++++++++----------------- 3 files changed, 132 insertions(+), 228 deletions(-) delete mode 100644 shmem/shmem.c (limited to 'shmem') diff --git a/shmem/shmem.c b/shmem/shmem.c deleted file mode 100644 index 41f56b84c..000000000 --- a/shmem/shmem.c +++ /dev/null @@ -1,157 +0,0 @@ -/* ==================================================================== - * Copyright (c) 1999 The Apache Group. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the Apache Group - * for use in the Apache HTTP server project (http://www.apache.org/)." - * - * 4. The names "Apache Server" and "Apache Group" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache" - * nor may "Apache" appear in their names without prior written - * permission of the Apache Group. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the Apache Group - * for use in the Apache HTTP server project (http://www.apache.org/)." - * - * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Group. - * For more information on the Apache Group and the Apache HTTP server - * project, please see . - * - */ - -struct shmem_t { - MM *mm; - ap_context_t *cntxt; -} - -ap_status_t ap_shm_create(struct shmem_t **new, ap_context_t *cont, ap_size_t size, const char *file) -{ - MM *mm = mm_create(size, file); - - if (mm == NULL) { - return APR_ENOMEM; - } - (*new) = (struct shmem_t *)mm_malloc(mm, sizeof(struct shmem_t)); - if ((*new) == NULL) - return APR_ENOMEM; - } - (*new)->mm = mm; - (*new)->cntxt = cont; - return APR_SUCCESS; -} - -ap_status_t ap_shm_destroy(struct shmem_t *shared) -{ - mm_destroy(shared->mm); - shared->mm = NULL; - return APR_SUCCESS; -} - -ap_status_t ap_shm_malloc(void **entity, struct shmem_t *shared, ap_size_t size) -{ - entity = mm_malloc(shared->mm, size); - if (entity == NULL) { - return APR_ENOMEM; - } - return APR_SUCCESS; -} - -ap_status_t ap_shm_calloc(void **entity, struct shmem_t *shared, ap_size_t size) -{ - entity = mm_calloc(shared->mm, size); - if (entity == NULL) { - return APR_ENOMEM; - } - return APR_SUCCESS; -} - -ap_status_t ap_shm_realloc(void **entity, struct shmem_t *shared, ap_size_t size) -{ - void *new; - - new = mm_realloc(shared->mm, *entity, size); - if (new == NULL) - return APR_ENOMEM; - } - - (*entity) = new; - return APR_SUCCESS; -} - -ap_status_t ap_shm_free(struct shmem_t *shared, void *entity) -{ - mm_free(shared->mm, entity); - return APR_SUCCESS; -} - -ap_status_t ap_shm_strdup(char **new, struct shmem_t *shared, const char *old) -{ - (*new) = mm_strdup(shared->mm, old); - if ((*new) == NULL) { - return APR_ENOMEM; - } - return APR_SUCCESS; -} - -ap_status_t ap_shm_sizeof(struct shmem_t *shared, const void *ent, - ap_size_t *size) -{ - *size = mm_sizeof(shared->mm, ent); - if ((*size) == -1) { - return APR_EINVAL; - } - return APR_SUCCESS; -} - -ap_status_t ap_shm_maxsize(ap_size_t **size) -{ - (*size) = mm_maxsize(); - if ((*size) <= 0) { - return APR_ENOMEM; - } - return APR_SUCCESS; -} - -ap_status_t ap_shm_available(struct shmem_t *shared, ap_size_t *size) -{ - (*size) = mm_available(shared->mm); - if ((*size <= 0) { - return APR_ENOMEM; - } - return APR_SUCCESS; -} - diff --git a/shmem/unix/Makefile.in b/shmem/unix/Makefile.in index b96e8b404..c30988938 100644 --- a/shmem/unix/Makefile.in +++ b/shmem/unix/Makefile.in @@ -11,7 +11,8 @@ LIBS=@LIBS@ LDFLAGS=@LDFLAGS@ $(LIBS) INCDIR=../../inc INCDIR1=../../include -INCLUDES=-I$(INCDIR) -I$(INCDIR1) -Imm -I. +INCDIR2=../../misc/@OSDIR@ +INCLUDES=-I$(INCDIR) -I$(INCDIR1) -I$(INCDIR2) -Imm -I. LIB=libshmem.a @@ -32,6 +33,8 @@ $(OBJS): Makefile $(LIB): $(OBJS) $(RM) -f $@ + cd mm; make; cd .. + cp mm/*.o . $(AR) cr $@ $(OBJS) $(RANLIB) $@ diff --git a/shmem/unix/shmem.c b/shmem/unix/shmem.c index 1263c0cee..6addd28a3 100644 --- a/shmem/unix/shmem.c +++ b/shmem/unix/shmem.c @@ -55,116 +55,174 @@ #include "mm.h" #include "apr_general.h" +#include "apr_shmem.h" #include "apr_errno.h" struct shmem_t { MM *mm; - ap_context_t *cntxt; }; -ap_status_t ap_shm_create(ap_context_t *cont, ap_size_t size, const char *file, - struct shmem_t **new) +/* ***APRDOC******************************************************** + * ap_status_t ap_shm_init(ap_shmem_t *, ap_size_t, char *) + * Create a pool of shared memory for use later. + * arg 1) The shared memory block. + * arg 2) The size of the shared memory pool. + * arg 3) The file to use for the shared memory on platforms that + * require it. + */ +ap_status_t ap_shm_init(struct shmem_t **m, ap_size_t reqsize, const char *file) { - MM *mm = mm_create(size, file); - - if (mm == NULL) { - return APR_ENOMEM; - } - (*new) = (struct shmem_t *)mm_malloc(mm, sizeof(struct shmem_t)); - if ((*new) == NULL) { - return APR_ENOMEM; + MM *newmm = mm_create(reqsize, file); + if (newmm == NULL) { + return errno; } - (*new)->mm = mm; - (*new)->cntxt = cont; + (*m) = mm_malloc(newmm, sizeof(struct shmem_t)); + (*m)->mm = newmm; return APR_SUCCESS; } -ap_status_t ap_shm_destroy(struct shmem_t *shared) -{ - mm_destroy(shared->mm); - shared->mm = NULL; - return APR_SUCCESS; -} - -ap_status_t ap_shm_malloc(void **entity, struct shmem_t *shared, ap_size_t size) +/* ***APRDOC******************************************************** + * ap_status_t ap_shm_destroy(ap_shmem_t *) + * Destroy the shared memory block. + * arg 1) The shared memory block to destroy. + */ +ap_status_t ap_shm_destroy(struct shmem_t *m) { - entity = mm_malloc(shared->mm, size); - if (entity == NULL) { - return APR_ENOMEM; - } + mm_destroy(m->mm); + m->mm = NULL; return APR_SUCCESS; } -ap_status_t ap_shm_calloc(struct shmem_t *shared, ap_size_t num, - ap_size_t size, void **entity) +/* ***APRDOC******************************************************** + * ap_status_t ap_shm_malloc(ap_shmem_t *, ap_size_t) + * allocate memory from the block of shared memory. + * arg 1) The shared memory block to destroy. + * arg 2) How much memory to allocate + */ +void *ap_shm_malloc(struct shmem_t *c, ap_size_t reqsize) { - entity = mm_calloc(shared->mm, num, size); - if (entity == NULL) { - return APR_ENOMEM; + if (c->mm == NULL) { + return NULL; } - return APR_SUCCESS; + return mm_malloc(c->mm, reqsize); } -ap_status_t ap_shm_realloc(void **entity, struct shmem_t *shared, ap_size_t size) +/* ***APRDOC******************************************************** + * ap_status_t ap_shm_calloc(ap_shmem_t *, ap_size_t) + * allocate memory from the block of shared memory and initialize it + * to zero. + * arg 1) The shared memory block to destroy. + * arg 2) How much memory to allocate + */ +void *ap_shm_calloc(struct shmem_t *shared, ap_size_t size) { - void *new; - - new = mm_realloc(shared->mm, *entity, size); - if (new == NULL) { - return APR_ENOMEM; + if (shared == NULL) { + return NULL; } - - (*entity) = new; - return APR_SUCCESS; + return mm_calloc(shared->mm, 1, size); } +/* ***APRDOC******************************************************** + * ap_status_t ap_shm_free(ap_shmem_t *, void *) + * free shared memory previously allocated. + * arg 1) The shared memory block to destroy. + */ ap_status_t ap_shm_free(struct shmem_t *shared, void *entity) { mm_free(shared->mm, entity); return APR_SUCCESS; } -ap_status_t ap_shm_strdup(char **new, struct shmem_t *shared, const char *old) +/* ***APRDOC******************************************************** + * ap_status_t ap_get_shm_name(ap_shmem_t *, ap_shm_name_t **) + * Get the name of the shared memory segment if not using + * anonymous shared memory. + * arg 1) The shared memory block to destroy. + * arg 2) The name of the shared memory block, NULL if anonymous + * shared memory. + * return) APR_USES_ANONYMOUS_SHM if we are using anonymous shared + * memory. APR_USES_FILEBASED_SHM if our shared memory is + * based on file access. APR_USES_KEYBASED_SHM if shared + * memory is based on a key value such as shmctl. If the + * shared memory is anonymous, the name is NULL. + */ +ap_status_t ap_get_shm_name(ap_shmem_t *c, ap_shm_name_t **name) { - (*new) = mm_strdup(shared->mm, old); - if ((*new) == NULL) { - return APR_ENOMEM; - } - return APR_SUCCESS; +#if APR_USES_ANONYMOUS_SHM + name = NULL; + return APR_ANONYMOUS; +/* Currently, we are not supporting name based shared memory on Unix + * systems. This may change in the future however, so I will leave + * this in here for now. Plus, this gives other platforms a good idea + * of how to proceed. + */ +#elif APR_USES_FILEBASED_SHM +#elif APR_USES_KEYBASED_SHM +#endif } -ap_status_t ap_shm_sizeof(struct shmem_t *shared, const void *ent, - ap_size_t *size) +/* ***APRDOC******************************************************** + * ap_status_t ap_set_shm_name(ap_shmem_t *, ap_shm_name_t *) + * Set the name of the shared memory segment if not using + * anonymous shared memory. This is to allow processes to open + * shared memory created by another process. + * arg 1) The shared memory block to destroy. + * arg 2) The name of the shared memory block, NULL if anonymous + * shared memory. + * return) APR_USES_ANONYMOUS_SHM if we are using anonymous shared + * memory. APR_SUCCESS if we are using named shared memory + * and we were able to assign the name correctly. + */ +ap_status_t ap_set_shm_name(ap_shmem_t *c, ap_shm_name_t *name) { - *size = mm_sizeof(shared->mm, ent); - if ((*size) == -1) { - return APR_EINVAL; - } - return APR_SUCCESS; +#if APR_USES_ANONYMOUS_SHM + return APR_ANONYMOUS; +/* Currently, we are not supporting name based shared memory on Unix + * systems. This may change in the future however, so I will leave + * this in here for now. Plus, this gives other platforms a good idea + * of how to proceed. + */ +#elif APR_USES_FILEBASED_SHM +#elif APR_USES_KEYBASED_SHM +#endif } -ap_status_t ap_shm_maxsize(ap_size_t *size) +/* ***APRDOC******************************************************** + * ap_status_t ap_open_shmem(ap_shmem_t *) + * Open the shared memory block in a child process. + * arg 1) The shared memory block to open in the child. + * return) This should be called after ap_set_shm_name. The ap_shmem_t + * variable must refer to the memory segment to open. + */ +ap_status_t ap_open_shmem(struct shmem_t *c) { - (*size) = mm_maxsize(); - if ((*size) <= 0) { - return APR_ENOMEM; - } +#if APR_USES_ANONYMOUS_SHM +/* When using MM, we don't need to open shared memory segments in child + * segments, so just return immediately. + */ return APR_SUCCESS; +/* Currently, we are not supporting name based shared memory on Unix + * systems. This may change in the future however, so I will leave + * this in here for now. Plus, this gives other platforms a good idea + * of how to proceed. + */ +#elif APR_USES_FILEBASED_SHM +#elif APR_USES_KEYBASED_SHM +#endif } -ap_status_t ap_shm_available(struct shmem_t *shared, ap_size_t *size) +/* ***APRDOC******************************************************** + * ap_status_t ap_shm_avail(ap_shmem_t *, ap_size_t *) + * Determine how much memory is available in the specified shared + * memory block + * arg 1) The shared memory block to open in the child. + * arg 2) The amount of space available in the shared memory block. + */ +ap_status_t ap_shm_avail(struct shmem_t *c, ap_size_t *size) { - (*size) = mm_available(shared->mm); - if ((*size) <= 0) { - return APR_ENOMEM; + *size = mm_available(c); + if (*size == 0) { + return APR_ESHMLOCK; } return APR_SUCCESS; } - -ap_status_t ap_shm_child_create(ap_context_t *cont, const char *fname, - struct shmem_t **shared) -{ - return APR_SUCCESS; -} - - -- cgit v1.2.1