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. The strategy in elide_tail_lines_pipe() seems more robust: it allocates memory when needed. Or another (probably martian) idea: what about a tmpfile()? > 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. - 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. Have a nice day, Berny