[GIT] ppl/ppl(master): Initialization machinery improved.

Module: ppl/ppl Branch: master Commit: 74d3a39c15fe5a1feeb3513859470f4fa9d74cd9 URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=74d3a39c15fe5...
Author: Roberto Bagnara roberto.bagnara@bugseng.com Date: Tue Jan 20 13:01:00 2015 +0100
Initialization machinery improved. Previously there was undefined behavior for the case where the user defined PPL_NO_AUTOMATIC_INITIALIZATION. (Thanks to Esseger.)
---
src/Init.cc | 32 ++++++++++++++++++++++++++++++-- src/initializer.hh | 19 ++++++++++++------- 2 files changed, 42 insertions(+), 9 deletions(-)
diff --git a/src/Init.cc b/src/Init.cc index 8359b96..b572ab7 100644 --- a/src/Init.cc +++ b/src/Init.cc @@ -92,9 +92,9 @@ namespace Implementation { int (* volatile ppl_check_function_p)() = ppl_check_function; int (* volatile ppl_setround_function_p)(int) = ppl_setround_function;
-} // Implementation +} // namespace Implementation
-} // Parma_Polyhedra_Library +} // namespace Parma_Polyhedra_Library
namespace {
@@ -214,3 +214,31 @@ PPL::Init::~Init() { Coefficient_constants_finalize(); } } + +namespace Parma_Polyhedra_Library { + +namespace Implementation { + +namespace { + +static Parma_Polyhedra_Library::Init* Parma_Polyhedra_Library_initializer_p; + +} // namespace + +void +initialize_aux() { + if (Parma_Polyhedra_Library_initializer_p == 0) { + Parma_Polyhedra_Library_initializer_p = new Init(); + } +} + +void +finalize_aux() { + PPL_ASSERT(Parma_Polyhedra_Library_initializer_p != 0); + delete Parma_Polyhedra_Library_initializer_p; + Parma_Polyhedra_Library_initializer_p = 0; +} + +} // namespace Implementation + +} // namespace Parma_Polyhedra_Library diff --git a/src/initializer.hh b/src/initializer.hh index 6963c0f..d10f54d 100644 --- a/src/initializer.hh +++ b/src/initializer.hh @@ -32,7 +32,16 @@ static Parma_Polyhedra_Library::Init Parma_Polyhedra_Library_initializer;
#else
-static Parma_Polyhedra_Library::Init* Parma_Polyhedra_Library_initializer_p; +namespace Parma_Polyhedra_Library { + +namespace Implementation { + +void initialize_aux(); +void finalize_aux(); + +} // namespace Implementation + +} // namespace Parma_Polyhedra_Library
#endif
@@ -42,9 +51,7 @@ namespace Parma_Polyhedra_Library { inline void initialize() { #ifdef PPL_NO_AUTOMATIC_INITIALIZATION - if (Parma_Polyhedra_Library_initializer_p == 0) { - Parma_Polyhedra_Library_initializer_p = new Init(); - } + Implementation::initialize_aux(); #endif }
@@ -52,9 +59,7 @@ initialize() { inline void finalize() { #ifdef PPL_NO_AUTOMATIC_INITIALIZATION - PPL_ASSERT(Parma_Polyhedra_Library_initializer_p != 0); - delete Parma_Polyhedra_Library_initializer_p; - Parma_Polyhedra_Library_initializer_p = 0; + Implementation::finalize_aux(); #endif }
participants (1)
-
Roberto Bagnara