From: Junio C Hamano <gitster@pobox.com>
To: Jameson Miller <jamill@microsoft.com>
Cc: git@vger.kernel.org, peff@peff.net
Subject: Re: [PATCH v3 2/3] fast-import: introduce mem_pool type
Date: Tue, 27 Mar 2018 09:09:43 -0700 [thread overview]
Message-ID: <xmqqpo3pa4ag.fsf@gitster-ct.c.googlers.com> (raw)
In-Reply-To: <20180326170351.197793-3-jamill@microsoft.com> (Jameson Miller's message of "Mon, 26 Mar 2018 13:03:50 -0400")
Jameson Miller <jamill@microsoft.com> writes:
> Introduce the mem_pool type which encapsulates all the information
> necessary to manage a pool of memory.This change moves the existing
> variables in fast-import used to support the global memory pool to use
> this structure.
>
> These changes allow for the multiple instances of a memory pool to
> exist and be reused outside of fast-import. In a future commit the
> mem_pool type will be moved to its own file.
>
> Signed-off-by: Jameson Miller <jamill@microsoft.com>
> ---
> fast-import.c | 80 +++++++++++++++++++++++++++++++++++++----------------------
> 1 file changed, 51 insertions(+), 29 deletions(-)
Thanks, this got much easier to read and reason about.
> @@ -304,9 +317,7 @@ static int global_argc;
> static const char **global_argv;
>
> /* Memory pools */
> -static size_t mem_pool_alloc = 2*1024*1024 - sizeof(struct mp_block);
> -static size_t total_allocd;
> -static struct mp_block *mp_block_head;
> +static struct mem_pool fi_mem_pool = {0, 2*1024*1024 - sizeof(struct mp_block), 0 };
>
> /* Atom management */
> static unsigned int atom_table_sz = 4451;
> @@ -324,6 +335,7 @@ static off_t pack_size;
> /* Table of objects we've written. */
> static unsigned int object_entry_alloc = 5000;
> static struct object_entry_pool *blocks;
> +static size_t total_allocd;
So the design decision made at this step is that pool_alloc field
keeps track of the per-pool allocation, while total_allocd is a sum
across instances of pools. That sounds appropriate for stats.
> @@ -634,7 +646,21 @@ static unsigned int hc_str(const char *s, size_t len)
> return r;
> }
>
> -static void *pool_alloc(size_t len)
> +static struct mp_block *mem_pool_alloc_block(struct mem_pool *mem_pool, size_t block_alloc)
> +{
> + struct mp_block *p;
> +
> + mem_pool->pool_alloc += sizeof(struct mp_block) + block_alloc;
> + p = xmalloc(st_add(sizeof(struct mp_block), block_alloc));
> + p->next_block = mem_pool->mp_block;
> + p->next_free = (char *)p->space;
> + p->end = p->next_free + block_alloc;
> + mem_pool->mp_block = p;
This, compared to what used to happen in mem_pool_alloc()'s original
code, ignores total_allocd. I cannot tell if that is an intentional
change or a mistake.
> +
> + return p;
> +}
> +
> +static void *mem_pool_alloc(struct mem_pool *mem_pool, size_t len)
> {
> struct mp_block *p;
> void *r;
> @@ -643,21 +669,17 @@ static void *pool_alloc(size_t len)
> if (len & (sizeof(uintmax_t) - 1))
> len += sizeof(uintmax_t) - (len & (sizeof(uintmax_t) - 1));
>
> - for (p = mp_block_head; p; p = p->next_block)
> - if ((p->end - p->next_free >= len))
> - break;
> + for (p = mem_pool->mp_block; p; p = p->next_block)
> + if (p->end - p->next_free >= len)
> + break;
>
> if (!p) {
> - if (len >= (mem_pool_alloc/2)) {
> - total_allocd += len;
> + if (len >= (mem_pool->block_alloc / 2)) {
> + mem_pool->pool_alloc += len;
> return xmalloc(len);
It is unfair to account this piece of memory to the mem_pool, as we
ended up not carving it out from here. Did you mean to increment
total_allocd by len instead, perhaps?
And I do agree with the idea in the previous round to make these
oversized pieces of memory allocated here to be freeable via the
mem_pool instance (I only found it questionable to use the main
"here are the list of blocks that we could carve small pieces out"
list), and anticipate that a later step in the series would change
this part to do so. With that anticipation, I very much appreciate
that this step did not mix that and stayed as close to the original
(except for the possible mis-accounting). It makes it very clear
what is going on in each separate step in the series.
> }
> - total_allocd += sizeof(struct mp_block) + mem_pool_alloc;
This is what I noticed got lost in the pool-alloc-block helper above.
> - p = xmalloc(st_add(sizeof(struct mp_block), mem_pool_alloc));
> - p->next_block = mp_block_head;
> - p->next_free = (char *) p->space;
> - p->end = p->next_free + mem_pool_alloc;
> - mp_block_head = p;
> +
> + p = mem_pool_alloc_block(mem_pool, mem_pool->block_alloc);
> }
>
> r = p->next_free;
> @@ -665,10 +687,10 @@ static void *pool_alloc(size_t len)
> return r;
> }
>
> -static void *pool_calloc(size_t count, size_t size)
> +static void *mem_pool_calloc(struct mem_pool *mem_pool, size_t count, size_t size)
> {
> - size_t len = count * size;
> - void *r = pool_alloc(len);
> + size_t len = st_mult(count, size);
Nice ;-)
> + void *r = mem_pool_alloc(mem_pool, len);
> memset(r, 0, len);
> return r;
> }
next prev parent reply other threads:[~2018-03-27 16:10 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-21 16:41 [PATCH 0/3] Extract memory pool logic into reusable component jameson.miller81
2018-03-21 16:41 ` [PATCH 1/3] fast-import: rename mem_pool to fi_mem_pool jameson.miller81
2018-03-21 16:41 ` [PATCH 2/3] Introduce a reusable memory pool type jameson.miller81
2018-03-21 16:41 ` [PATCH 3/3] fast-import: use built-in mem pool jameson.miller81
2018-03-21 19:27 ` [PATCH 0/3] Extract memory pool logic into reusable component Junio C Hamano
2018-03-23 14:44 ` [PATCH v2 " Jameson Miller
2018-03-23 14:44 ` [PATCH v2 1/5] fast-import: rename mem_pool type to mp_block Jameson Miller
2018-03-23 16:42 ` Junio C Hamano
2018-03-23 14:44 ` [PATCH v2 2/5] fast-import: introduce mem_pool type Jameson Miller
2018-03-23 17:15 ` Junio C Hamano
2018-03-23 14:44 ` [PATCH v2 3/5] fast-import: update pool_* functions to work on local pool Jameson Miller
2018-03-23 17:19 ` Junio C Hamano
2018-03-23 14:44 ` [PATCH v2 4/5] Move the reusable parts of memory pool into its own file Jameson Miller
2018-03-23 20:27 ` Junio C Hamano
2018-03-23 14:44 ` [PATCH v2 5/5] Expand implementation of mem-pool type Jameson Miller
2018-03-23 20:41 ` Junio C Hamano
2018-03-26 17:03 ` [PATCH v3 0/3] Extract memory pool logic into reusable component Jameson Miller
2018-03-26 17:03 ` [PATCH v3 1/3] fast-import: rename mem_pool type to mp_block Jameson Miller
2018-03-26 17:03 ` [PATCH v3 2/3] fast-import: introduce mem_pool type Jameson Miller
2018-03-26 17:34 ` Eric Sunshine
2018-03-27 16:09 ` Junio C Hamano [this message]
2018-03-26 17:03 ` [PATCH v3 3/3] Move reusable parts of memory pool into its own file Jameson Miller
2018-03-27 16:43 ` Junio C Hamano
2018-03-29 14:12 ` Jameson Miller
2018-04-11 18:37 ` [PATCH v4 1/3] fast-import: rename mem_pool type to mp_block Jameson Miller
2018-04-11 18:37 ` [PATCH v4 0/3] Extract memory pool logic into reusable component Jameson Miller
2018-04-17 16:43 ` Jameson Miller
2018-04-11 18:37 ` [PATCH v4 2/3] fast-import: introduce mem_pool type Jameson Miller
2018-04-11 18:37 ` [PATCH v4 3/3] Move reusable parts of memory pool into its own file Jameson Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqpo3pa4ag.fsf@gitster-ct.c.googlers.com \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=jamill@microsoft.com \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).