asio_wrapper.h 2.6 KB
Newer Older
1 2 3 4 5 6 7 8
// Copyright (C) 2016 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef ASIO_WRAPPER_H
#define ASIO_WRAPPER_H 1

9 10 11 12 13 14
// !!! IMPORTANT !!!!
// This file must be included anywhere one would normally have included
// boost/asio.hpp.  Until the issue described below is resolved in some
// other fashion  asio.hpp should not be included other than through
// this file.
//
15 16 17
// The optimizer as of gcc 5.2.0, may not reliably ensure a single value
// returned by boost::system::system_category() within a translation unit
// when building the header only version of the boost error handling.
18
// See Trac #4243 for more details. For now we turn off optimization for
19 20 21
// header only builds the under the suspect GCC versions.
//
// The issue arises from in-lining the above function, which returns a
22
// reference to a local static variable, system_category_const.  This leads
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
// to situations where a construct such as the following:
//
// {{{
//    if (ec == boost::asio::error::would_block
//       || ec == boost::asio::error::try_again)
//      return false;
// }}}
//
// which involve implicit conversion of enumerates to error_code instances
// to not evaluate correctly.  During the implicit conversion the error_code
// instances may be assigned differeing values error_code:m_cat. This
// causes two instances of error_code which should have been equal to
// to not be equal.
//
// The problem disappers if either error handling code is not built header
// only as this results in a single definiton of system_category() supplied
// by libboost_system; or the error handling code is not optimized.
//
// We're doing the test here, rather than in configure to guard against the
// user supplying the header only flag via environment variables.
//
44 45 46 47 48
// We opened bugs with GNU and BOOST:
//
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69789
// https://svn.boost.org/trac/boost/ticket/11989
//
49 50 51 52 53 54 55 56
// @todo Currently, 5.3.0 is the latest released versio of GCC. Version 6.0 is
// in development and will need to be tested.

#define GNU_CC_VERSION (__GNUC__ * 10000 \
                     + __GNUC_MINOR__ * 100 \
                     + __GNUC_PATCHLEVEL__)

#if (defined(__GNUC__) && \
57
    ((GNU_CC_VERSION >= 50200) && (GNU_CC_VERSION <= 50301)) \
58 59 60 61 62 63 64 65 66 67
    && defined(BOOST_ERROR_CODE_HEADER_ONLY))
#pragma GCC push_options
#pragma GCC optimize ("O0")
#include <boost/asio.hpp>
#pragma GCC pop_options
#else
#include <boost/asio.hpp>
#endif

#endif // ASIO_WRAPPER_H