From 770178724f9493e99c832863031aef016f143e9f Mon Sep 17 00:00:00 2001 From: Martin Sustrik Date: Thu, 10 Dec 2009 21:34:40 +0100 Subject: errors are never predicted in branch prediction (likely/unlikely macros added) --- src/atomic_counter.hpp | 1 - src/err.hpp | 91 ++++++++++++++++++++++++++++++-------------------- src/likely.hpp | 32 ++++++++++++++++++ 3 files changed, 87 insertions(+), 37 deletions(-) create mode 100644 src/likely.hpp (limited to 'src') diff --git a/src/atomic_counter.hpp b/src/atomic_counter.hpp index 305aa59..2cd225a 100644 --- a/src/atomic_counter.hpp +++ b/src/atomic_counter.hpp @@ -17,7 +17,6 @@ along with this program. If not, see . */ - #ifndef __ZMQ_ATOMIC_COUNTER_HPP_INCLUDED__ #define __ZMQ_ATOMIC_COUNTER_HPP_INCLUDED__ diff --git a/src/err.hpp b/src/err.hpp index fb9195e..88097b5 100644 --- a/src/err.hpp +++ b/src/err.hpp @@ -27,6 +27,7 @@ #include #include "platform.hpp" +#include "likely.hpp" #ifdef ZMQ_HAVE_WINDOWS #include "windows.hpp" @@ -46,53 +47,71 @@ namespace zmq } // Provides convenient way to check WSA-style errors on Windows. -#define wsa_assert(x) do { if (!(x)){\ - const char *errstr = zmq::wsa_error ();\ - if (errstr != NULL) {\ - fprintf (stderr, "Assertion failed: %s (%s:%d)\n", errstr, \ - __FILE__, __LINE__);\ - abort ();\ - }\ -}} while (false) - -// Provides convenient way to check GetLastError-style errors on Windows. -#define win_assert(x) do { if (!(x)) {\ - char errstr [256];\ - zmq::win_error (errstr, 256);\ - fprintf (stderr, "Assertion failed: %s (%s:%d)\n", errstr, \ - __FILE__, __LINE__);\ - abort ();\ -}} while (false) +#define wsa_assert(x) \ + do {\ + if (unlikely (!(x))) {\ + const char *errstr = zmq::wsa_error ();\ + if (errstr != NULL) {\ + fprintf (stderr, "Assertion failed: %s (%s:%d)\n", errstr, \ + __FILE__, __LINE__);\ + abort ();\ + }\ + }\ + } while (false) + +// Provides convenient way to check GetLastError-style errors on Windows. +#define win_assert(x) \ + do {\ + if (unlikely (!(x))) {\ + char errstr [256];\ + zmq::win_error (errstr, 256);\ + fprintf (stderr, "Assertion failed: %s (%s:%d)\n", errstr, \ + __FILE__, __LINE__);\ + abort ();\ + }\ + } while (false) #endif // This macro works in exactly the same way as the normal assert. It is used // in its stead because standard assert on Win32 in broken - it prints nothing // when used within the scope of JNI library. -#define zmq_assert(x) do { if (!(x)){\ - fprintf (stderr, "Assertion failed: %s (%s:%d)\n", #x, \ - __FILE__, __LINE__);\ - abort ();\ -}} while (false) +#define zmq_assert(x) \ + do {\ + if (unlikely (!(x))) {\ + fprintf (stderr, "Assertion failed: %s (%s:%d)\n", #x, \ + __FILE__, __LINE__);\ + abort ();\ + }\ + } while (false) // Provides convenient way to check for errno-style errors. -#define errno_assert(x) do { if (!(x)) {\ - perror (NULL);\ - fprintf (stderr, "%s (%s:%d)\n", #x, __FILE__, __LINE__);\ - abort ();\ -}} while (false) +#define errno_assert(x) \ + do {\ + if (unlikely (!(x))) {\ + perror (NULL);\ + fprintf (stderr, "%s (%s:%d)\n", #x, __FILE__, __LINE__);\ + abort ();\ + }\ + } while (false) // Provides convenient way to check for POSIX errors. -#define posix_assert(x) do { if ((x)) {\ - fprintf (stderr, "%s (%s:%d)\n", strerror (x), __FILE__, __LINE__);\ - abort ();\ -}} while (false) +#define posix_assert(x) \ + do {\ + if (unlikely (x)) {\ + fprintf (stderr, "%s (%s:%d)\n", strerror (x), __FILE__, __LINE__);\ + abort ();\ + }\ + } while (false) // Provides convenient way to check for errors from getaddrinfo. -#define gai_assert(x) do { if (x) {\ - const char *errstr = gai_strerror (x);\ - fprintf (stderr, "%s (%s:%d)\n", errstr, __FILE__, __LINE__);\ - abort ();\ -}} while (false) +#define gai_assert(x) \ + do {\ + if (unlikely (x)) {\ + const char *errstr = gai_strerror (x);\ + fprintf (stderr, "%s (%s:%d)\n", errstr, __FILE__, __LINE__);\ + abort ();\ + }\ + } while (false) #endif diff --git a/src/likely.hpp b/src/likely.hpp new file mode 100644 index 0000000..3ca7bd6 --- /dev/null +++ b/src/likely.hpp @@ -0,0 +1,32 @@ +/* + Copyright (c) 2007-2009 FastMQ Inc. + + This file is part of 0MQ. + + 0MQ is free software; you can redistribute it and/or modify it under + the terms of the Lesser GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + 0MQ is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + Lesser GNU General Public License for more details. + + You should have received a copy of the Lesser GNU General Public License + along with this program. If not, see . +*/ + +#ifndef __ZMQ_LIKELY_HPP_INCLUDED__ +#define __ZMQ_LIKELY_HPP_INCLUDED__ + +#if defined __GNUC__ +#define likely(x) __builtin_expect ((x), 1) +#define unlikely(x) __builtin_expect ((x), 0) +#else +#define likely(x) (x) +#define unlikely(x) (x) +#endif + + +#endif -- cgit v1.2.3