summaryrefslogtreecommitdiff
path: root/shmem
diff options
context:
space:
mode:
authorwrowe <wrowe@13f79535-47bb-0310-9956-ffa450edef68>2002-01-25 07:12:37 +0000
committerwrowe <wrowe@13f79535-47bb-0310-9956-ffa450edef68>2002-01-25 07:12:37 +0000
commita412f69aa39c4dd649490e8b364d99dc7503a5fa (patch)
tree25c4e0e96ef7c145f1c4270ef8ccbd8b46f0e8ec /shmem
parentc541fb59ad40bbdc6fcdf78204b9a99295cef408 (diff)
downloadlibapr-a412f69aa39c4dd649490e8b364d99dc7503a5fa.tar.gz
Win32 requires an apr_os accessor for shm regions. This allows us to
take the handle and do interesting things, such as passing it (after duping it) into the child. Unix implementation is simply the address of the shm region, AFAICT, but Aaron is reviewing. git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@62830 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'shmem')
-rw-r--r--shmem/win32/shm.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/shmem/win32/shm.c b/shmem/win32/shm.c
index 754049067..8f9b2b7aa 100644
--- a/shmem/win32/shm.c
+++ b/shmem/win32/shm.c
@@ -264,3 +264,35 @@ APR_DECLARE(apr_size_t) apr_shm_size_get(const apr_shm_t *m)
{
return m->length;
}
+
+APR_DECLARE(apr_status_t) apr_os_shm_get(apr_os_shm_t *osshm,
+ apr_shm_t *shm)
+{
+ *osshm = shm->hMap;
+ return APR_SUCCESS;
+}
+
+APR_DECLARE(apr_status_t) apr_os_shm_put(apr_shm_t **m,
+ apr_os_shm_t *osshm,
+ apr_pool_t *pool)
+{
+ void* base;
+ base = MapViewOfFile(*osshm, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
+ if (!base) {
+ return apr_get_os_error();
+ }
+
+ *m = (apr_shm_t *) apr_palloc(pool, sizeof(apr_shm_t));
+ (*m)->pool = pool;
+ (*m)->hMap = *osshm;
+ (*m)->memblk = base;
+ (*m)->usrmem = (char*)base + sizeof(memblock_t);
+ /* Real (*m)->mem->size could be recovered with VirtualQuery */
+ (*m)->size = (*m)->memblk->size;
+ (*m)->length = (*m)->memblk->length;
+
+ apr_pool_cleanup_register((*m)->pool, *m,
+ shm_cleanup, apr_pool_cleanup_null);
+ return APR_SUCCESS;
+}
+