src/core/model/fatal-impl.cc
author Tom Goff <tgoff@tgoff.net>
Fri, 23 Mar 2012 04:33:02 -0400
changeset 7786 715b25bff41d
parent 7256 b04ba6772f8c
child 9134 7a750f032acd
permissions -rw-r--r--
bug 1000: typo in FlushStreams
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6371
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
     2
/*
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
     3
 * Copyright (c) 2010 NICTA
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
     4
 *
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
     8
 *
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    12
 * GNU General Public License for more details.
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    13
 *
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    17
 *
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    18
 * Author: Quincy Tse <quincy.tse@nicta.com.au>
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    19
 */
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    20
#include "fatal-impl.h"
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    21
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    22
#include <iostream>
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    23
#include <list>
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    24
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    25
#include <cstdlib>
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    26
#include <cstdio>
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    27
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    28
#include <csignal>
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    29
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    30
namespace ns3 {
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    31
namespace FatalImpl {
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    32
6423
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    33
/**
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    34
 * Note on implementation: the singleton pattern we use here is tricky because
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    35
 * it has to deal with:
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    36
 *   - make sure that whoever calls Register (potentially before main enters and 
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    37
 *     before any constructor run in this file) succeeds
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    38
 *   - make sure that whoever calls Unregister (potentially before FlushStream runs
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    39
 *     but also after it runs) succeeds
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    40
 *   - make sure that the memory allocated with new is deallocated with delete before
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    41
 *     the program exits so that valgrind reports no leaks
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    42
 *
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    43
 * This is why we go through all the painful hoops below.
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    44
 */
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    45
6371
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    46
/* File-scope */
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    47
namespace {
7169
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    48
std::list<std::ostream*> **PeekStreamList (void)
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    49
{
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    50
  static std::list<std::ostream*> *streams = 0;
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    51
  return &streams;
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    52
}
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    53
std::list<std::ostream*> *GetStreamList (void)
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    54
{
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    55
  std::list<std::ostream*> **pstreams = PeekStreamList ();
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    56
  if (*pstreams == 0)
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    57
    {
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    58
      *pstreams = new std::list<std::ostream*> ();
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    59
    }
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    60
  return *pstreams;
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    61
}
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    62
struct destructor
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    63
{
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    64
  ~destructor ()
6416
60416db0df14 avoid crash upon process exit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6371
diff changeset
    65
  {
60416db0df14 avoid crash upon process exit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6371
diff changeset
    66
    std::list<std::ostream*> **pstreams = PeekStreamList ();
7169
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    67
    delete *pstreams;
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    68
    *pstreams = 0;
6416
60416db0df14 avoid crash upon process exit
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6371
diff changeset
    69
  }
7169
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    70
};
6371
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    71
}
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    72
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    73
void
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    74
RegisterStream (std::ostream* stream)
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    75
{
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    76
  GetStreamList ()->push_back (stream);
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    77
}
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    78
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    79
void
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    80
UnregisterStream (std::ostream* stream)
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    81
{
6423
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    82
  std::list<std::ostream*> **pl = PeekStreamList ();
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    83
  if (*pl == 0)
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    84
    {
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    85
      return;
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    86
    }
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    87
  (*pl)->remove (stream);
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    88
  if ((*pl)->empty ())
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    89
    {
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    90
      delete *pl;
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    91
      *pl = 0;
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
    92
    }
6371
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    93
}
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    94
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    95
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
    96
namespace {
7169
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    97
/* Overrides normal SIGSEGV handler once the
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
    98
 * HandleTerminate function is run. */
7256
b04ba6772f8c rerun check-style.py at default level to enforce space after function name
Tom Henderson <tomh@tomh.org>
parents: 7169
diff changeset
    99
void sigHandler (int sig)
7169
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
   100
{
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
   101
  FlushStreams ();
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
   102
  std::abort ();
358f71a624d8 core coding style changes
Josh Pelkey <jpelkey@gatech.edu>
parents: 6821
diff changeset
   103
}
6371
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   104
}
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   105
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   106
void 
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   107
FlushStreams (void)
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   108
{
6423
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
   109
  std::list<std::ostream*> **pl = PeekStreamList ();
7786
715b25bff41d bug 1000: typo in FlushStreams
Tom Goff <tgoff@tgoff.net>
parents: 7256
diff changeset
   110
  if (*pl == 0)
6423
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
   111
    {
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
   112
      return;
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
   113
    }
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
   114
6371
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   115
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   116
  /* Override default SIGSEGV handler - will flush subsequent
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   117
   * streams even if one of the stream pointers is bad.
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   118
   * The SIGSEGV override should only be active for the
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   119
   * duration of this function. */
6423
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
   120
  struct sigaction hdl;
6371
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   121
  hdl.sa_handler=sigHandler;
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   122
  sigaction (SIGSEGV, &hdl, 0);
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   123
6423
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
   124
  std::list<std::ostream*> *l = *pl;
6371
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   125
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   126
  /* Need to do it this way in case any of the ostream* causes SIGSEGV */
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   127
  while (!l->empty ())
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   128
    {
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   129
      std::ostream* s (l->front ());
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   130
      l->pop_front ();
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   131
      s->flush ();
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   132
    }
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   133
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   134
  /* Restore default SIGSEGV handler (Not that it matters anyway) */
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   135
  hdl.sa_handler=SIG_DFL;
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   136
  sigaction (SIGSEGV, &hdl, 0);
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   137
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   138
  /* Flush all opened FILE* */
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   139
  std::fflush (0);
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   140
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   141
  /* Flush stdandard streams - shouldn't be required (except for clog) */
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   142
  std::cout.flush ();
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   143
  std::cerr.flush ();
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   144
  std::clog.flush ();
6423
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
   145
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
   146
  delete l;
595b0598701c plug leak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 6416
diff changeset
   147
  *pl = 0;
6371
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   148
}
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   149
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   150
} //FatalImpl
a8ef6c075cdf add missing files
Quincy Tse <quincy.tse@gmail.com>
parents:
diff changeset
   151
} //ns3