summaryrefslogtreecommitdiffstats
path: root/cpukit/libcsupport/src/error.c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2010-06-28 22:13:55 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2010-06-28 22:13:55 +0000
commit1d33ecab00b86b4eca5fa78d538b92f49e4293ed (patch)
tree9294a4cdf51e6d7ecc7abf6adc80108e5b17020a /cpukit/libcsupport/src/error.c
parent2010-06-28 Joel Sherrill <joel.sherrill@oarcorp.com> (diff)
downloadrtems-1d33ecab00b86b4eca5fa78d538b92f49e4293ed.tar.bz2
2010-06-28 Joel Sherrill <joel.sherrill@oarcorp.com>
* libcsupport/include/rtems/error.h, libcsupport/src/error.c: Clean up so rtems_panic() can be a noreturn method. This eliminates some unreachable and thus untestable code.
Diffstat (limited to 'cpukit/libcsupport/src/error.c')
-rw-r--r--cpukit/libcsupport/src/error.c235
1 files changed, 116 insertions, 119 deletions
diff --git a/cpukit/libcsupport/src/error.c b/cpukit/libcsupport/src/error.c
index 3c82af265c..666da76b8b 100644
--- a/cpukit/libcsupport/src/error.c
+++ b/cpukit/libcsupport/src/error.c
@@ -16,17 +16,17 @@
*
* error_flag can be specified as any of the following:
*
- * RTEMS_ERROR_ERRNO -- include errno text in output
- * RTEMS_ERROR_PANIC -- halts local system after output
- * RTEMS_ERROR_ABORT -- abort after output
+ * RTEMS_ERROR_ERRNO -- include errno text in output
+ * RTEMS_ERROR_PANIC -- halts local system after output
+ * RTEMS_ERROR_ABORT -- abort after output
*
* It can also include a rtems_status value which can be OR'd
* with the above flags. *
*
* EXAMPLE
- * #include <rtems.h>
- * #include <rtems/error.h>
- * rtems_error(0, "stray interrupt %d", intr);
+ * #include <rtems.h>
+ * #include <rtems/error.h>
+ * rtems_error(0, "stray interrupt %d", intr);
*
* EXAMPLE
* if ((status = rtems_task_create(...)) != RTEMS_SUCCCESSFUL)
@@ -54,115 +54,100 @@
#include <errno.h>
#include <stdlib.h>
#include <string.h>
-#include <unistd.h> /* _exit() */
+#include <unistd.h> /* _exit() */
int rtems_panic_in_progress;
const rtems_assoc_t rtems_status_assoc[] = {
- { "successful completion", RTEMS_SUCCESSFUL, 0 },
- { "returned from a thread", RTEMS_TASK_EXITTED, 0 },
- { "multiprocessing not configured", RTEMS_MP_NOT_CONFIGURED, 0 },
- { "invalid object name", RTEMS_INVALID_NAME, 0 },
- { "invalid object id", RTEMS_INVALID_ID, 0 },
- { "too many", RTEMS_TOO_MANY, 0 },
- { "timed out waiting", RTEMS_TIMEOUT, 0 },
- { "object deleted while waiting", RTEMS_OBJECT_WAS_DELETED, 0 },
- { "specified size was invalid", RTEMS_INVALID_SIZE, 0 },
- { "address specified is invalid", RTEMS_INVALID_ADDRESS, 0 },
- { "number was invalid", RTEMS_INVALID_NUMBER, 0 },
- { "item has not been initialized", RTEMS_NOT_DEFINED, 0 },
- { "resources still outstanding", RTEMS_RESOURCE_IN_USE, 0 },
- { "request not satisfied", RTEMS_UNSATISFIED, 0 },
- { "thread is in wrong state", RTEMS_INCORRECT_STATE, 0 },
- { "thread already in state", RTEMS_ALREADY_SUSPENDED, 0 },
- { "illegal on calling thread", RTEMS_ILLEGAL_ON_SELF, 0 },
- { "illegal for remote object", RTEMS_ILLEGAL_ON_REMOTE_OBJECT, 0 },
- { "called from wrong environment", RTEMS_CALLED_FROM_ISR, 0 },
- { "invalid thread priority", RTEMS_INVALID_PRIORITY, 0 },
- { "invalid date/time", RTEMS_INVALID_CLOCK, 0 },
- { "invalid node id", RTEMS_INVALID_NODE, 0 },
- { "directive not configured", RTEMS_NOT_CONFIGURED, 0 },
- { "not owner of resource", RTEMS_NOT_OWNER_OF_RESOURCE , 0 },
- { "directive not implemented", RTEMS_NOT_IMPLEMENTED, 0 },
- { "RTEMS inconsistency detected", RTEMS_INTERNAL_ERROR, 0 },
- { "could not get enough memory", RTEMS_NO_MEMORY, 0 },
- { "driver IO error", RTEMS_IO_ERROR, 0 },
- { "internal multiprocessing only", THREAD_STATUS_PROXY_BLOCKING, 0 },
- { 0, 0, 0 },
+ { "successful completion", RTEMS_SUCCESSFUL, 0 },
+ { "returned from a thread", RTEMS_TASK_EXITTED, 0 },
+ { "multiprocessing not configured", RTEMS_MP_NOT_CONFIGURED, 0 },
+ { "invalid object name", RTEMS_INVALID_NAME, 0 },
+ { "invalid object id", RTEMS_INVALID_ID, 0 },
+ { "too many", RTEMS_TOO_MANY, 0 },
+ { "timed out waiting", RTEMS_TIMEOUT, 0 },
+ { "object deleted while waiting", RTEMS_OBJECT_WAS_DELETED, 0 },
+ { "specified size was invalid", RTEMS_INVALID_SIZE, 0 },
+ { "address specified is invalid", RTEMS_INVALID_ADDRESS, 0 },
+ { "number was invalid", RTEMS_INVALID_NUMBER, 0 },
+ { "item has not been initialized", RTEMS_NOT_DEFINED, 0 },
+ { "resources still outstanding", RTEMS_RESOURCE_IN_USE, 0 },
+ { "request not satisfied", RTEMS_UNSATISFIED, 0 },
+ { "thread is in wrong state", RTEMS_INCORRECT_STATE, 0 },
+ { "thread already in state", RTEMS_ALREADY_SUSPENDED, 0 },
+ { "illegal on calling thread", RTEMS_ILLEGAL_ON_SELF, 0 },
+ { "illegal for remote object", RTEMS_ILLEGAL_ON_REMOTE_OBJECT, 0 },
+ { "called from wrong environment", RTEMS_CALLED_FROM_ISR, 0 },
+ { "invalid thread priority", RTEMS_INVALID_PRIORITY, 0 },
+ { "invalid date/time", RTEMS_INVALID_CLOCK, 0 },
+ { "invalid node id", RTEMS_INVALID_NODE, 0 },
+ { "directive not configured", RTEMS_NOT_CONFIGURED, 0 },
+ { "not owner of resource", RTEMS_NOT_OWNER_OF_RESOURCE , 0 },
+ { "directive not implemented", RTEMS_NOT_IMPLEMENTED, 0 },
+ { "RTEMS inconsistency detected", RTEMS_INTERNAL_ERROR, 0 },
+ { "could not get enough memory", RTEMS_NO_MEMORY, 0 },
+ { "driver IO error", RTEMS_IO_ERROR, 0 },
+ { "internal multiprocessing only", THREAD_STATUS_PROXY_BLOCKING, 0 },
+ { 0, 0, 0 },
};
-const char *
-rtems_status_text(
- rtems_status_code status
+const char *rtems_status_text(
+ rtems_status_code status
)
{
- return rtems_assoc_name_by_local(rtems_status_assoc, status);
+ return rtems_assoc_name_by_local(rtems_status_assoc, status);
}
static int rtems_verror(
- rtems_error_code_t error_flag,
- const char *printf_format,
- va_list arglist
+ rtems_error_code_t error_flag,
+ const char *printf_format,
+ va_list arglist
)
{
- int local_errno = 0;
- int chars_written = 0;
- rtems_status_code status;
-
- if (error_flag & RTEMS_ERROR_PANIC)
- {
- if (rtems_panic_in_progress++)
- _Thread_Disable_dispatch(); /* disable task switches */
-
- /* don't aggravate things */
- if (rtems_panic_in_progress > 2)
- return 0;
- }
-
- (void) fflush(stdout); /* in case stdout/stderr same */
-
- status = error_flag & ~RTEMS_ERROR_MASK;
- if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */
- local_errno = errno;
-
- #if defined(RTEMS_MULTIPROCESSING)
- if (_System_state_Is_multiprocessing)
- fprintf(stderr, "[%" PRIu32 "] ", _Configuration_MP_table->node);
- #endif
-
- chars_written += vfprintf(stderr, printf_format, arglist);
-
- if (status)
- chars_written += fprintf(stderr, " (status: %s)", rtems_status_text(status));
-
- if (local_errno)
- {
- if ((local_errno > 0) && *strerror(local_errno))
- chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno));
- else
- chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno);
- }
-
- chars_written += fprintf(stderr, "\n");
-
- (void) fflush(stderr);
-
- if (error_flag & (RTEMS_ERROR_PANIC | RTEMS_ERROR_ABORT))
- {
- if (error_flag & RTEMS_ERROR_PANIC)
- {
- rtems_error(0, "fatal error, exiting");
- _exit(local_errno);
- }
- else
- {
- rtems_error(0, "fatal error, aborting");
- abort();
- }
- }
- return chars_written;
+ int local_errno = 0;
+ int chars_written = 0;
+ rtems_status_code status;
+
+ if (error_flag & RTEMS_ERROR_PANIC) {
+ if (rtems_panic_in_progress++)
+ _Thread_Disable_dispatch(); /* disable task switches */
+
+ /* don't aggravate things */
+ if (rtems_panic_in_progress > 2)
+ return 0;
+ }
+
+ (void) fflush(stdout); /* in case stdout/stderr same */
+
+ status = error_flag & ~RTEMS_ERROR_MASK;
+ if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */
+ local_errno = errno;
+
+ #if defined(RTEMS_MULTIPROCESSING)
+ if (_System_state_Is_multiprocessing)
+ fprintf(stderr, "[%" PRIu32 "] ", _Configuration_MP_table->node);
+ #endif
+
+ chars_written += vfprintf(stderr, printf_format, arglist);
+
+ if (status)
+ chars_written +=
+ fprintf(stderr, " (status: %s)", rtems_status_text(status));
+
+ if (local_errno) {
+ if ((local_errno > 0) && *strerror(local_errno))
+ chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno));
+ else
+ chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno);
+ }
+
+ chars_written += fprintf(stderr, "\n");
+
+ (void) fflush(stderr);
+
+ return chars_written;
}
@@ -175,19 +160,28 @@ static int rtems_verror(
*/
int rtems_error(
- rtems_error_code_t error_flag,
- const char *printf_format,
- ...
- )
+ rtems_error_code_t error_flag,
+ const char *printf_format,
+ ...
+)
{
- va_list arglist;
- int chars_written;
-
- va_start(arglist, printf_format);
- chars_written = rtems_verror(error_flag, printf_format, arglist);
- va_end(arglist);
-
- return chars_written;
+ va_list arglist;
+ int chars_written;
+
+ va_start(arglist, printf_format);
+ chars_written = rtems_verror(error_flag, printf_format, arglist);
+ va_end(arglist);
+
+ if (error_flag & RTEMS_ERROR_PANIC) {
+ rtems_error(0, "fatal error, exiting");
+ _exit(errno);
+ }
+ if (error_flag & RTEMS_ERROR_ABORT) {
+ rtems_error(0, "fatal error, aborting");
+ abort();
+ }
+
+ return chars_written;
}
/*
@@ -195,13 +189,16 @@ int rtems_error(
*/
void rtems_panic(
- const char *printf_format,
- ...
- )
+ const char *printf_format,
+ ...
+)
{
- va_list arglist;
+ va_list arglist;
+
+ va_start(arglist, printf_format);
+ (void) rtems_verror(RTEMS_ERROR_PANIC, printf_format, arglist);
+ va_end(arglist);
- va_start(arglist, printf_format);
- (void) rtems_verror(RTEMS_ERROR_PANIC, printf_format, arglist);
- va_end(arglist);
+ rtems_error(0, "fatal error, exiting");
+ _exit(errno);
}