66 lines
2.2 KiB
Diff
66 lines
2.2 KiB
Diff
From 5fa8cda981940eaef54b55abe4fcba09b4e18e12 Mon Sep 17 00:00:00 2001
|
|
From: Russell Belfer <rb@github.com>
|
|
Date: Mon, 30 Jun 2014 12:05:25 -0700
|
|
Subject: [PATCH] Round up pool alloc sizes for alignment
|
|
|
|
To make sure that items returned from pool allocations are aligned
|
|
on nice boundaries, this rounds up all pool allocation sizes to a
|
|
multiple of 8. This adds a small amount of overhead to each item.
|
|
|
|
The rounding up could be made optional with an extra parameter to
|
|
the pool initialization that turned on rounding only for pools
|
|
where item alignment actually matters, but I think for the extra
|
|
code and complexity that would be involved, that it makes sense
|
|
just to burn a little bit of extra memory and enable this all the
|
|
time.
|
|
---
|
|
src/pool.c | 2 +-
|
|
tests/core/pool.c | 10 +++++-----
|
|
2 files changed, 6 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/src/pool.c b/src/pool.c
|
|
index 146f118..a516ff9 100644
|
|
--- a/src/pool.c
|
|
+++ b/src/pool.c
|
|
@@ -146,7 +146,7 @@ GIT_INLINE(void) pool_remove_page(
|
|
void *git_pool_malloc(git_pool *pool, uint32_t items)
|
|
{
|
|
git_pool_page *scan = pool->open, *prev;
|
|
- uint32_t size = items * pool->item_size;
|
|
+ uint32_t size = ((items * pool->item_size) + 7) & ~7;
|
|
void *ptr = NULL;
|
|
|
|
pool->has_string_alloc = 0;
|
|
diff --git a/tests/core/pool.c b/tests/core/pool.c
|
|
index 351d0c2..a7ec880 100644
|
|
--- a/tests/core/pool.c
|
|
+++ b/tests/core/pool.c
|
|
@@ -38,19 +38,19 @@ void test_core_pool__1(void)
|
|
cl_assert(git_pool_malloc(&p, i) != NULL);
|
|
|
|
/* with fixed page size, allocation must end up with these values */
|
|
- cl_assert(git_pool__open_pages(&p) == 1);
|
|
- cl_assert(git_pool__full_pages(&p) == 505);
|
|
+ cl_assert_equal_i(1, git_pool__open_pages(&p));
|
|
+ cl_assert_equal_i(507, git_pool__full_pages(&p));
|
|
|
|
git_pool_clear(&p);
|
|
|
|
- cl_git_pass(git_pool_init(&p, 1, 4100));
|
|
+ cl_git_pass(git_pool_init(&p, 1, 4120));
|
|
|
|
for (i = 2010; i > 0; i--)
|
|
cl_assert(git_pool_malloc(&p, i) != NULL);
|
|
|
|
/* with fixed page size, allocation must end up with these values */
|
|
- cl_assert(git_pool__open_pages(&p) == 1);
|
|
- cl_assert(git_pool__full_pages(&p) == 492);
|
|
+ cl_assert_equal_i(1, git_pool__open_pages(&p));
|
|
+ cl_assert_equal_i(492, git_pool__full_pages(&p));
|
|
|
|
git_pool_clear(&p);
|
|
}
|
|
--
|
|
1.9.3
|
|
|