diff --git a/src/core/assert.h b/src/core/assert.h index e97fa8aa6..eb0b6e028 100644 --- a/src/core/assert.h +++ b/src/core/assert.h @@ -21,36 +21,12 @@ #ifndef ASSERT_H #define ASSERT_H -/** - * \defgroup assert Assert - * \brief assert functions and macros - * - * The assert macros are used to verify - * at runtime that a certain condition is true. If it is - * not true, the program halts. These checks are built - * into the program only in debugging builds. They are - * removed in optimized builds. - */ - -namespace ns3 { - -/** - * \ingroup debugging - * - * When an NS_ASSERT cannot verify its condition, - * this function is called. This is where you should - * be able to put a breakpoint with a debugger if - * you want to catch assertions before the program - * halts. - */ -void AssertBreakpoint (void); - -}//namespace ns3 - #ifdef NS3_ASSERT_ENABLE #include +#include "breakpoint.h" + /** * \ingroup assert * \param condition condition to verifiy. @@ -68,7 +44,7 @@ void AssertBreakpoint (void); std::cerr << "assert failed. file=" << __FILE__ << \ ", line=" << __LINE__ << ", cond=\""#condition << \ "\"" << std::endl; \ - ns3::AssertBreakpoint (); \ + NS_BREAKPOINT (); \ } \ } \ while (false) @@ -89,7 +65,7 @@ void AssertBreakpoint (void); if (!(condition)) \ { \ std::cerr << message << std::endl; \ - ns3::AssertBreakpoint (); \ + NS_BREAKPOINT (); \ } \ } \ while (false) diff --git a/src/core/assert.cc b/src/core/breakpoint.cc similarity index 77% rename from src/core/assert.cc rename to src/core/breakpoint.cc index c780a37ea..c748792bc 100644 --- a/src/core/assert.cc +++ b/src/core/breakpoint.cc @@ -1,6 +1,6 @@ /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ /* - * Copyright (c) 2006 INRIA + * Copyright (c) 2006,2007 INRIA, INESC Porto * All rights reserved. * * This program is free software; you can redistribute it and/or modify @@ -17,14 +17,29 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Author: Mathieu Lacage + * Author: Gustavo Carneiro */ -#include "assert.h" +#include "breakpoint.h" +#include "ns3/core-config.h" +#ifdef HAVE_SIGNAL_H +# include +#endif namespace ns3 { +#ifdef HAVE_SIGNAL_H + void -AssertBreakpoint (void) +Breakpoint (void) +{ + raise (SIGTRAP); +} + +#else + +void +Breakpoint (void) { int *a = 0; /** @@ -38,4 +53,6 @@ AssertBreakpoint (void) } } +#endif // HAVE_SIGNAL_H + }//namespace ns3 diff --git a/src/core/breakpoint.h b/src/core/breakpoint.h new file mode 100644 index 000000000..c2f541ad8 --- /dev/null +++ b/src/core/breakpoint.h @@ -0,0 +1,76 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2006,2007 INESC Porto, INRIA + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program 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 + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Gustavo Carneiro + * Author: Mathieu Lacage + */ +#ifndef BREAKPOINT_H +#define BREAKPOINT_H + +namespace ns3 { + +/* Hacker macro to place breakpoints for selected machines. + * Actual use is strongly discouraged of course ;) + * Copied from GLib 2.12.9. + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/** + * \ingroup debugging + * + * Inserts a breakpoint instruction (or equivalent system call) into + * the code for selected machines. When an NS_ASSERT cannot verify its condition, + * this macro is used. Falls back to calling + * AssertBreakpoint() for architectures where breakpoint assembly + * instructions are not supported. + */ +#if (defined (__i386__) || defined (__amd64__) || defined (__x86_64__)) && defined (__GNUC__) && __GNUC__ >= 2 +# define NS_BREAKPOINT() \ + do{ __asm__ __volatile__ ("int $03"); }while(false) +#elif defined (_MSC_VER) && defined (_M_IX86) +# define NS_BREAKPOINT() \ + do{ __asm int 3h }while(false) +#elif defined (__alpha__) && !defined(__osf__) && defined (__GNUC__) && __GNUC__ >= 2 +# define NS_BREAKPOINT() \ + do{ __asm__ __volatile__ ("bpt"); }while(false) +#else /* !__i386__ && !__alpha__ */ +# define NS_BREAKPOINT() ns3::BreakpointFallback () +#endif + +/** + * \brief fallback breakpoint function + * + * This function is used by the NS_BREAKPOINT() macro as a fallback + * for when breakpoint assembly instructions are not available. It + * attempts to halt program execution either by a raising SIGTRAP, on + * unix systems, or by dereferencing a null pointer. + * + * Normally you should not call this function directly. + */ +void BreakpointFallback (void); + + +}//namespace ns3 + + +#endif /* BREAKPOINT_H */ diff --git a/src/core/fatal-error.h b/src/core/fatal-error.h index bcb22269b..9acab8091 100644 --- a/src/core/fatal-error.h +++ b/src/core/fatal-error.h @@ -21,7 +21,7 @@ #ifndef FATAL_ERROR_H #define FATAL_ERROR_H -#include "assert.h" +#include "breakpoint.h" #include /** @@ -32,7 +32,7 @@ * * When this macro is hit at runtime, the user-specified * error message is output and the program is halted by calling - * the ns3::AssertBreakpoint function. This macro is enabled + * the NS_DEBUG_BREAKPOINT macro. This macro is enabled * unconditionally in all builds, including debug and optimized * builds. */ @@ -40,7 +40,7 @@ do \ { \ std::cout << msg << std::endl; \ - ns3::AssertBreakpoint (); \ + NS_BREAKPOINT (); \ } \ while (false) diff --git a/src/core/uid-manager.cc b/src/core/uid-manager.cc index f9af50622..f6aa3f6de 100644 --- a/src/core/uid-manager.cc +++ b/src/core/uid-manager.cc @@ -20,6 +20,7 @@ */ #include "uid-manager.h" #include "ns3/fatal-error.h" +#include "ns3/assert.h" namespace ns3 { diff --git a/src/core/wscript b/src/core/wscript index 219f5541f..139f1c56b 100644 --- a/src/core/wscript +++ b/src/core/wscript @@ -15,6 +15,12 @@ def configure(conf): e.define = 'HAVE_GETENV' e.run() + e = conf.create_header_configurator() + e.mandatory = False + e.name = 'signal.h' + e.define = 'HAVE_SIGNAL_H' + e.run() + conf.write_config_header('ns3/core-config.h') @@ -26,7 +32,7 @@ def build(bld): core.source = [ 'callback-test.cc', 'debug.cc', - 'assert.cc', + 'breakpoint.cc', 'ptr.cc', 'object.cc', 'test.cc', @@ -58,6 +64,7 @@ def build(bld): 'object.h', 'debug.h', 'assert.h', + 'breakpoint.h', 'fatal-error.h', 'test.h', 'random-variable.h',