
Module: ppl/ppl Branch: master Commit: 58befe688ea3a6b02bc227b6ca2f9c34488fc237 URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=58befe688ea3a...
Author: Roberto Bagnara bagnara@cs.unipr.it Date: Fri Feb 26 22:08:11 2010 +0100
Throw std::logic_error in case the client asks for watchdogs on a system not supporting them.
---
TODO | 2 ++ Watchdog/src/Watchdog.inlines.hh | 8 ++++---- Watchdog/tests/watchdog1.cc | 4 ++-- interfaces/C/ppl_c_header.h | 18 ++++++++++++------ interfaces/C/ppl_c_implementation_common.defs.hh | 1 + interfaces/C/tests/watchdog1.c | 12 +++++------- tests/Polyhedron/watchdog1.cc | 9 +++++++++ 7 files changed, 35 insertions(+), 19 deletions(-)
diff --git a/TODO b/TODO index 835ea2c..ddebb7f 100644 --- a/TODO +++ b/TODO @@ -2,6 +2,8 @@ Enhancements for PPL 0.11 =========================
+- Handle std::logic_error (now thrown in case watchdogs are not + available) in all the interfaces. - Make all the *affine*image() methods uniform as far as the specification is concerned. - Look carefully at http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42115 diff --git a/Watchdog/src/Watchdog.inlines.hh b/Watchdog/src/Watchdog.inlines.hh index 6591359..b7c6222 100644 --- a/Watchdog/src/Watchdog.inlines.hh +++ b/Watchdog/src/Watchdog.inlines.hh @@ -95,14 +95,14 @@ template <typename Flag_Base, typename Flag> Watchdog::Watchdog(unsigned int /* units */, const Flag_Base* volatile& /* holder */, Flag& /* flag */) { - throw std::runtime_error("PWL::Watchdog objects not supported:" - " system does not provide setitimer()"); + throw std::logic_error("PWL::Watchdog objects not supported:" + " system does not provide setitimer()"); }
inline Watchdog::Watchdog(unsigned int /* units */, void (* /* function */)()) { - throw std::runtime_error("PWL::Watchdog objects not supported:" - " system does not provide setitimer()"); + throw std::logic_error("PWL::Watchdog objects not supported:" + " system does not provide setitimer()"); }
inline diff --git a/Watchdog/tests/watchdog1.cc b/Watchdog/tests/watchdog1.cc index 6876c5f..c51dc6e 100644 --- a/Watchdog/tests/watchdog1.cc +++ b/Watchdog/tests/watchdog1.cc @@ -57,8 +57,8 @@ test01() { return ok; } #if !PWL_WATCHDOG_OBJECTS_ARE_SUPPORTED - catch (std::runtime_error& e) { - nout << "runtime_error: " << e.what() << endl << endl; + catch (const std::logic_error& e) { + nout << "std::logic_error caught (" << e.what() << ")" << endl; return true; } #endif // !PWL_WATCHDOG_OBJECTS_ARE_SUPPORTED diff --git a/interfaces/C/ppl_c_header.h b/interfaces/C/ppl_c_header.h index cb2456c..d508282 100644 --- a/interfaces/C/ppl_c_header.h +++ b/interfaces/C/ppl_c_header.h @@ -309,32 +309,38 @@ enum ppl_enum_error_code { permitted size was attempted. */ PPL_ERROR_LENGTH_ERROR = -5, /*! \hideinitializer + The client program attempted to use the PPL in a way that violates + its internal logic. This happens, for instance, when the client + attempts to use the timeout facilities on a system that does not + support them. */ + PPL_ERROR_LOGIC_ERROR = -6, + /*! \hideinitializer An arithmetic overflow occurred and the computation was consequently interrupted. This can <EM>only</EM> happen in library's incarnations using bounded integers as coefficients. */ - PPL_ARITHMETIC_OVERFLOW = -6, + PPL_ARITHMETIC_OVERFLOW = -7, /*! \hideinitializer An error occurred during a C input/output operation. A more precise indication of what went wrong is available via <CODE>errno</CODE>. */ - PPL_STDIO_ERROR = -7, + PPL_STDIO_ERROR = -8, /*! \hideinitializer An internal error that was diagnosed by the PPL itself. This indicates a bug in the PPL. */ - PPL_ERROR_INTERNAL_ERROR = -8, + PPL_ERROR_INTERNAL_ERROR = -9, /*! \hideinitializer A standard exception has been raised by the C++ run-time environment. This indicates a bug in the PPL. */ - PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION = -9, + PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION = -10, /*! \hideinitializer A totally unknown, totally unexpected error happened. This indicates a bug in the PPL. */ - PPL_ERROR_UNEXPECTED_ERROR = -10, + PPL_ERROR_UNEXPECTED_ERROR = -11, /*! \hideinitializer An exception has been raised by the PPL as a timeout previously set by the user has expired. */ - PPL_TIMEOUT_EXCEPTION = -11 + PPL_TIMEOUT_EXCEPTION = -12 };
/*! \brief diff --git a/interfaces/C/ppl_c_implementation_common.defs.hh b/interfaces/C/ppl_c_implementation_common.defs.hh index 31a3044..3120dd4 100644 --- a/interfaces/C/ppl_c_implementation_common.defs.hh +++ b/interfaces/C/ppl_c_implementation_common.defs.hh @@ -139,6 +139,7 @@ CATCH_STD_EXCEPTION(bad_alloc, PPL_ERROR_OUT_OF_MEMORY) \ CATCH_STD_EXCEPTION(invalid_argument, PPL_ERROR_INVALID_ARGUMENT) \ CATCH_STD_EXCEPTION(domain_error, PPL_ERROR_DOMAIN_ERROR) \ CATCH_STD_EXCEPTION(length_error, PPL_ERROR_LENGTH_ERROR) \ +CATCH_STD_EXCEPTION(logic_error, PPL_ERROR_LOGIC_ERROR) \ CATCH_STD_EXCEPTION(overflow_error, PPL_ARITHMETIC_OVERFLOW) \ CATCH_STD_EXCEPTION(runtime_error, PPL_ERROR_INTERNAL_ERROR) \ CATCH_STD_EXCEPTION(exception, PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION) \ diff --git a/interfaces/C/tests/watchdog1.c b/interfaces/C/tests/watchdog1.c index a75ed07..5f0350d 100644 --- a/interfaces/C/tests/watchdog1.c +++ b/interfaces/C/tests/watchdog1.c @@ -47,16 +47,14 @@ fatal(const char* format, ...) { static void error_handler(enum ppl_enum_error_code code, const char* description) { + if (check_noisy() || check_very_noisy()) + fprintf(stderr, "PPL error code %d: %s\n", code, description); #if !PWL_WATCHDOG_OBJECTS_ARE_SUPPORTED - /* If Watchdog objects are not supported, an error will occur: - this is normal. - FIXME: what is not normal is the use of this error code, which - the documentation reserves for PPL bugs. */ - if (code == PPL_ERROR_INTERNAL_ERROR) + /* If Watchdog objects are not supported, a logic error will occur: + this is normal. */ + if (code == PPL_ERROR_LOGIC_ERROR) my_exit(0); #endif - if (check_noisy() || check_very_noisy()) - fprintf(stderr, "PPL error code %d: %s\n", code, description); }
void diff --git a/tests/Polyhedron/watchdog1.cc b/tests/Polyhedron/watchdog1.cc index 3350554..5254d53 100644 --- a/tests/Polyhedron/watchdog1.cc +++ b/tests/Polyhedron/watchdog1.cc @@ -131,4 +131,13 @@ main() TRY {
return 0; } +#if !PWL_WATCHDOG_OBJECTS_ARE_SUPPORTED +// If Watchdog objects are not supported, an exception will be thrown: +// this is normal. +catch (const std::logic_error& e) { + nout << "std::logic_error caught (" << e.what() << ")" + << std::endl; + exit(0); +} +#endif // !PWL_WATCHDOG_OBJECTS_ARE_SUPPORTED CATCH