[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#13530: head: memory exhausted when printing all from stdin but last
From: |
Pádraig Brady |
Subject: |
bug#13530: head: memory exhausted when printing all from stdin but last P/E bytes |
Date: |
Wed, 23 Jan 2013 13:03:55 +0000 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 |
On 01/23/2013 12:53 PM, Bernhard Voelker wrote:
On 01/23/2013 01:34 PM, Pádraig Brady wrote:
There is the argument that we _should_ allocate
everything up front to indicate immediately
that the system can't (currently) support the requested operation,
but given the 'currently' caveat above I guess it's
more general to fail when we actually run out of mem?
head doesn't "allocate everything up front" - instead, it only
allocates the pointer array which would hold the actual data.
Sure. I was wondering whether that should change
to allocate everything up front so as to exit early.
The strategy in elide_tail_lines_pipe() seems more robust:
it allocates memory when needed.
Yes probably.
Or another (probably martian) idea:
what about a tmpfile()?
Not worth it I think.
free_mem:
- for (i = 0; i < n_bufs; i++)
+ for (i = 0; i < n_alloc; i++)
free (b[i]);
free (b);
BTW: both in the old and the new version, the loop can break
if (b[i] == 0) because the array is filled from the beginning.
The new version only frees what's allocated and so gets this benefit too.
- for (i = 0; i < n_bufs; i++)
+ for (i = 0; i < n_bufs && b[i]; i++)
This makes "echo 123 | head -c -T" ~40% faster here on my PC.
nice
thanks,
Pádraig