Mercurial > mplayer.hg
view osdep/mmap_anon.c @ 27144:76ddca5027c3
r25179: Add missing forced linebreak, slight wording improvement.
r25189: Add an example for play DTS-CD with passsthrough.
r25194: -identify shows chapters times when playing dvd streams
r25314: cleanup and conformation of values description for -ass-hinting
r25315: minor spelling/grammar fixes
r25343: Fix all current known multi-channel wrong order problems [...]
r25379: Fix libass to support -nofontconfig.
author | kraymer |
---|---|
date | Mon, 30 Jun 2008 19:35:27 +0000 |
parents | 10f268ec0d87 |
children | 5cfef41a1771 |
line wrap: on
line source
/** * \file mmap_anon.c * \brief Provide a compatible anonymous space mapping function */ #include "config.h" #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/mman.h> #if defined(MAP_ANON) && !defined(MAP_ANONYMOUS) #define MAP_ANONYMOUS MAP_ANON #endif /* * mmap() anonymous space, depending on the system's mmap() style. On systems * that use the /dev/zero mapping idiom, zerofd will be set to the file descriptor * of the opened /dev/zero. */ /** * \brief mmap() anonymous space, depending on the system's mmap() style. On systems * that use the /dev/zero mapping idiom, zerofd will be set to the file descriptor * of the opened /dev/zero. * * \param addr address to map at. * \param len number of bytes from addr to be mapped. * \param prot protections (region accessibility). * \param flags specifies the type of the mapped object. * \param offset start mapping at byte offset. * \param zerofd * \return a pointer to the mapped region upon successful completion, -1 otherwise. */ void *mmap_anon(void *addr, size_t len, int prot, int flags, off_t offset) { void *result; /* From loader/ext.c: * "Linux EINVAL's on us if we don't pass MAP_PRIVATE to an anon mmap" * Therefore we preserve the same behavior on all platforms, ie. no * shared mappings of anon space (if the concepts are supported). */ #if defined(MAP_SHARED) && defined(MAP_PRIVATE) flags = (flags & ~MAP_SHARED) | MAP_PRIVATE; #endif /* defined(MAP_SHARED) && defined(MAP_PRIVATE) */ #ifdef MAP_ANONYMOUS /* BSD-style anonymous mapping */ result = mmap(addr, len, prot, flags | MAP_ANONYMOUS, -1, offset); #else /* SysV-style anonymous mapping */ int fd; fd = open("/dev/zero", O_RDWR); if(fd < 0){ perror( "Cannot open /dev/zero for READ+WRITE. Check permissions! error: "); return NULL; } result = mmap(addr, len, prot, flags, fd, offset); close(fd); #endif /* MAP_ANONYMOUS */ return result; }