diff circbuffer.c @ 1167:1397a677cb5c

lazy allocation of circbuffer
author Matt Johnston <matt@ucc.asn.au>
date Thu, 19 Nov 2015 23:52:11 +0800
parents acf444bcb115
children 06d52bcb8094
line wrap: on
line diff
--- a/circbuffer.c	Thu Nov 19 22:39:32 2015 +0800
+++ b/circbuffer.c	Thu Nov 19 23:52:11 2015 +0800
@@ -37,9 +37,8 @@
 	}
 
 	cbuf = (circbuffer*)m_malloc(sizeof(circbuffer));
-	if (size > 0) {
-		cbuf->data = (unsigned char*)m_malloc(size);
-	}
+	/* data is malloced on first write */
+	cbuf->data = NULL;
 	cbuf->used = 0;
 	cbuf->readpos = 0;
 	cbuf->writepos = 0;
@@ -50,8 +49,10 @@
 
 void cbuf_free(circbuffer * cbuf) {
 
-	m_burn(cbuf->data, cbuf->size);
-	m_free(cbuf->data);
+	if (cbuf->data) {
+		m_burn(cbuf->data, cbuf->size);
+		m_free(cbuf->data);
+	}
 	m_free(cbuf);
 }
 
@@ -106,6 +107,11 @@
 		dropbear_exit("Bad cbuf write");
 	}
 
+	if (!cbuf->data) {
+		/* lazy allocation */
+		cbuf->data = (unsigned char*)m_malloc(cbuf->size);
+	}
+
 	return &cbuf->data[cbuf->writepos];
 }