1 /* Licensed to the Apache Software Foundation (ASF) under one or more
2 * contributor license agreements. See the NOTICE file distributed with
3 * this work for additional information regarding copyright ownership.
4 * The ASF licenses this file to You under the Apache License, Version 2.0
5 * (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include "apr_general.h"
19 #include "apr_errno.h"
21 #include "apr_strings.h"
24 #include <kernel/OS.h>
25 #include "apr_portable.h"
36 APR_DECLARE(apr_status_t) apr_shm_create(apr_shm_t **m,
45 (*m) = (apr_shm_t *)apr_pcalloc(p, sizeof(apr_shm_t));
46 /* we MUST allocate in pages, so calculate how big an area we need... */
47 pagesize = ((reqsize + B_PAGE_SIZE - 1) / B_PAGE_SIZE) * B_PAGE_SIZE;
49 newid = create_area("apr_shmem", (void*)&addr, B_ANY_ADDRESS,
50 pagesize, B_CONTIGUOUS, B_READ_AREA|B_WRITE_AREA);
57 (*m)->memblock = addr;
58 (*m)->ptr = (void*)addr;
59 (*m)->avail = pagesize; /* record how big an area we actually created... */
60 (*m)->reqsize = reqsize;
65 APR_DECLARE(apr_status_t) apr_shm_destroy(apr_shm_t *m)
74 APR_DECLARE(apr_status_t) apr_shm_attach(apr_shm_t **m,
83 deleteme = find_area(filename);
84 if (deleteme == B_NAME_NOT_FOUND)
87 new_m = (apr_shm_t*)apr_palloc(pool, sizeof(apr_shm_t*));
92 get_area_info(deleteme, &ai);
93 get_thread_info(find_thread(NULL), &ti);
95 if (ti.team != ai.team) {
98 narea = clone_area(ai.name, &(ai.address), B_CLONE_ADDRESS,
99 B_READ_AREA|B_WRITE_AREA, ai.area);
104 get_area_info(narea, &ai);
106 new_m->memblock = ai.address;
107 new_m->ptr = (void*)ai.address;
108 new_m->avail = ai.size;
109 new_m->reqsize = ai.size;
117 APR_DECLARE(apr_status_t) apr_shm_detach(apr_shm_t *m)
123 APR_DECLARE(void *) apr_shm_baseaddr_get(const apr_shm_t *m)
128 APR_DECLARE(apr_size_t) apr_shm_size_get(const apr_shm_t *m)
133 APR_POOL_IMPLEMENT_ACCESSOR(shm)
135 APR_DECLARE(apr_status_t) apr_os_shm_get(apr_os_shm_t *osshm,
141 APR_DECLARE(apr_status_t) apr_os_shm_put(apr_shm_t **m,