diff options
author | wrowe <wrowe@13f79535-47bb-0310-9956-ffa450edef68> | 2002-01-25 07:12:37 +0000 |
---|---|---|
committer | wrowe <wrowe@13f79535-47bb-0310-9956-ffa450edef68> | 2002-01-25 07:12:37 +0000 |
commit | a412f69aa39c4dd649490e8b364d99dc7503a5fa (patch) | |
tree | 25c4e0e96ef7c145f1c4270ef8ccbd8b46f0e8ec /shmem | |
parent | c541fb59ad40bbdc6fcdf78204b9a99295cef408 (diff) | |
download | libapr-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.c | 32 |
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; +} + |