From ccd19f1e49639186e6199c27c94ca7878785231a Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 1 Dec 2017 12:40:32 +0100 Subject: [PATCH] mem: add mmap helper Add function and structure to help with mmap and mlock --- spa/include/spa/utils/defs.h | 3 ++- src/pipewire/mem.h | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/spa/include/spa/utils/defs.h b/spa/include/spa/utils/defs.h index 8e976c807..3312ad127 100644 --- a/spa/include/spa/utils/defs.h +++ b/spa/include/spa/utils/defs.h @@ -118,7 +118,8 @@ struct spa_fraction { #define SPA_DEPRECATED #endif -#define SPA_ROUND_UP_N(num,align) ((((num) + ((align) - 1)) & ~((align) - 1))) +#define SPA_ROUND_DOWN_N(num,align) ((num) & ~((align) - 1)) +#define SPA_ROUND_UP_N(num,align) SPA_ROUND_DOWN_N((num) + ((align) - 1),align) #ifndef SPA_LIKELY #ifdef __GNUC__ diff --git a/src/pipewire/mem.h b/src/pipewire/mem.h index 079fbc5fa..e353195d6 100644 --- a/src/pipewire/mem.h +++ b/src/pipewire/mem.h @@ -65,6 +65,25 @@ pw_memblock_free(struct pw_memblock *mem); /** Find memblock for given \a ptr */ struct pw_memblock * pw_memblock_find(const void *ptr); +/** parameters to map a memory range */ +struct pw_map_range { + uint32_t start; /** offset in first page with start of data */ + uint32_t offset; /** page aligned offset to map */ + uint32_t size; /** size to map */ +}; + +/** Calculate parameters to mmap() memory into \a range so that + * \a size bytes at \a offset can be mapped with mmap(). */ +static inline void pw_map_range_init(struct pw_map_range *range, + uint32_t offset, uint32_t size, + uint32_t page_size) +{ + range->offset = SPA_ROUND_DOWN_N(offset, page_size); + range->start = offset - range->offset; + range->size = offset + size - range->offset; +} + + #ifdef __cplusplus } #endif