remove custom assert implementation and exception.c

Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
This commit is contained in:
Stewart Smith 2015-12-15 18:59:00 +11:00
parent 799ef76e46
commit 281345fdc9
28 changed files with 8 additions and 546 deletions

View File

@ -9,7 +9,6 @@ libclib_a_SOURCES = \
clib/src/err.c \
clib/src/misc.c \
clib/src/ecc.c \
clib/src/exception.c \
clib/src/list.c \
clib/src/list_iter.c \
clib/src/tree.c \
@ -22,9 +21,9 @@ libclib_a_SOURCES = \
libffs_a_SOURCES = ffs/src/libffs.c ffs/src/libffs2.c
ecc_ecc_SOURCES = ecc/src/main.c
ecc_ecc_LDADD = libffs.a libclib.a -lpthread
ecc_ecc_LDADD = libffs.a libclib.a
fpart_fpart_LDADD = libffs.a libclib.a -lpthread
fpart_fpart_LDADD = libffs.a libclib.a
fpart_fpart_SOURCES = \
fpart/src/cmd_create.c \
fpart/src/cmd_add.c \
@ -46,7 +45,7 @@ fcp_fcp_SOURCES = \
fcp/src/cmd_list.c \
fcp/src/cmd_trunc.c \
fcp/src/main.c
fcp_fcp_LDADD = libffs.a libclib.a -lpthread
fcp_fcp_LDADD = libffs.a libclib.a
bin_SCRIPTS = fpart/fpart.sh

View File

@ -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 <shaun@us.ibm.com>
* @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

View File

@ -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 <shaun@us.ibm.com>
* @date 2008-2011
*/
#ifndef __EXCEPTION_H__
#define __EXCEPTION_H__
#include <setjmp.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#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__ */

View File

@ -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);
}

View File

@ -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 <shaun@us.ibm.com>
* 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 <errno.h>
#include <assert.h>
#include <pthread.h>
#include <stdio.h>
#include <stdarg.h>
#include <execinfo.h>
#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();
}

View File

@ -69,7 +69,6 @@
#include <stdio.h>
#include <string.h>
#include "exception.h"
#include "builtin.h"
#include "compare.h"
#include "type.h"

View File

@ -45,7 +45,6 @@
#include <ctype.h>
#include <clib/attribute.h>
#include <clib/assert.h>
#include <clib/misc.h>
#include <clib/min.h>
#include <clib/ecc.h>

View File

@ -46,7 +46,6 @@
#include <regex.h>
#include <clib/attribute.h>
#include <clib/assert.h>
#include <clib/list.h>
#include <clib/list_iter.h>
#include <clib/misc.h>

View File

@ -46,7 +46,6 @@
#include <regex.h>
#include <clib/attribute.h>
#include <clib/assert.h>
#include <clib/list.h>
#include <clib/list_iter.h>
#include <clib/misc.h>

View File

@ -46,7 +46,6 @@
#include <regex.h>
#include <clib/attribute.h>
#include <clib/assert.h>
#include <clib/list.h>
#include <clib/list_iter.h>
#include <clib/misc.h>

View File

@ -45,7 +45,6 @@
#include <ctype.h>
#include <clib/attribute.h>
#include <clib/assert.h>
#include <clib/list.h>
#include <clib/list_iter.h>
#include <clib/misc.h>

View File

@ -46,7 +46,6 @@
#include <regex.h>
#include <clib/attribute.h>
#include <clib/assert.h>
#include <clib/list.h>
#include <clib/list_iter.h>
#include <clib/misc.h>

View File

@ -46,7 +46,6 @@
#include <regex.h>
#include <clib/attribute.h>
#include <clib/assert.h>
#include <clib/list.h>
#include <clib/list_iter.h>
#include <clib/misc.h>

View File

@ -46,7 +46,6 @@
#include <regex.h>
#include <clib/attribute.h>
#include <clib/assert.h>
#include <clib/list.h>
#include <clib/list_iter.h>
#include <clib/misc.h>

View File

@ -46,7 +46,6 @@
#include <regex.h>
#include <clib/attribute.h>
#include <clib/assert.h>
#include <clib/list.h>
#include <clib/list_iter.h>
#include <clib/misc.h>

View File

@ -46,7 +46,6 @@
#include <regex.h>
#include <clib/attribute.h>
#include <clib/assert.h>
#include <clib/version.h>
#include <clib/list.h>
#include <clib/list_iter.h>

View File

@ -29,7 +29,6 @@
#include <stdbool.h>
#include <stdarg.h>
#include <clib/exception.h>
#include "ffs.h"

View File

@ -48,7 +48,6 @@
#include "libffs.h"
#include <clib/assert.h>
#include <clib/builtin.h>
#include <clib/checksum.h>
#include <clib/misc.h>

View File

@ -46,7 +46,6 @@
#include "libffs2.h"
#include <clib/assert.h>
#include <clib/builtin.h>
#include <clib/checksum.h>
#include <clib/misc.h>

View File

@ -45,9 +45,7 @@
#include <ctype.h>
#include <regex.h>
#include <clib/exception.h>
#include <clib/attribute.h>
#include <clib/assert.h>
#include <clib/list.h>
#include <clib/list_iter.h>
#include <clib/misc.h>

View File

@ -46,7 +46,6 @@
#include <regex.h>
#include <clib/attribute.h>
#include <clib/assert.h>
#include <clib/list.h>
#include <clib/list_iter.h>
#include <clib/misc.h>

View File

@ -46,7 +46,6 @@
#include <regex.h>
#include <clib/attribute.h>
#include <clib/assert.h>
#include <clib/list.h>
#include <clib/list_iter.h>
#include <clib/misc.h>

View File

@ -46,7 +46,6 @@
#include <regex.h>
#include <clib/attribute.h>
#include <clib/assert.h>
#include <clib/list.h>
#include <clib/list_iter.h>
#include <clib/misc.h>

View File

@ -46,7 +46,6 @@
#include <regex.h>
#include <clib/attribute.h>
#include <clib/assert.h>
#include <clib/list.h>
#include <clib/list_iter.h>
#include <clib/misc.h>

View File

@ -45,7 +45,6 @@
#include <ctype.h>
#include <regex.h>
#include <clib/assert.h>
#include <clib/list.h>
#include <clib/list_iter.h>
#include <clib/misc.h>

View File

@ -46,7 +46,6 @@
#include <regex.h>
#include <clib/attribute.h>
#include <clib/assert.h>
#include <clib/list.h>
#include <clib/list_iter.h>
#include <clib/misc.h>

View File

@ -46,7 +46,6 @@
#include <regex.h>
#include <clib/attribute.h>
#include <clib/assert.h>
#include <clib/list.h>
#include <clib/list_iter.h>
#include <clib/misc.h>

View File

@ -46,7 +46,6 @@
#include <regex.h>
#include <clib/attribute.h>
#include <clib/assert.h>
#include <clib/list.h>
#include <clib/list_iter.h>
#include <clib/misc.h>