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