dovecot: Use likely() and unlikely() macros to make commonly che...

dovecot at dovecot.org dovecot at dovecot.org
Sat Nov 17 08:14:36 EET 2007


details:   http://hg.dovecot.org/dovecot/rev/85385079b044
changeset: 6825:85385079b044
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Nov 17 08:13:03 2007 +0200
description:
Use likely() and unlikely() macros to make commonly checked error handling
paths unlikely.

diffstat:

16 files changed, 78 insertions(+), 72 deletions(-)
src/lib/base64.c                   |   18 +++++++++---------
src/lib/buffer.c                   |    4 ++--
src/lib/data-stack.c               |   10 +++++-----
src/lib/hash.c                     |    2 +-
src/lib/istream-file.c             |    5 +++--
src/lib/istream.c                  |   17 ++++++++++-------
src/lib/mempool-alloconly.c        |    6 +++---
src/lib/mempool-datastack.c        |   14 +++++++-------
src/lib/mempool-system-clean.c     |    6 +++---
src/lib/mempool-system.c           |    8 ++++----
src/lib/mempool-unsafe-datastack.c |    2 +-
src/lib/network.c                  |    6 +++---
src/lib/nfs-workarounds.c          |   20 ++++++++++----------
src/lib/ostream.c                  |   22 ++++++++++++----------
src/lib/randgen.c                  |    2 +-
src/lib/write-full.c               |    8 ++++----

diffs (truncated from 601 to 300 lines):

