Hallo, attached find a very conservative patch against your patched cmd-load-buffer.c which brings the number of calls to realloc() from n=(final buffer size) to n<log_2(final buffer size). Fulvio
tmux.diff
Description: Binary data
At Thu, 18 Feb 2010 23:20:19 +0000, Nicholas Marriott wrote: > > Hi > > Thanks for the diff. > > Tiago Cunha who originally wrote the load-buffer command sent me an update to > do this as well which is quite similar to yours but a bit simpler, so we will > probably use it. I've attached it below as well if you want to take a look. > > You can't just use stdin because the loadb command is running in the server so > stdin doesn't exist. > > At the moment the client doesn't send the stdin fd up to the client unless it > is a tty, we could change that by removing the isatty() check in client.c. > > There may be a couple of things that need checked after that, eg would > probably > need an isatty() check in tty_open() and maybe elsewhere. > > Once that is done, the load-buffer command could check that ctx->cmdclient is > non-NULL. If it is then the command was run from the command-line and the tty > fd will be in c->tty.fd. > > Then it should be able to call isatty() itself, then freopen() on that fd if > it > isn't a tty, and read it. > > It might be nice to have stdin available for other things as well so this > could > be worth looking into. > > > --- cmd-load-buffer.c.orig 2010-02-18 21:44:50.539052646 +0000 > +++ cmd-load-buffer.c 2010-02-18 21:50:52.395061286 +0000 > @@ -16,13 +16,10 @@ > * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. > */ > > -#include <sys/types.h> > -#include <sys/stat.h> > - > #include <errno.h> > +#include <stdio.h> > #include <stdlib.h> > #include <string.h> > -#include <unistd.h> > > #include "tmux.h" > > @@ -48,11 +45,11 @@ > { > struct cmd_buffer_data *data = self->data; > struct session *s; > - struct stat sb; > FILE *f; > - char *pdata = NULL; > + char *pdata, *new_pdata; > size_t psize; > u_int limit; > + int ch; > > if ((s = cmd_find_session(ctx, data->target)) == NULL) > return (-1); > @@ -62,29 +59,23 @@ > return (-1); > } > > - if (fstat(fileno(f), &sb) < 0) { > - ctx->error(ctx, "%s: %s", data->arg, strerror(errno)); > - goto error; > + pdata = NULL; > + psize = 0; > + while ((ch = getc(f)) != EOF) { > + /* Do not let the server die due to memory exhaustion. */ > + if ((new_pdata = realloc(pdata, psize + 2)) == NULL) { > + ctx->error(ctx, "realloc error: %s", strerror(errno)); > + goto error; > + } > + pdata = new_pdata; > + pdata[psize++] = ch; > } > - if (sb.st_size <= 0 || (uintmax_t) sb.st_size > SIZE_MAX) { > - ctx->error(ctx, "%s: file empty or too large", data->arg); > - goto error; > - } > - psize = (size_t) sb.st_size; > - > - /* > - * We don't want to die due to memory exhaustion, hence xmalloc can't > - * be used here. > - */ > - if ((pdata = malloc(psize)) == NULL) { > - ctx->error(ctx, "malloc error: %s", strerror(errno)); > - goto error; > - } > - > - if (fread(pdata, 1, psize, f) != psize) { > - ctx->error(ctx, "%s: fread error", data->arg); > + if (ferror(f)) { > + ctx->error(ctx, "%s: %s", data->arg, strerror(errno)); > goto error; > } > + if (pdata != NULL) > + pdata[psize] = '\0'; > > fclose(f); >
------------------------------------------------------------------------------ Download Intel® Parallel Studio Eval Try the new software tools for yourself. Speed compiling, find bugs proactively, and fine-tune applications for parallel performance. See why Intel Parallel Studio got high marks during beta. http://p.sf.net/sfu/intel-sw-dev
_______________________________________________ tmux-users mailing list tmux-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-users