From: Pierre Habouzit <madcoder@debian.org>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Junio C Hamano <gitster@pobox.com>,
git@vger.kernel.org, Bernt Hansen <bernt@alumni.uwaterloo.ca>
Subject: Re: [AGGREGATED PATCH] Fix in-place editing functions in convert.c
Date: Fri, 05 Oct 2007 17:50:23 +0200 [thread overview]
Message-ID: <20071005155023.GA20305@artemis.corp> (raw)
In-Reply-To: <alpine.LFD.0.999.0710050819540.23684@woody.linux-foundation.org>
[-- Attachment #1: Type: text/plain, Size: 3385 bytes --]
On Fri, Oct 05, 2007 at 03:26:44PM +0000, Linus Torvalds wrote:
>
>
> On Fri, 5 Oct 2007, Pierre Habouzit wrote:
> >
> > - strbuf_grow(buf, len);
> > + /* only grow if not in place */
> > + if (strbuf_avail(buf) + buf->len < len)
> > + strbuf_grow(buf, len - buf->len);
>
> Umm. This is really ugly.
I agree.
> The whole point of strbuf's was that you shouldn't be doing your own
> allocation decisions etc. So why do it?
the point here is that it's in a "filter" that is called like this:
some_filter(buf->buf, buf->len, buf);
src len dst
You can call the filter with src/len being data from anywere,
including the current content of the destination buffer.
Then there is two cases, either the filter is known to be done in
place, either we can't know or we know it wont.
In the latter case, we have a bit of code like that:
char *to_free = NULL;
if (buf->buf == src)
to_free = strbuf_detach(&buf);
.. hack ..
free(to_free);
In the former case, then there is a small glitch, being that if we are
doing in place editing, we should not touch buffer at all (or it would
invalidate "src"). If we are not in the in-place editing code though,
then we have to make the resulting buffer be big enough...
> Wouldn't it be much better to have a strbuf_make_room() interface that
> just guarantees that there is enough room fo "len"?
Right, that would do the same btw ;)
> Otherwise, code like the above would seem to make the whole point of a
> safer string interface rather pointless. The above code only makes sense
> if you know how the strbuf's are internally done, so it should not exists
> except as internal strbuf code. No?
Well, the above code is used in filters to spare reallocations. So if
we want to "blackbox" such a think, strbuf_make_room isn't the proper
API. We should rather use
void *strbuf_begin_filter(struct strbuf *sb, const char *src, size_t reslen);
strbuf_end_filter(void *);
`strbuf_begin_filter` would decide upon the hint `reslen` argument if
we know if we can work in place or not (has a meaning iff src points
into the strbuf buffer). If not, it could stash the strbuf buffer in the
returned void * to be freed at the end of the filter. It seems like a
better alternative than a strbuf_make_room.
Of course, strbuf_begin_filter() would really be simple and basically
be:
char *tmp;
if (src points into sb->buf && reslen > sb->alloc - 1) {
// in place editing is OK
return NULL;
}
tmp = strbuf_release(&sb);
strbuf_grow(&sb, len);
return tmp;
and strbuf_end_filter would just be "free" :)
We could even make "reslen" be a ssize_t so that -1 would mean "I've
absolutely no idea how much space I'll need (or just in place editing is
not supported). This way, both hacks I described in this mail could be
hidden in the strbuf module, and be properly documented _and_ safe _and_
efficient.
What do you think ?
[Though if we do that, I still think it's more important to fix the
bug in master, and have a new patch implementing this approach]
--
·O· Pierre Habouzit
··O madcoder@debian.org
OOO http://www.madism.org
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
next prev parent reply other threads:[~2007-10-05 15:50 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <87wsu2sad0.fsf@gollum.intra.norang.ca>
2007-10-05 8:20 ` [PATCH] Fix in-place editing in crlf_to_git and ident_to_git Pierre Habouzit
2007-10-05 8:11 ` [AGGREGATED PATCH] Fix in-place editing functions in convert.c Pierre Habouzit
2007-10-05 9:24 ` Johannes Sixt
2007-10-05 13:07 ` Bernt Hansen
2007-10-05 15:26 ` Linus Torvalds
2007-10-05 15:50 ` Pierre Habouzit [this message]
2007-10-05 16:21 ` Sam Ravnborg
2007-10-05 16:35 ` Pierre Habouzit
2007-10-05 17:25 ` Sam Ravnborg
2007-10-05 16:43 ` Linus Torvalds
2007-10-05 17:24 ` Sam Ravnborg
2007-10-05 18:05 ` Linus Torvalds
2007-10-05 19:27 ` Dmitry Potapov
2007-10-05 19:33 ` Linus Torvalds
2007-10-05 8:27 ` [PATCH] Fix memory leak in apply_filter Pierre Habouzit
2007-10-05 8:29 ` Pierre Habouzit
2007-10-05 8:30 ` [PATCH] Fix in-place editing in crlf_to_git and ident_to_git Johannes Schindelin
2007-10-05 8:40 ` Pierre Habouzit
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=20071005155023.GA20305@artemis.corp \
--to=madcoder@debian.org \
--cc=bernt@alumni.uwaterloo.ca \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=torvalds@linux-foundation.org \
/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 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 NNTP newsgroup(s).