From 281345fdc962398cfdb5a25f2794f0b1c1418728 Mon Sep 17 00:00:00 2001 From: Stewart Smith Date: Tue, 15 Dec 2015 18:59:00 +1100 Subject: remove custom assert implementation and exception.c Signed-off-by: Stewart Smith --- clib/assert.h | 49 --------- clib/exception.h | 306 --------------------------------------------------- clib/src/err.c | 16 +-- clib/src/exception.c | 152 ------------------------- clib/tree.h | 1 - 5 files changed, 5 insertions(+), 519 deletions(-) delete mode 100644 clib/assert.h delete mode 100644 clib/exception.h delete mode 100644 clib/src/exception.c (limited to 'clib') diff --git a/clib/assert.h b/clib/assert.h deleted file mode 100644 index 421d074..0000000 --- a/clib/assert.h +++ /dev/null @@ -1,49 +0,0 @@ -/* IBM_PROLOG_BEGIN_TAG */ -/* This is an automatically generated prolog. */ -/* */ -/* $Source: clib/assert.h $ */ -/* */ -/* OpenPOWER FFS Project */ -/* */ -/* Contributors Listed Below - COPYRIGHT 2014,2015 */ -/* [+] International Business Machines Corp. */ -/* */ -/* */ -/* Licensed under the Apache License, Version 2.0 (the "License"); */ -/* you may not use this file except in compliance with the License. */ -/* You may obtain a copy of the License at */ -/* */ -/* http://www.apache.org/licenses/LICENSE-2.0 */ -/* */ -/* Unless required by applicable law or agreed to in writing, software */ -/* distributed under the License is distributed on an "AS IS" BASIS, */ -/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ -/* implied. See the License for the specific language governing */ -/* permissions and limitations under the License. */ -/* */ -/* IBM_PROLOG_END_TAG */ - -/*! @file assert.h - * @brief Assertion helpers - * @author Shaun Wetzstein - * @date 2010-2011 - */ - -#ifdef assert -#undef assert -#endif - -/*! - * @def assert(e) - * @hideinitializer - * @brief Check for program assertion failures - * @param e [in] assertion expression - * @throws ASSERTION iff expression @em e evaluates @em false - */ - -#ifdef NDEBUG -#define assert(e) ((void)0) -#else -#include "exception.h" -#define assert(e) ((void)((e) ? (void)0 : throw_bytes(ASSERTION, __STRING((e)), strlen(__STRING((e)))))) -#endif diff --git a/clib/exception.h b/clib/exception.h deleted file mode 100644 index 2874447..0000000 --- a/clib/exception.h +++ /dev/null @@ -1,306 +0,0 @@ -/* IBM_PROLOG_BEGIN_TAG */ -/* This is an automatically generated prolog. */ -/* */ -/* $Source: clib/exception.h $ */ -/* */ -/* OpenPOWER FFS Project */ -/* */ -/* Contributors Listed Below - COPYRIGHT 2014,2015 */ -/* [+] International Business Machines Corp. */ -/* */ -/* */ -/* Licensed under the Apache License, Version 2.0 (the "License"); */ -/* you may not use this file except in compliance with the License. */ -/* You may obtain a copy of the License at */ -/* */ -/* http://www.apache.org/licenses/LICENSE-2.0 */ -/* */ -/* Unless required by applicable law or agreed to in writing, software */ -/* distributed under the License is distributed on an "AS IS" BASIS, */ -/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ -/* implied. See the License for the specific language governing */ -/* permissions and limitations under the License. */ -/* */ -/* IBM_PROLOG_END_TAG */ - -/*! - * @file exception.h - * @brief Exceptions for C - * @details This file implements setjump / longjump based exceptions - * @note Using these macros will create an exception context in each thread - * @author Shaun Wetzstein - * @date 2008-2011 - */ - -#ifndef __EXCEPTION_H__ -#define __EXCEPTION_H__ - -#include -#include -#include -#include - -#define EX_PAGE_SIZE 4096 //!< Max. size of an exception payload -#define EXC_MAGIC 0x45584350 //!< Magic number, i.e. "EXCP" - -#define ASSERTION 1 //!< Assertion exception class -//#define UNEXPECTED 2 //!< Unexpected result exception class -//#define ERRNO 3 //!< @em errno error exception class -#define EXC_LAST 4 - -typedef struct exception_frame exception_frame_t; //!< Alias for the @em exception_frame class - -/*! - * @brief Exception class - */ -typedef struct { - int ex; //!< Exception class - - const char *file; //!< Source file exception was thrown - int line; //!< Source line exception was thrown - - void *data; //!< User-defined data associated with the exception - int size; //!< Size (in bytes) of the user-defined data -} exception_t; - -/*! - * @brief Exception frame class - */ -struct exception_frame { - unsigned long magic; //!< @private - exception_frame_t *prev; //!< @private - jmp_buf jmp; //!< @private - exception_t exc; //!< @private -}; - -/*! - * @def try - * @brief Simulate a try {...} catch {...} else {...} end_try block - * @hideinitializer - * @details For example, - * @code - * ... - * #define ERROR 4 - * ... - * exception_t * ex; - * ... - * try { - * ... - * } catch (ERROR, ex) { - * fprintf(stderr, "caught ERROR exception at: %s(%d)\n", - * ex->file, ex->line); - * struct ErrorStruct * err = (struct ErrorStruct *)ex->data - * ...format and log err... - * } end_try - * @endcode - */ -#define try \ -do { \ - __exc_init(); \ - exception_frame_t __frame; \ - memset(&__frame, 0, sizeof(__frame)); \ - __frame.magic = EXC_MAGIC, __frame.prev = __exc_get_frame(); \ - __exc_set_frame(&__frame); \ - volatile int __flag = setjmp(__frame.jmp); \ - if (__flag == 0) { - -/*! - * @def catch - * @brief Simulate a try {...} catch {...} else {...} end_try block - * @hideinitializer - * @details For example, - * @code - * ... - * exception_t ex; - * ... - * try { - * .... - * } catch (TYPE1, ex) { - * ... - * } catch (TYPE2, ex) { - * ... - * } catch (TYPE3, ex) { - * ... - * } else (ex) { - * ... - * } end_try - * @endcode - */ -#define catch(x, e) \ - } else if (__flag == (x)) { \ - exception_frame_t * __tmp = __exc_get_frame(); \ - (e) = __tmp->exc, (e).ex = (__flag); \ - -/*! - * @def else - * @brief Simulate a try {...} catch {...} else {...} end_try block - * @hideinitializer - * @details For example, - * @code - * ... - * exception_t ex; - * ... - * try { - * .... - * } catch (TYPE1, ex) { - * ... - * } catch (TYPE2, ex) { - * ... - * } catch (TYPE3, ex) { - * ... - * } else (ex) { - * ... - * } end_try - * @endcode - */ -#define else(e) catch(__flag, (e)) - -/*! - * @def end_try - * @brief Simulate a try {...} catch {...} else {...} end_try block - * @hideinitializer - */ -#define end_try \ - } else { \ - __exc_set_frame(__frame.prev); \ - throw_bytes(__flag, __frame.exc.data, __frame.exc.size); \ - } \ - __exc_set_frame(__frame.prev); \ -} while (0); - -/*! - * @def throw(x, f, ...) - * @brief Throw a C exception with printf-like formatting - * @hideinitializer - * @param x [in] Exception class - * @param d [in] Pointer to user-defined data - * @param s [in] Size of user-defined data (in bytes) - * @details For example, - * @code - * ... - * #define ERRNO_STRING - * ... - * #define throw_errno_string(x) \ - * throw(ERRNO_STRING, "errno=%d : %s", (x), - * (void*)strerror((x)), __FILE__, __LINE__) - * ... - * if (rc < 0) - * throw_errno_string(errno); - * ... - * exception_t ex; - * ... - * catch (ERRNO_STRING ex) { - * fprintf(strerr, "EXCEPTION: errno: %s in file: %s on line: %d\n", - * (char *)ex.data, ex.file, ex.line); - * exit(1); - * } - * @endcode - */ -#define throw(x, f, ...) ({ \ - char __d[EX_PAGE_SIZE]; \ - __exc_throw((x), __d, snprintf(__d, sizeof __d, (f), ##__VA_ARGS__),\ - __FILE__, __LINE__); \ -}) - -/*! - * @def rethrow(x, f, ...) - * @brief Rethrow a C exception from within a try ... catch ... end_try block - * @hideinitializer - * @param e [in] Exception object - * @details For example, - * @code - * ... - * exception_t ex; - * ... - * catch (ERRNO_STRING ex) { - * fprintf(strerr, "EXCEPTION: errno: %s in file: %s on line: %d\n", - * (char *)ex.data, ex.file, ex.line); - * rethrow(ex); - * } - * @endcode - */ -#define rethrow(e) ({ \ - __exc_rethrow((e).ex, (e).data, (e).size, (e).file, (e).line); \ -}) - -/*! - * @def throw_bytes(x, d, s) - * @brief Throw a C exception with user-defined data - * @hideinitializer - * @param x [in] Exception class - * @param d [in] Pointer to user-defined data - * @param s [in] Size of user-defined data (in bytes) - * @details For example, - * @code - * ... - * #define ERRNO_STRING - * ... - * #define throw_errno_string(x) \ - * throw_bytes(ERRNO_STRING, (void*)strerror((x)), - * strlen(strerror((x)), __FILE__, __LINE__) - * ... - * if (rc < 0) - * throw_errno_string(errno); - * ... - * exception_t ex; - * ... - * catch (ERRNO_STRING ex) { - * fprintf(strerr, "EXCEPTION: errno: %s in file: %s on line: %d\n", - * (char *)ex.data, ex.file, ex.line); - * exit(1); - * } - * @endcode - */ -#define throw_bytes(x, d, s) \ - __exc_throw((x), (d), (s), __FILE__, __LINE__) - -/*! - * @def throw_unexpected(x) - * @brief Throw a message (NULL terminated C string), due to an @em - * unexpected error - * @hideinitializer - * @param x [in] Unexpected error message - * @details For example, - * @code - * ... - * rc = foo_function(); - * if (rc < 0) - * throw_unexpected("Invalid return code from foo_function()"); - * ... - * @endcode - */ -#define throw_unexpected(x) ({ \ - __exc_throw(UNEXPECTED,((void*)x), strlen((x)), \ - __FILE__, __LINE__); \ - }) - -/*! - * @def throw_errno(x) - * @brief Throw an errno number, due to an invalid function result. - * @hideinitializer - * @param x [in] Unexpected errno number - * @details For example, - * @code - * ... - * rc = open(...); - * if (rc == -1) - * throw_errno(errno); - * ... - * @endcode - */ -#define throw_errno(x) ({ \ - __exc_throw(ERRNO,(void*)(x), 0, \ - __FILE__, __LINE__); \ - }) - -/*! @cond */ -extern void __exc_init(void); -extern exception_frame_t *__exc_get_frame(void); -extern void __exc_set_frame(exception_frame_t *); -extern int __exc_throw(int, void *, int, const char *, int); -extern int __exc_rethrow(int, void *, int, const char *, int); -extern void __exc_backtrace(const char *, ...); -extern const char *__exc_name(int exc); -/*! @endcond */ - -#endif /* __EXCEPTION_H__ */ diff --git a/clib/src/err.c b/clib/src/err.c index 8312ffd..838c22f 100644 --- a/clib/src/err.c +++ b/clib/src/err.c @@ -44,7 +44,7 @@ #include "err.h" -static pthread_key_t __err_key = 0; +static list_t *__err_key = 0; static const char *__err_type_name[] = { [ERR_NONE] = "none", @@ -68,7 +68,7 @@ void err_delete(err_t * self) err_t *err_get(void) { - list_t *list = (list_t *) pthread_getspecific(__err_key); + list_t *list = __err_key; err_t *self = NULL; @@ -77,7 +77,7 @@ err_t *err_get(void) if (list_empty(list)) { free(list), list = NULL; - assert(pthread_setspecific(__err_key, list) == 0); + __err_key = list; } } @@ -88,13 +88,13 @@ void err_put(err_t * self) { assert(self != NULL); - list_t *list = pthread_getspecific(__err_key); + list_t *list = __err_key; if (list == NULL) { list = (list_t *) malloc(sizeof(*list)); assert(list != NULL); list_init(list); - assert(pthread_setspecific(__err_key, list) == 0); + __err_key = list; } list_add_head(list, &self->node); @@ -207,9 +207,3 @@ const char *err_type_name(err_t * self) return __err_type_name[self->type]; } -/* =======================================================================*/ - -__constructor static void __err__ctor__(void) -{ - assert(pthread_key_create(&__err_key, NULL) == 0); -} diff --git a/clib/src/exception.c b/clib/src/exception.c deleted file mode 100644 index 747bb7d..0000000 --- a/clib/src/exception.c +++ /dev/null @@ -1,152 +0,0 @@ -/* IBM_PROLOG_BEGIN_TAG */ -/* This is an automatically generated prolog. */ -/* */ -/* $Source: clib/src/exception.c $ */ -/* */ -/* OpenPOWER FFS Project */ -/* */ -/* Contributors Listed Below - COPYRIGHT 2014,2015 */ -/* [+] International Business Machines Corp. */ -/* */ -/* */ -/* Licensed under the Apache License, Version 2.0 (the "License"); */ -/* you may not use this file except in compliance with the License. */ -/* You may obtain a copy of the License at */ -/* */ -/* http://www.apache.org/licenses/LICENSE-2.0 */ -/* */ -/* Unless required by applicable law or agreed to in writing, software */ -/* distributed under the License is distributed on an "AS IS" BASIS, */ -/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ -/* implied. See the License for the specific language governing */ -/* permissions and limitations under the License. */ -/* */ -/* IBM_PROLOG_END_TAG */ - -/* - * File: exc.c - * Author: Shaun Wetzstein - * Descr: {set,long}jmp implementation of exceptions for C code. - * Note: using these macros will create an exception context - * in each thread. - * Date: 7/06/09 - */ - -#include -#include -#include -#include -#include -#include - -#include "exception.h" -#include "misc.h" - -/* =======================================================================*/ - -const char *exception_name[] = { - "assertion", - "unexpected", - "errno", -}; - -typedef struct exception_context { - pthread_once_t once; - pthread_key_t key; -} exception_context; - -/* =======================================================================*/ - -static exception_context __exc_ctx = { PTHREAD_ONCE_INIT, 0 }; - -static inline void __exc_key_create(void) -{ - if (pthread_key_create(&__exc_ctx.key, NULL)) - __exc_throw(ASSERTION, NULL, 0, __FILE__, __LINE__); -} - -/* =======================================================================*/ - -void __exc_init(void) -{ - if (pthread_once(&__exc_ctx.once, __exc_key_create)) - __exc_throw(ASSERTION, NULL, 0, __FILE__, __LINE__); -} - -exception_frame_t *__exc_get_frame(void) -{ - return (exception_frame_t *) (pthread_getspecific(__exc_ctx.key)); -} - -void __exc_set_frame(exception_frame_t * f) -{ - if (pthread_setspecific(__exc_ctx.key, f)) - __exc_throw(ASSERTION, NULL, 0, __FILE__, __LINE__); -} - -void __exc_backtrace(const char *fmt, ...) -{ - if (fmt != NULL) { - va_list va; - va_start(va, fmt); - vfprintf(stderr, fmt, va); - va_end(va); - } - - fprintf(stderr, "========== backtrace ==========\n"); - void *bt[1024]; - int nr = backtrace(bt, sizeof bt); - backtrace_symbols_fd(bt, nr, fileno(stderr)); - fprintf(stderr, "========== backtrace ==========\n"); -} - -int __exc_throw(int ex, void *data, int size, const char *file, int line) -{ - extern char *program_invocation_short_name; - - exception_frame_t *frame = __exc_get_frame(); - - if (frame == NULL) { - __exc_backtrace - ("*** UNHANDLED EXCEPTION *** -- %s: %s(%d) ex=%d\n\n", - program_invocation_short_name, file, line, ex); - abort(); - } - - if (frame->magic != EXC_MAGIC) { - __exc_backtrace - ("*** CORRUPTED EXCEPTION FRAME *** -- %s: %s(%d) ex=%d\n\n", - program_invocation_short_name, file, line, ex); - abort(); - } - - frame->exc.file = file; - frame->exc.line = line; - - frame->exc.data = data; - frame->exc.size = size; - - longjmp(frame->jmp, ex); - - return -1; -} - -int __exc_rethrow(int ex, void *data, int size, const char *file, int line) -{ - exception_frame_t *frame = __exc_get_frame(); - - if (frame != NULL) - __exc_set_frame(frame->prev); - - return __exc_throw(ex, data, size, file, line); -} - -const char *__exc_name(int exc) -{ - return (exc < 0 || EXC_LAST <= exc) ? NULL : exception_name[exc]; -} - -__constructor void __exc_ctor(void) -{ - __exc_init(); -} diff --git a/clib/tree.h b/clib/tree.h index f6736f8..dafdf38 100644 --- a/clib/tree.h +++ b/clib/tree.h @@ -69,7 +69,6 @@ #include #include -#include "exception.h" #include "builtin.h" #include "compare.h" #include "type.h" -- cgit v1.2.1