summaryrefslogtreecommitdiff
path: root/shmem/unix/shmem.c
blob: 4235f32a6124dc942761d0fba890449c122f9fa0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
/* ====================================================================
 * Copyright (c) 2000 The Apache Software Foundation.  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 Software Foundation
 *    for use in the Apache HTTP server project (http://www.apache.org/)."
 *
 * 4. The names "Apache Server" and "Apache Software Foundation" 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 Software Foundation.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the Apache Software Foundation
 *    for use in the Apache HTTP server project (http://www.apache.org/)."
 *
 * THIS SOFTWARE IS PROVIDED BY THE Apache Software Foundation ``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 Software Foundation 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 Software Foundation.
 * For more information on the Apache Software Foundation and the Apache HTTP server
 * project, please see <http://www.apache.org/>.
 *
 */

#include "mm.h"
#include "apr_general.h"
#include "apr_shmem.h"
#include "apr_errno.h"

struct shmem_t {
    MM *mm;
};

/* ***APRDOC********************************************************
 * ap_status_t ap_shm_init(ap_shmem_t *m, ap_size_t reqsize, char *file)
 *    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.
 * arg 4) The context to use
 */
ap_status_t ap_shm_init(struct shmem_t **m, ap_size_t reqsize, const char *file, ap_context_t *cont)
{
    MM *newmm = mm_create(reqsize, file);
    if (newmm == NULL) {
        return errno;
    }
    (*m) = mm_malloc(newmm, sizeof(struct shmem_t));
    (*m)->mm = newmm;
    return APR_SUCCESS;
}

/* ***APRDOC********************************************************
 * ap_status_t ap_shm_destroy(ap_shmem_t *m)
 *    Destroy the shared memory block.
 * arg 1) The shared memory block to destroy. 
 */
ap_status_t ap_shm_destroy(struct shmem_t *m)
{
    mm_destroy(m->mm);
    return APR_SUCCESS;
}

/* ***APRDOC********************************************************
 * ap_status_t ap_shm_malloc(ap_shmem_t *c, ap_size_t reqsize)
 *    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)
{
    if (c->mm == NULL) {
        return NULL;
    }
    return mm_malloc(c->mm, reqsize);
}

/* ***APRDOC********************************************************
 * void *ap_shm_calloc(ap_shmem_t *shared, ap_size_t size)
 *    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) 
{
    if (shared == NULL) {
        return NULL;
    }
    return mm_calloc(shared->mm, 1, size);
}

/* ***APRDOC********************************************************
 * ap_status_t ap_shm_free(ap_shmem_t *shared, void *entity)
 *    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;
}

/* ***APRDOC********************************************************
 * ap_status_t ap_get_shm_name(ap_shmem_t *c, ap_shm_name_t **name)
 *    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)
{
#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
}

/* ***APRDOC********************************************************
 * ap_status_t ap_set_shm_name(ap_shmem_t *c, ap_shm_name_t *name)
 *    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)
{
#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
}

/* ***APRDOC********************************************************
 * ap_status_t ap_open_shmem(ap_shmem_t *c)
 *    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)
{
#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
}

/* ***APRDOC********************************************************
 * ap_status_t ap_shm_avail(ap_shmem_t *c, ap_size_t *size)
 *    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(c);
    if (*size == 0) {
        return APR_ESHMLOCK;
    }
    return APR_SUCCESS;
}