Fenix @develop
 
Loading...
Searching...
No Matches
fenix_util.hpp
1/*
2//@HEADER
3// ************************************************************************
4//
5//
6// _|_|_|_| _|_|_|_| _| _| _|_|_| _| _|
7// _| _| _|_| _| _| _| _|
8// _|_|_| _|_|_| _| _| _| _| _|
9// _| _| _| _|_| _| _| _|
10// _| _|_|_|_| _| _| _|_|_| _| _|
11//
12//
13//
14//
15// Copyright (C) 2016 Rutgers University and Sandia Corporation
16//
17// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
18// the U.S. Government retains certain rights in this software.
19//
20// Redistribution and use in source and binary forms, with or without
21// modification, are permitted provided that the following conditions are
22// met:
23//
24// 1. Redistributions of source code must retain the above copyright
25// notice, this list of conditions and the following disclaimer.
26//
27// 2. Redistributions in binary form must reproduce the above copyright
28// notice, this list of conditions and the following disclaimer in the
29// documentation and/or other materials provided with the distribution.
30//
31// 3. Neither the name of the Corporation nor the names of the
32// contributors may be used to endorse or promote products derived from
33// this software without specific prior written permission.
34//
35// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
36// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
38// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
39// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
40// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
41// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
42// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
43// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
44// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
45// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
46//
47// Author Marc Gamell, Eric Valenzuela, Keita Teranishi, Manish Parashar
48// Michael Heroux, and Matthew Whitlock
49//
50// Questions? Contact Keita Teranishi (knteran@sandia.gov) and
51// Marc Gamell (mgamell@cac.rutgers.edu)
52//
53// ************************************************************************
54//@HEADER
55*/
56
57#ifndef __FENIX_UTIL__
58#define __FENIX_UTIL__
59
60#include <mpi.h>
61#include "fenix.hpp"
62#include "fenix_opt.hpp"
63
64extern char* logname;
65
66void __fenix_ranks_agree(int*, int*, int*, MPI_Datatype*);
67
68int __fenix_binary_search(int*, int, int);
69
70int __fenix_comparator(const void*, const void*);
71
72int __fenix_get_size(MPI_Datatype);
73
74int __fenix_get_current_rank(MPI_Comm);
75
76int __fenix_get_world_size(MPI_Comm);
77
78void* s_calloc(int count, size_t size);
79
80void* s_malloc(size_t size);
81
82void* s_realloc(void* mem, size_t size);
83
84namespace fenix::util {
85
86int resume_application(bool new_exception = false);
87
88// ScopedOptions hold the old option and revert to it in their destructors, so
89// changes revert even when exceptions are thrown.
91 ScopedOption(SettingName m_setting, int new_option) : setting(m_setting) {
92 set_option(setting, new_option);
93 }
95 if (fenix::initialized()) set_option(setting, old);
96 }
97
98 // No moving or copying scoped options, things would get complicated.
99 ScopedOption(const ScopedOption&) = delete;
100 ScopedOption(ScopedOption&&) = delete;
101
102 const SettingName setting;
103 const int old = get_option(setting);
104};
105
106// Default error handling for inside the Fenix runtime.
108 ScopedOption resume{RESUME_MODE, THROW}, unhandled{UNHANDLED_MODE, ABORT};
109};
110
111// Helper for MPI_ERRORS_RETURN-like error handling
113 ScopedOption recovery{RECOVERY_MODE, IGNORE}, resume{RESUME_MODE, RETURN};
114};
115
117 ScopedActiveMlog(int id) : old_mlog(mlog::active()) {
118 mlog::activate(id);
119 }
121 if (fenix::initialized()) mlog::activate(old_mlog);
122 }
123 const int old_mlog;
124 const bool old_inline_recovery =
125 old_mlog != FENIX_MLOG_NONE && get_option(MLOG_RECOVERY_MODE) != MANUAL &&
126 get_option(RECOVERY_MODE) != IGNORE;
127};
128
129} // namespace fenix::util
130
131// clang-format off
132#define RUNTIME_EXCEPTION_HANDLER \
133 } catch (const fenix::RuntimeException& e) { \
134 debug_print("%s\n", e.what()); \
135 return e.error;
136
137#define COMM_EXCEPTION_HANDLER \
138 } catch (const fenix::CommException& e) { \
139 return fenix::util::resume_application(); \
140 }
141
142#define FENIX_CPP_API_BEGIN \
143 try { \
144 fenix::util::ScopedDefaultRuntimeOptions _scoped_dro; \
145 if (!fenix::initialized()) FENIX_THROW(FENIX_ERROR_UNINITIALIZED);
146
147// clang-format on
148
149#define FENIX_C_API_BEGIN FENIX_CPP_API_BEGIN
150
151#ifdef FENIX_C_CATCH_RUNTIME_EXCEPTIONS
152#define FENIX_C_API_END RUNTIME_EXCEPTION_HANDLER COMM_EXCEPTION_HANDLER
153#else
154#define FENIX_C_API_END COMM_EXCEPTION_HANDLER
155#endif
156
157#ifdef FENIX_CPP_CATCH_RUNTIME_EXCEPTIONS
158#define FENIX_CPP_API_END RUNTIME_EXCEPTION_HANDLER COMM_EXCEPTION_HANDLER
159#else
160#define FENIX_CPP_API_END COMM_EXCEPTION_HANDLER
161#endif
162
163// Local functions are ones that can be called before Fenix is initialized
164#define FENIX_LOCAL_CPP_API_BEGIN try {
165#define FENIX_LOCAL_CPP_API_END FENIX_CPP_API_END
166
167#define FENIX_LOCAL_C_API_BEGIN FENIX_LOCAL_CPP_API_BEGIN
168#define FENIX_LOCAL_C_API_END FENIX_C_API_END
169
170#endif
Fenix_Setting_name
Global Fenix settings.
Definition fenix.h:172
Definition fenix_util.hpp:116
Definition fenix_util.hpp:107
Definition fenix_util.hpp:112
Definition fenix_util.hpp:90