From ef91aac6887e82b77ca3dff8bcffaffab0a8ec08 Mon Sep 17 00:00:00 2001
From: Nicholas Marriott <nicholas.marriott@gmail.com>
Date: Wed, 3 Oct 2007 00:13:46 +0000
Subject: [PATCH] Add profiling. Also some trivial optimisations to skip
 memcpying.

---
 Makefile | 10 +++++++++-
 TODO     |  8 +++++++-
 input.c  | 17 ++++++++++++-----
 3 files changed, 28 insertions(+), 7 deletions(-)

diff --git a/Makefile b/Makefile
index 0e8ed49a..d953f085 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.9 2007-10-01 14:53:29 nicm Exp $
+# $Id: Makefile,v 1.10 2007-10-03 00:13:46 nicm Exp $
 
 .SUFFIXES: .c .o .y .h
 .PHONY: clean
@@ -25,6 +25,11 @@ YACC= yacc -d
 CC= cc
 INCDIRS+= -I. -I- -I/usr/local/include
 CFLAGS+= -DBUILD="\"$(VERSION) ($(DATE))\"" -DMETA="'${META}'"
+.ifdef PROFILE
+# Don't use ccache
+CC= /usr/bin/gcc
+CFLAGS+= -pg -DPROFILE -O0
+.endif
 .ifdef DEBUG
 CFLAGS+= -g -ggdb -DDEBUG
 LDFLAGS+= -Wl,-E
@@ -40,6 +45,9 @@ INSTALLBIN= install -g bin -o root -m 555
 INSTALLMAN= install -g bin -o root -m 444
 
 LDFLAGS+= -L/usr/local/lib
+.ifdef PROFILE
+LDFLAGS+= -pg
+.endif
 LIBS+= -lutil -lncurses
 
 OBJS= ${SRCS:S/.c/.o/:S/.y/.o/}
diff --git a/TODO b/TODO
index 972504bd..1f0e1057 100644
--- a/TODO
+++ b/TODO
@@ -10,7 +10,6 @@
 - scrollback
 - server doesn't handle SIGTERM anymore...
 - copy/paste
-- cleanup/redesign IPC
 - the whole input/screen/local thing sucks a bit, reorganise/redesign it
 - line mode/char-at-a-time mode a la telnet?
 - some of the uses of buffers really sucks. buffer_reverse_add/remove,
@@ -30,6 +29,10 @@
 	or use queues/trees and avoid NULLs?
 - client could pass tty fd up to server and then do nothing. what problems 
   would this cause?
+- cleanup/redesign IPC
+	IPC is arse-about-face: too much overhead. 8-byte header for each
+	packet... hrm. already scanning output for \e, could add an extra
+	byte to it for message
 
 -- For 0.1 --------------------------------------------------------------------
 - man page
@@ -43,6 +46,9 @@
 	close window
 	kill session
 	set status on/off
+	set meta
+	set shell
+	bind key??
 - fix resize (width problems with multiple clients?)
 - handle tmux in tmux (check $TMUX and abort)
 - check for some reqd terminfo caps on startup
diff --git a/input.c b/input.c
index b82eae2c..3f3d7f9c 100644
--- a/input.c
+++ b/input.c
@@ -1,4 +1,4 @@
-/* $Id: input.c,v 1.16 2007-10-01 17:37:41 nicm Exp $ */
+/* $Id: input.c,v 1.17 2007-10-03 00:13:46 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -1107,13 +1107,18 @@ input_store_two(struct buffer *b, u_char code, uint16_t ua, uint16_t ub)
 void
 input_store8(struct buffer *b, uint8_t n)
 {
-	buffer_write(b, &n, sizeof n);
+	buffer_ensure(b, 1);
+	BUFFER_IN(b)[0] = n;
+	buffer_add(b, 1);
 }
 
 void
 input_store16(struct buffer *b, uint16_t n)
 {
-	buffer_write(b, &n, sizeof n);
+	buffer_ensure(b, 2);
+	BUFFER_IN(b)[0] = n & 0xff;
+	BUFFER_IN(b)[1] = n >> 8;
+	buffer_add(b, 2);
 }
 
 uint8_t
@@ -1121,7 +1126,8 @@ input_extract8(struct buffer *b)
 {
 	uint8_t	n;
 
-	buffer_read(b, &n, sizeof n);
+	n = BUFFER_OUT(b)[0];
+	buffer_remove(b, 1);
 	return (n);
 }
 
@@ -1130,6 +1136,7 @@ input_extract16(struct buffer *b)
 {
 	uint16_t	n;
 
-	buffer_read(b, &n, sizeof n);
+	n = BUFFER_OUT(b)[0] | (BUFFER_OUT(b)[1] << 8);
+	buffer_remove(b, 2);
 	return (n);
 }