diff options
author | David Reid <dreid@apache.org> | 2002-01-13 14:03:27 +0000 |
---|---|---|
committer | David Reid <dreid@apache.org> | 2002-01-13 14:03:27 +0000 |
commit | b18e382dda7de05f017c6078db9572b5b5b41968 (patch) | |
tree | 722089028dab3396c5a00ea1046e3d95cc9f9e9c /shmem | |
parent | ac317a0893b2a1d3b9a57d434842347d0a436769 (diff) | |
download | apr-b18e382dda7de05f017c6078db9572b5b5b41968.tar.gz |
After running testshm, this commit gets us passing all the tests OK.
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@62777 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'shmem')
-rw-r--r-- | shmem/beos/shm.c | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/shmem/beos/shm.c b/shmem/beos/shm.c index cfbe486ce..94c8b28b2 100644 --- a/shmem/beos/shm.c +++ b/shmem/beos/shm.c @@ -78,14 +78,12 @@ APR_DECLARE(apr_status_t) apr_shm_create(apr_shm_t **m, apr_size_t pagesize; area_id newid; char *addr; - char area_name[32]; (*m) = (apr_shm_t *)apr_pcalloc(p, sizeof(apr_shm_t)); /* we MUST allocate in pages, so calculate how big an area we need... */ pagesize = ((reqsize + B_PAGE_SIZE - 1) / B_PAGE_SIZE) * B_PAGE_SIZE; - sprintf(area_name, "apr_shm:%ld:%ld",find_thread(NULL), pagesize); - newid = create_area(area_name, (void*)&addr, B_ANY_ADDRESS, + newid = create_area(file, (void*)&addr, B_ANY_ADDRESS, pagesize, B_CONTIGUOUS, B_READ_AREA|B_WRITE_AREA); if (newid < 0) @@ -116,20 +114,40 @@ APR_DECLARE(apr_status_t) apr_shm_attach(apr_shm_t **m, { area_info ai; thread_info ti; - area_id deleteme = (*m)->aid; - int offs = ((char*)(*m)->ptr) - ((char*)(*m)->memblock); + area_id deleteme; + apr_shm_t *new_m; + deleteme = find_area(filename); + if (deleteme == B_NAME_NOT_FOUND) + return APR_EINVAL; + + new_m = (apr_shm_t*)apr_palloc(pool, sizeof(apr_shm_t*)); + if (new_m == NULL) + return APR_ENOMEM; + new_m->pool = pool; + get_area_info(deleteme, &ai); get_thread_info(find_thread(NULL), &ti); - + if (ti.team != ai.team) { - delete_area(deleteme); - (*m)->aid = clone_area(ai.name, &(ai.address), B_CLONE_ADDRESS, - B_READ_AREA | B_WRITE_AREA, ai.area); - get_area_info((*m)->aid, &ai); - (*m)->memblock = ai.address; - (*m)->ptr = (void*)ai.address + offs; + area_id narea; + + narea = clone_area(ai.name, &(ai.address), B_CLONE_ADDRESS, + B_READ_AREA|B_WRITE_AREA, ai.area); + + if (narea < B_OK) + return narea; + + get_area_info(narea, &ai); + new_m->aid = narea; + new_m->memblock = ai.address; + new_m->ptr = (void*)ai.address; + new_m->avail = ai.size; + new_m->reqsize = ai.size; } + + (*m) = new_m; + return APR_SUCCESS; } |