diff options
author | Chris Johns <chrisj@rtems.org> | 2017-03-13 12:00:35 -0400 |
---|---|---|
committer | Gedare Bloom <gedare@rtems.org> | 2017-05-05 10:34:08 -0400 |
commit | 8290f95cbdd5129561d8a375a223055ee7941116 (patch) | |
tree | 96d25c735f662d0bed0044d5dc88976b0e8e341b /cpukit/posix/src/munmap.c | |
parent | posix/shm: replace threadq with mutex (allocator lock) (diff) | |
download | rtems-8290f95cbdd5129561d8a375a223055ee7941116.tar.bz2 |
posix: Add mmap/unmap support for mapping files.
This version of mmap comes from early work done
on the RTL code base circa 2012.
Update #2859.
Diffstat (limited to '')
-rw-r--r-- | cpukit/posix/src/munmap.c | 68 |
1 files changed, 54 insertions, 14 deletions
diff --git a/cpukit/posix/src/munmap.c b/cpukit/posix/src/munmap.c index 2496c27ab3..d3687dfef4 100644 --- a/cpukit/posix/src/munmap.c +++ b/cpukit/posix/src/munmap.c @@ -1,28 +1,68 @@ -/** - * @file - */ - /* - * COPYRIGHT (c) 2014. - * On-Line Applications Research Corporation (OAR). + * Copyright (c) 2012 Chris Johns (chrisj@rtems.org) * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. */ #if HAVE_CONFIG_H #include "config.h" #endif +#include <rtems.h> +#include <errno.h> +#include <stdlib.h> #include <sys/mman.h> +#include <rtems/posix/mmanimpl.h> + int munmap( - void *addr, - size_t length + void *addr, size_t len ) { - (void) addr; - (void) length; - return -1; + mmap_mapping* mapping; + rtems_chain_node* node; + + /* + * Clear errno. + */ + errno = 0; + + /* + * Length cannot be 0. + */ + if ( len == 0 ) { + errno = EINVAL; + return -1; + } + + /* + * Obtain the mmap lock. Sets errno on failure. + */ + if ( !mmap_mappings_lock_obtain( )) + return -1; + + node = rtems_chain_first (&mmap_mappings); + while ( !rtems_chain_is_tail( &mmap_mappings, node )) { + /* + * If the map is fixed see if this address is already mapped. At this + * point in time if there is an overlap in the mappings we return an + * error. + */ + mapping = (mmap_mapping*) node; + if ( ( addr >= mapping->addr ) && + ( addr < ( mapping->addr + mapping->len )) ) { + rtems_chain_extract( node ); + if (( mapping->flags & MAP_FIXED ) != MAP_FIXED ) { + free( mapping->addr ); + free( mapping ); + } + break; + } + node = rtems_chain_next( node ); + } + + mmap_mappings_lock_release( ); + return 0; } |