diff -r b8c66f025583 -r 85385079b044 src/lib/base64.c
--- a/src/lib/base64.c	Sat Nov 17 02:07:40 2007 +0200
+++ b/src/lib/base64.c	Sat Nov 17 08:13:03 2007 +0200
@@ -93,16 +93,16 @@ int base64_decode(const void *src, size_
 	for (src_pos = 0; src_pos+3 < src_size; ) {
 		input[0] = b64dec[src_c[src_pos]];
 		if (input[0] == 0xff) {
-			if (IS_EMPTY(src_c[src_pos])) {
-				src_pos++;
-				continue;
+			if (unlikely(!IS_EMPTY(src_c[src_pos]))) {
+				ret = -1;
+				break;
 			}
-			ret = -1;
-			break;
+			src_pos++;
+			continue;
 		}
 
 		input[1] = b64dec[src_c[src_pos+1]];
-		if (input[1] == 0xff) {
+		if (unlikely(input[1] == 0xff)) {
 			ret = -1;
 			break;
 		}
@@ -110,8 +110,8 @@ int base64_decode(const void *src, size_
 
 		input[2] = b64dec[src_c[src_pos+2]];
 		if (input[2] == 0xff) {
-			if (src_c[src_pos+2] != '=' ||
-			    src_c[src_pos+3] != '=') {
+			if (unlikely(src_c[src_pos+2] != '=' ||
+				     src_c[src_pos+3] != '=')) {
 				ret = -1;
 				break;
 			}
@@ -124,7 +124,7 @@ int base64_decode(const void *src, size_
 		output[1] = (input[1] << 4) | (input[2] >> 2);
 		input[3] = b64dec[src_c[src_pos+3]];
 		if (input[3] == 0xff) {
-			if (src_c[src_pos+3] != '=') {
+			if (unlikely(src_c[src_pos+3] != '=')) {
 				ret = -1;
 				break;
 			}
diff -r b8c66f025583 -r 85385079b044 src/lib/buffer.c
--- a/src/lib/buffer.c	Sat Nov 17 02:07:40 2007 +0200
+++ b/src/lib/buffer.c	Sat Nov 17 08:13:03 2007 +0200
@@ -41,14 +41,14 @@ buffer_check_limits(struct real_buffer *
 {
 	size_t new_size;
 
-	if ((size_t)-1 - pos < data_size) {
+	if (unlikely((size_t)-1 - pos < data_size)) {
 		i_panic("Buffer write out of range (%"PRIuSIZE_T
 			" + %"PRIuSIZE_T")", pos, data_size);
 	}
 	new_size = pos + data_size;
 
 	if (new_size > buf->alloc) {
-		if (!buf->dynamic) {
+		if (unlikely(!buf->dynamic)) {
 			i_panic("Buffer full (%"PRIuSIZE_T" > %"PRIuSIZE_T", "
 				"pool %s)", pos + data_size, buf->alloc,
 				pool_get_name(buf->pool));
diff -r b8c66f025583 -r 85385079b044 src/lib/data-stack.c
--- a/src/lib/data-stack.c	Sat Nov 17 02:07:40 2007 +0200
+++ b/src/lib/data-stack.c	Sat Nov 17 08:13:03 2007 +0200
@@ -152,7 +152,7 @@ unsigned int t_pop(void)
 	struct stack_frame_block *frame_block;
 	int popped_frame_pos;
 
-	if (frame_pos < 0)
+	if (unlikely(frame_pos < 0))
 		i_panic("t_pop() called with empty stack");
 
 	/* update the current block */
@@ -199,7 +199,7 @@ static struct stack_block *mem_block_all
 #else
 	block = GC_malloc(SIZEOF_MEMBLOCK + alloc_size);
 #endif
-	if (block == NULL) {
+	if (unlikely(block == NULL)) {
 		i_panic("data stack: Out of memory when allocating %"
 			PRIuSIZE_T" bytes", alloc_size + SIZEOF_MEMBLOCK);
 	}
@@ -217,10 +217,10 @@ static void *t_malloc_real(size_t size, 
 	bool warn = FALSE;
 #endif
 
-	if (size == 0 || size > SSIZE_T_MAX)
+	if (unlikely(size == 0 || size > SSIZE_T_MAX))
 		i_panic("Trying to allocate %"PRIuSIZE_T" bytes", size);
 
-	if (data_stack_frame == 0) {
+	if (unlikely(data_stack_frame == 0)) {
 		/* kludgy, but allow this before initialization */
 		data_stack_init();
 	}
@@ -295,7 +295,7 @@ bool t_try_realloc(void *mem, size_t siz
 {
 	size_t last_alloc_size;
 
-	if (size == 0 || size > SSIZE_T_MAX)
+	if (unlikely(size == 0 || size > SSIZE_T_MAX))
 		i_panic("Trying to allocate %"PRIuSIZE_T" bytes", size);
 
 	last_alloc_size = current_frame_block->last_alloc_size[frame_pos];
diff -r b8c66f025583 -r 85385079b044 src/lib/hash.c
--- a/src/lib/hash.c	Sat Nov 17 02:07:40 2007 +0200
+++ b/src/lib/hash.c	Sat Nov 17 08:13:03 2007 +0200
@@ -311,7 +311,7 @@ void hash_remove(struct hash_table *tabl
 	hash = table->hash_cb(key);
 
 	node = hash_lookup_node(table, key, hash);
-	if (node == NULL)
+	if (unlikely(node == NULL))
 		i_panic("key not found from hash");
 
 	node->key = NULL;
diff -r b8c66f025583 -r 85385079b044 src/lib/istream-file.c
--- a/src/lib/istream-file.c	Sat Nov 17 02:07:40 2007 +0200
+++ b/src/lib/istream-file.c	Sat Nov 17 08:13:03 2007 +0200
@@ -58,7 +58,8 @@ static ssize_t i_stream_file_read(struct
 			ret = read(stream->fd, stream->w_buffer + stream->pos,
 				   size);
 		}
-	} while (ret < 0 && errno == EINTR && stream->istream.blocking);
+	} while (unlikely(ret < 0 && errno == EINTR &&
+			  stream->istream.blocking));
 
 	if (ret == 0) {
 		/* EOF */
@@ -66,7 +67,7 @@ static ssize_t i_stream_file_read(struct
 		return -1;
 	}
 
-	if (ret < 0) {
+	if (unlikely(ret < 0)) {
 		if (errno == EINTR || errno == EAGAIN) {
 			i_assert(!stream->istream.blocking);
 			ret = 0;
diff -r b8c66f025583 -r 85385079b044 src/lib/istream.c
--- a/src/lib/istream.c	Sat Nov 17 02:07:40 2007 +0200
+++ b/src/lib/istream.c	Sat Nov 17 08:13:03 2007 +0200
@@ -50,7 +50,7 @@ ssize_t i_stream_read(struct istream *st
 {
 	struct istream_private *_stream = stream->real_stream;
 
-	if (stream->closed)
+	if (unlikely(stream->closed))
 		return -1;
 
 	stream->eof = FALSE;
@@ -75,7 +75,7 @@ void i_stream_skip(struct istream *strea
 	_stream->skip = _stream->pos;
 	stream->v_offset += data_size;
 
-	if (stream->closed)
+	if (unlikely(stream->closed))
 		return;
 
 	_stream->seek(_stream, stream->v_offset + count, FALSE);
@@ -90,7 +90,7 @@ void i_stream_seek(struct istream *strea
 		return;
 	}
 
-	if (stream->closed)
+	if (unlikely(stream->closed))
 		return;
 
 	stream->eof = FALSE;
@@ -101,7 +101,7 @@ void i_stream_seek_mark(struct istream *
 {
 	struct istream_private *_stream = stream->real_stream;
 
-	if (stream->closed)
+	if (unlikely(stream->closed))
 		return;
 
 	stream->eof = FALSE;
@@ -112,7 +112,10 @@ void i_stream_sync(struct istream *strea
 {
 	struct istream_private *_stream = stream->real_stream;
 
-	if (!stream->closed && _stream->sync != NULL)
+	if (unlikely(stream->closed))
+		return;
+
+	if (_stream->sync != NULL)
 		_stream->sync(_stream);
 }
 
@@ -120,7 +123,7 @@ const struct stat *i_stream_stat(struct 
 {
 	struct istream_private *_stream = stream->real_stream;
 
-	if (stream->closed)
+	if (unlikely(stream->closed))
 		return NULL;
 
 	return _stream->stat(_stream, exact);
@@ -174,7 +177,7 @@ char *i_stream_next_line(struct istream 
 		return NULL;
 	}
 
-	if (_stream->w_buffer == NULL) {
+	if (unlikely(_stream->w_buffer == NULL)) {
 		i_error("i_stream_next_line() called for unmodifiable stream");
 		return NULL;
 	}
diff -r b8c66f025583 -r 85385079b044 src/lib/mempool-alloconly.c
--- a/src/lib/mempool-alloconly.c	Sat Nov 17 02:07:40 2007 +0200
+++ b/src/lib/mempool-alloconly.c	Sat Nov 17 08:13:03 2007 +0200
@@ -218,7 +218,7 @@ static void block_alloc(struct alloconly
 #else
 	block = GC_malloc(size);
 #endif
-	if (block == NULL)
+	if (unlikely(block == NULL))
 		i_fatal_status(FATAL_OUTOFMEM, "block_alloc(): Out of memory");
 	block->prev = apool->block;
 	apool->block = block;
@@ -232,7 +232,7 @@ static void *pool_alloconly_malloc(pool_
 	struct alloconly_pool *apool = (struct alloconly_pool *)pool;
 	void *mem;
 
-	if (size == 0 || size > SSIZE_T_MAX)
+	if (unlikely(size == 0 || size > SSIZE_T_MAX))
 		i_panic("Trying to allocate %"PRIuSIZE_T" bytes", size);
 
 	size = MEM_ALIGN(size);
@@ -289,7 +289,7 @@ static void *pool_alloconly_realloc(pool
 	struct alloconly_pool *apool = (struct alloconly_pool *)pool;
 	unsigned char *new_mem;
 
-	if (new_size == 0 || new_size > SSIZE_T_MAX)
+	if (unlikely(new_size == 0 || new_size > SSIZE_T_MAX))
 		i_panic("Trying to allocate %"PRIuSIZE_T" bytes", new_size);
 
 	if (mem == NULL)
diff -r b8c66f025583 -r 85385079b044 src/lib/mempool-datastack.c
--- a/src/lib/mempool-datastack.c	Sat Nov 17 02:07:40 2007 +0200
+++ b/src/lib/mempool-datastack.c	Sat Nov 17 08:13:03 2007 +0200
@@ -64,7 +64,7 @@ static void pool_data_stack_ref(pool_t p
 {
 	struct datastack_pool *dpool = (struct datastack_pool *) pool;
 
-	if (dpool->data_stack_frame != data_stack_frame)
+	if (unlikely(dpool->data_stack_frame != data_stack_frame))
 		i_panic("pool_data_stack_ref(): stack frame changed");
 
 	dpool->refcount++;
@@ -74,7 +74,7 @@ static void pool_data_stack_unref(pool_t
 {
 	struct datastack_pool *dpool = (struct datastack_pool *)*pool;
 
-	if (dpool->data_stack_frame != data_stack_frame)
+	if (unlikely(dpool->data_stack_frame != data_stack_frame))
 		i_panic("pool_data_stack_unref(): stack frame changed");
 
 	dpool->refcount--;
@@ -87,10 +87,10 @@ static void *pool_data_stack_malloc(pool
 {
 	struct datastack_pool *dpool = (struct datastack_pool *) pool;
 
-	if (size == 0 || size > SSIZE_T_MAX)
+	if (unlikely(size == 0 || size > SSIZE_T_MAX))
 		i_panic("Trying to allocate %"PRIuSIZE_T" bytes", size);
 
-	if (dpool->data_stack_frame != data_stack_frame)
+	if (unlikely(dpool->data_stack_frame != data_stack_frame))
 		i_panic("pool_data_stack_malloc(): stack frame changed");
 
 	return t_malloc0(size);
@@ -100,7 +100,7 @@ static void pool_data_stack_free(pool_t 
 {
 	struct datastack_pool *dpool = (struct datastack_pool *) pool;
 
-	if (dpool->data_stack_frame != data_stack_frame)
+	if (unlikely(dpool->data_stack_frame != data_stack_frame))
 		i_panic("pool_data_stack_free(): stack frame changed");
 }
 
@@ -111,10 +111,10 @@ static void *pool_data_stack_realloc(poo
 	void *new_mem;
 
 	/* @UNSAFE */
-	if (new_size == 0 || new_size > SSIZE_T_MAX)
+	if (unlikely(new_size == 0 || new_size > SSIZE_T_MAX))
 		i_panic("Trying to allocate %"PRIuSIZE_T" bytes", new_size);
 
-	if (dpool->data_stack_frame != data_stack_frame)
+	if (unlikely(dpool->data_stack_frame != data_stack_frame))
 		i_panic("pool_data_stack_realloc(): stack frame changed");
 
 	if (mem == NULL)
diff -r b8c66f025583 -r 85385079b044 src/lib/mempool-system-clean.c
--- a/src/lib/mempool-system-clean.c	Sat Nov 17 02:07:40 2007 +0200


More information about the dovecot-cvs mailing list