All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jonathan Nieder <jrnieder@gmail.com>
To: Ramkumar Ramachandra <artagnon@gmail.com>
Cc: Git Mailing List <git@vger.kernel.org>,
	David Michael Barr <david.barr@cordelta.com>,
	Sverre Rabbelier <srabbelier@gmail.com>,
	Michael J Gruber <git@drmicha.warpmail.net>,
	Junio C Hamano <gitster@pobox.com>
Subject: Re: [PATCH 1/6] Add memory pool library
Date: Fri, 4 Jun 2010 13:29:28 -0500	[thread overview]
Message-ID: <20100604182928.GB20909@progeny.tock> (raw)
In-Reply-To: <1275658871-1473-2-git-send-email-artagnon@gmail.com>

Ramkumar Ramachandra wrote:

> Add a memory pool library implemented using cpp macros. The library
> provides macros that can be used to create a type-specific memory pool
> API.

More details:

  The memory pool library is distinguished from the existing specialized
  allocators in alloc.c by using a contiguous block for all allocations.
  This means that on one hand, long-lived pointers have to be written as
  offsets, since the base address changes as the pool grows, but on the
  other hand, the entire pool can be easily written to the file system.
  This allows the memory pool to persist between runs of an application.
  
  For svn-fe, such a facility is useful because each svn revision can
  copy trees and files from any previous revision.  Therefore the
  relevant information for all revisions has to persist somehow to
  support incremental runs.
  
  The current implementation is backed by the file system using mmap().

Thanks for the explanations, David.

> +#define obj_pool_gen(pre, obj_t, initial_capacity) \
> +static struct { \
> +	uint32_t size; \
> +	uint32_t capacity; \
> +	obj_t *base; \
> +        FILE *file; \

Whitespace damaged.

> +} pre##_pool = { 0, 0, NULL, NULL}; \
> +static void pre##_init(void) \
> +{ \
> +	struct stat st; \
> +	size_t ps = sysconf (_SC_PAGESIZE); \

Probably an ignorant question, but why?  I do not think the win32 mmap
emulation in git currently supports sysconf().

> +	/* Touch binary file before opening read/write */ \
> +	pre##_pool.file = fopen(#pre ".bin", "a"); \
> +	fclose(pre##_pool.file); \
> +	/* Open, check size, compute capacity */ \
> +	pre##_pool.file = fopen(#pre ".bin", "r+"); \

Maybe

	..._pool.file = fopen(..., "a+");
	rewind(..._pool.file);

would be simpler.  But given that there is no buffered I/O going on
for this file, why not just

	..._pool.file = open(..., O_RDWR);

?

> +	/* Truncate to calculated capacity and map to VM */ \
> +	ftruncate(fileno(pre##_pool.file), pre##_pool.capacity * sizeof(obj_t)); \

Reasonable.

> +	pre##_pool.base = mmap(0, pre##_pool.capacity * sizeof(obj_t), \
> +				PROT_READ | PROT_WRITE, MAP_SHARED, \
> +				fileno(pre##_pool.file), 0); \

This is the first use of MAP_SHARED in git.  I wouldn’t be surprised if
the win32 mmap emulation does not support it.

> +} \
> +static uint32_t pre##_alloc(uint32_t count) \
> +{ \
> +	uint32_t offset; \
> +	if (pre##_pool.size + count > pre##_pool.capacity) { \
> +		if (NULL == pre##_pool.base) \
> +			pre##_init(); \
> +		fsync(fileno(pre##_pool.file)); \

Necessary?  (Maybe yes: we are about to truncate the file, so the
fsync() may be intended to force the data to be committed before
the metadata.)  Portable?  (I suspect the fsync() should go after
the munmap().)

[...]
> +static void pre##_reset(void) \
> +{ \
> +	if (pre##_pool.base) { \
> +		fsync(fileno(pre##_pool.file)); \

Same question.

> +		munmap(pre##_pool.base, \
> +			pre##_pool.capacity * sizeof(obj_t)); \
> +		ftruncate(fileno(pre##_pool.file), \
> +				pre##_pool.size * sizeof(obj_t)); \
> +		fclose(pre##_pool.file); \

Because of these portability concerns, I’d rather use the old version
until the incremental parser is ready.

Hope that helps,
Jonathan

  reply	other threads:[~2010-06-04 18:29 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-06-04 13:41 [PATCH 0/6] Merge David's SVN exporter Ramkumar Ramachandra
2010-06-04 13:41 ` [PATCH 1/6] Add memory pool library Ramkumar Ramachandra
2010-06-04 18:29   ` Jonathan Nieder [this message]
2010-06-07 13:28     ` Ramkumar Ramachandra
2010-06-07 14:00       ` Erik Faye-Lund
2010-06-07 14:35         ` Ramkumar Ramachandra
2010-06-04 13:41 ` [PATCH 2/6] Add cpp macro implementation of treaps Ramkumar Ramachandra
2010-06-04 13:41 ` [PATCH 3/6] Add library for string-specific memory pool Ramkumar Ramachandra
2010-06-04 13:41 ` [PATCH 4/6] Add stream helper library Ramkumar Ramachandra
2010-06-04 18:35   ` Jonathan Nieder
2010-06-04 13:41 ` [PATCH 5/6] Add infrastructure to write revisions in fast-export format Ramkumar Ramachandra
2010-06-04 19:02   ` Jonathan Nieder
2010-06-07 12:35     ` Ramkumar Ramachandra
2010-06-07 13:36       ` David Michael Barr
2010-06-04 13:41 ` [PATCH 6/6] Add SVN dump parser Ramkumar Ramachandra
  -- strict thread matches above, loose matches on Subject: below --
2010-06-10 13:09 [PATCH 0/6] Another attempt to get the SVN exporter merged Ramkumar Ramachandra
2010-06-10 13:09 ` [PATCH 1/6] Add memory pool library Ramkumar Ramachandra
2010-06-12  6:42   ` Jonathan Nieder
2010-06-14 14:25     ` Ramkumar Ramachandra
2010-06-14 14:44       ` Andreas Ericsson
2010-06-04 13:26 [PATCH 0/6] Merge David's SVN exporter into git.git Ramkumar Ramachandra
2010-06-04 13:26 ` [PATCH 1/6] Add memory pool library Ramkumar Ramachandra

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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100604182928.GB20909@progeny.tock \
    --to=jrnieder@gmail.com \
    --cc=artagnon@gmail.com \
    --cc=david.barr@cordelta.com \
    --cc=git@drmicha.warpmail.net \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=srabbelier@gmail.com \
    /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.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.