[PATCH v4 2/4] Introduce GIT_MMAP_LIMIT to allow testing expected mmap size
- From
Steffen Prohaska <prohaska@zib.de>
- Date
- Aug 22, 2014, 14:01 UTC
- Message-ID
- <1408716083-9093-3-git-send-email-prohaska@zib.de>
- In-Reply-To
- <1408716083-9093-1-git-send-email-prohaska@zib.de>
Similar to testing expectations about malloc with GIT_ALLOC_LIMIT (see commit d41489), it can be useful to test expectations about mmap.
This introduces a new environment variable GIT_MMAP_LIMIT to limit the largest allowed mmap length (in KB). xmmap() is modified to check the limit. Together with GIT_ALLOC_LIMIT tests can now easily confirm expectations about memory consumption.
GIT_MMAP_LIMIT will be used in the next commit to test that data will be streamed to an external filter without mmaping the entire file.
[commit d41489]: d41489a6424308dc9a0409bc2f6845aa08bd4f7d Add more large
blob test casesSigned-off-by: Steffen Prohaska <prohaska@zib.de> --- sha1_file.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/sha1_file.c b/sha1_file.c index 00c07f2..603673b 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -663,10 +663,25 @@ void release_pack_memory(size_t need) ; /* nothing */ } +static void mmap_limit_check(size_t length) +{ + static ssize_t limit = -1; + if (limit == -1) { + const char *env = getenv("GIT_MMAP_LIMIT"); + limit = env ? atol(env) * 1024 : 0; + } + if (limit && length > limit) + die("attempting to mmap %"PRIuMAX" over limit %"PRIuMAX, + (uintmax_t)length, (uintmax_t)limit); +} + void *xmmap(void *start, size_t length, int prot, int flags, int fd, off_t offset) { - void *ret = mmap(start, length, prot, flags, fd, offset); + void *ret; + + mmap_limit_check(length); + ret = mmap(start, length, prot, flags, fd, offset); if (ret == MAP_FAILED) { if (!length) return NULL;
-- 2.1.0.6.gb452461