diff options
author | Florian Weimer <fweimer@redhat.com> | 2017-11-27 17:14:29 +0100 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2017-11-27 17:14:29 +0100 |
commit | 4bab02240e9076b49702b30bb8a1d23a0afe58cb (patch) | |
tree | fc60d42e429ae1032be1f0291145232594e1ee4e /sysdeps/unix/sysv/linux/mlock2.c | |
parent | a23aa5b7272ec4a04578d82399ec2bf536281119 (diff) | |
download | glibc-4bab02240e9076b49702b30bb8a1d23a0afe58cb.tar.gz |
Implement the mlock2 function
Fallback using mlock is provided if the flags argument is zero.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Diffstat (limited to 'sysdeps/unix/sysv/linux/mlock2.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/mlock2.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/linux/mlock2.c b/sysdeps/unix/sysv/linux/mlock2.c new file mode 100644 index 0000000000..1686ab9b85 --- /dev/null +++ b/sysdeps/unix/sysv/linux/mlock2.c @@ -0,0 +1,40 @@ +/* Wrapper for the mlock2 system call with fallback to mlock. + Copyright (C) 2017 Free Software Foundation, Inc. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <sys/mman.h> +#include <errno.h> +#include <sysdep.h> + +int +mlock2 (const void *addr, size_t length, unsigned int flags) +{ +#ifdef __ASSUME_MLOCK2 + return INLINE_SYSCALL_CALL (mlock2, addr, length, flags); +#else + if (flags == 0) + return INLINE_SYSCALL_CALL (mlock, addr, length); +# ifdef __NR_mlock2 + int ret = INLINE_SYSCALL_CALL (mlock2, addr, length, flags); + if (ret == 0 || errno != ENOSYS) + return ret; +# endif /* __NR_mlock2 */ + /* Treat the missing system call as an invalid (non-zero) flag + argument. */ + __set_errno (EINVAL); + return -1; +#endif /* __ASSUME_MLOCK2 */ +} |