On Thursday 12 April 2007 02:26, Mike Frysinger wrote:
> On Wednesday 11 April 2007, Denis Vlasenko wrote:
> > You are referring to this code:
> >
> > char *bb_get_chunk_from_file(FILE * file, int *end)
> > {
> > int ch;
> > int idx = 0;
> > char *linebuf = NULL;
> > int linebufsz = 0;
> >
> > while ((ch = getc(file)) != EOF) {
> > /* grow the line buffer as necessary */
> > if (idx >= linebufsz) {
> > linebuf = xrealloc(linebuf, linebufsz += 80);
> > }
> > linebuf[idx++] = (char) ch;
> > if (!ch || (end && ch == '\n'))
> > break;
> > }
> > if (end)
> > *end = idx;
> > if (linebuf) {
> > linebuf = xrealloc(linebuf, idx+1);
> > linebuf[idx] = '\0';
> > }
> > return linebuf;
> > }
>
> yes
>
> > Last realloc is used to truncate extra allocated data. Think about
> > very long file with short lines (for example, empty lines) being read
> > and stored in allocated memory using bb_get_chunk_from_file().
>
> it looked to me like it was a fix for the 1 byte overflow for lines that were
> multiples of 80 bytes
>
> > Without last realloc we may end up using lots more memory than really
> > needed. Doesn't sound like good idea to me.
>
> using grep as an example, the line is allocated, some work is done on it, and
> then it is freed before the next line is scanned in ... in this use case,
> memory is being thrashed by being pointless shrunk all of the time
But it is used for other applets too, for example, sort - and sort definitely
needs to keep entire file in memory.
--
vda
_______________________________________________
busybox mailing list
[email protected]
http://busybox.net/cgi-bin/mailman/listinfo/busybox