Merge branch release-2016 into release-2018
[gromacs.git] / src / gromacs / utility / fatalerror.h
blob3dba1b8998d5e835050ade7bc35cc3a2d0ea63f4
1 /*
2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2004, The GROMACS development team.
6 * Copyright (c) 2012,2014,2015, by the GROMACS development team, led by
7 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
8 * and including many others, as listed in the AUTHORS file in the
9 * top-level source directory and at http://www.gromacs.org.
11 * GROMACS is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public License
13 * as published by the Free Software Foundation; either version 2.1
14 * of the License, or (at your option) any later version.
16 * GROMACS is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with GROMACS; if not, see
23 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
24 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 * If you want to redistribute modifications to GROMACS, please
27 * consider that scientific software is very special. Version
28 * control is crucial - bugs must be traceable. We will be happy to
29 * consider code for inclusion in the official distribution, but
30 * derived work must not be called official GROMACS. Details are found
31 * in the README & COPYING files - if they are missing, get the
32 * official version at http://www.gromacs.org.
34 * To help us fund GROMACS development, we humbly ask that you cite
35 * the research papers on the package. Check out http://www.gromacs.org.
37 /*! \file
38 * \brief
39 * Declares fatal error handling and debugging routines for C code.
41 * \inpublicapi
42 * \ingroup module_utility
44 #ifndef GMX_UTILITY_FATALERROR_H
45 #define GMX_UTILITY_FATALERROR_H
47 #include <stdarg.h>
48 #include <stdio.h>
50 #include "gromacs/utility/basedefinitions.h"
52 #ifdef __cplusplus
53 extern "C" {
54 #endif
56 /*! \brief
57 * Debug log file.
59 * Functions can write to this file for debug info.
60 * Before writing to it, it should be checked whether the file is not NULL:
61 * \code
62 if (debug)
64 fprintf(debug, "%s", "Debug text");
66 \endcode
68 extern FILE *debug;
69 /** Whether extra debugging is enabled. */
70 extern gmx_bool gmx_debug_at;
72 /*! \brief
73 * Initializes debugging variables.
75 * This function is not threadsafe. It should be called as part of
76 * initializing \Gromacs, before any other thread accesses the library.
77 * For command line programs, gmx::CommandLineModuleManager takes care
78 * of this if the user requests debugging.
80 void gmx_init_debug(const int dbglevel, const char *dbgfile);
82 /** Returns TRUE when the program was started in debug mode */
83 gmx_bool bDebugMode(void);
85 /** Implementation for where(). */
86 void
87 _where(const char *file, int line);
88 /** Prints filename and line to stdlog. */
89 #define where() _where(__FILE__, __LINE__)
91 /** Sets the log file for printing error messages. */
92 void
93 gmx_fatal_set_log_file(FILE *fp);
95 /** Function pointer type for fatal error handler callback. */
96 typedef void (*gmx_error_handler_t)(const char *title, const char *msg, const char *file, int line);
98 /*! \brief
99 * Sets an error handler for gmx_fatal() and other fatal error routines.
101 * The default handler prints the message.
102 * \Gromacs will terminate the program after the error handler returns.
103 * To make gmx_fatal_collective() work, the error handler should not terminate
104 * the program, as it cannot know what is the desired way of termination.
105 * The message passed to the handler may be a multi-line string.
107 * \see gmx_fatal()
109 void gmx_set_error_handler(gmx_error_handler_t func);
111 /** Identifies the state of the program on a fatal error. */
112 enum ExitType
114 /*! \brief
115 * Clean exit is possible.
117 * There should be no concurrently executing code that might be accessing
118 * global objects, and all MPI ranks should reach the same fatal error.
120 ExitType_CleanExit,
121 /*! \brief
122 * Program needs to be aborted.
124 * There are no preconditions for this state.
126 ExitType_Abort,
127 /*! \brief
128 * Program needs to be aborted, but some other rank is responsible of it.
130 * There should be some other MPI rank that reaches the same fatal error,
131 * but uses ExitType_Abort. The other ranks can then use
132 * ExitType_NonMasterAbort to wait for that one rank to issue the abort.
134 ExitType_NonMasterAbort
137 /*! \brief
138 * Helper function to terminate the program on a fatal error.
140 * \param[in] exitType Identifies the state of the program at the time of the
141 * call, determining how the program can be terminated.
142 * \param[in] returnValue Exit code for the program, for cases where it can be
143 * used.
145 gmx_noreturn void gmx_exit_on_fatal_error(enum ExitType exitType, int returnValue);
147 /*! \brief
148 * Low-level fatal error reporting routine for collective MPI errors.
150 * This function works as gmx_fatal(), but provides additional control for
151 * cases where it is known that the same error occurs on multiple MPI ranks.
152 * The error handler is called only if \p bMaster is `TRUE`, and MPI_Finalize()
153 * is called instead of MPI_Abort() in MPI-enabled \Gromacs if \p bFinalize is
154 * `TRUE`.
156 * This is used to implement gmx_fatal_collective() (which cannot be declared
157 * here, since it would bring with it mdrun-specific dependencies).
159 gmx_noreturn void
160 gmx_fatal_mpi_va(int fatal_errno, const char *file, int line,
161 gmx_bool bMaster, gmx_bool bFinalize,
162 const char *fmt, va_list ap);
164 /*! \brief
165 * Fatal error reporting routine for \Gromacs.
167 * This function prints a fatal error message with a header that contains the
168 * source file and line number of the call, followed by the string specified by
169 * \p fmt and supplied parameters.
170 * If \p fatal_errno is 0, only the message and arguments are printed.
171 * If \p fatal_errno is a legal system errno or -1, a perror()-like message is
172 * printed after the first message; if fatal_errno is -1, the last system errno
173 * will be used.
174 * The format of \p fmt uses printf()-like formatting.
176 * In case all MPI processes want to stop with the same fatal error,
177 * use gmx_fatal_collective(), declared in network.h,
178 * to avoid having as many error messages as processes.
180 * The first three parameters can be provided through ::FARGS:
181 * \code
182 gmx_fatal(FARGS, fmt, ...);
183 \endcode
185 gmx_noreturn void
186 gmx_fatal(int fatal_errno, const char *file, int line, const char *fmt, ...);
187 /** Helper macro to pass first three parameters to gmx_fatal(). */
188 #define FARGS 0, __FILE__, __LINE__
190 /** Implementation for gmx_error(). */
191 gmx_noreturn void _gmx_error(const char *key, const char *msg, const char *file, int line);
192 /*! \brief
193 * Alternative fatal error routine with canned messages.
195 * This works as gmx_fatal(), except that a generic error message is added
196 * based on a string key, and printf-style formatting is not supported.
197 * Should not typically be called directly, but through gmx_call() etc.
199 #define gmx_error(key, msg) _gmx_error(key, msg, __FILE__, __LINE__)
201 /*! \name Fatal error routines for certain types of errors
203 * These wrap gmx_error() and provide the \p key parameter as one of the
204 * recognized strings.
206 /*! \{ */
207 #define gmx_call(msg) gmx_error("call", msg)
208 #define gmx_comm(msg) gmx_error("comm", msg)
209 #define gmx_file(msg) gmx_error("file", msg)
210 #define gmx_impl(msg) gmx_error("impl", msg)
211 #define gmx_incons(msg) gmx_error("incons", msg)
212 #define gmx_input(msg) gmx_error("input", msg)
213 #define gmx_mem(msg) gmx_error("mem", msg)
214 #define gmx_open(fn) gmx_error("open", fn)
215 /*! \} */
217 /*! \brief
218 * Implementation for range_check() and range_check_mesg().
220 * \p warn_str can be NULL.
222 void _range_check(int n, int n_min, int n_max, const char *warn_str,
223 const char *var,
224 const char *file, int line);
226 /*! \brief
227 * Checks that a variable is within a range.
229 * If \p n is not in range [n_min, n_max), a fatal error is raised.
230 * \p n_min is inclusive, but \p n_max is not.
232 #define range_check_mesg(n, n_min, n_max, str) _range_check(n, n_min, n_max, str,#n, __FILE__, __LINE__)
234 /*! \brief
235 * Checks that a variable is within a range.
237 * This works as range_check_mesg(), but with a default error message.
239 #define range_check(n, n_min, n_max) _range_check(n, n_min, n_max, NULL,#n, __FILE__, __LINE__)
241 /*! \brief
242 * Prints a warning message to stderr.
244 * The format of \p fmt uses printf()-like formatting.
245 * The message string should NOT start with "WARNING"
246 * and should NOT end with a newline.
248 void gmx_warning(const char *fmt, ...);
250 #ifdef __cplusplus
252 #endif
254 #endif