A
lgorithmique
N
umérique
D
istribuée
Public GIT Repository
projects
/
simgrid.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Rollback - the java code should make a THROWF call - adrien
[simgrid.git]
/
src
/
xbt
/
ex.c
diff --git
a/src/xbt/ex.c
b/src/xbt/ex.c
index
35b8b27
..
4b0d7bd
100644
(file)
--- a/
src/xbt/ex.c
+++ b/
src/xbt/ex.c
@@
-1,6
+1,8
@@
/* ex - Exception Handling */
/* ex - Exception Handling */
-/* Copyright (c) 2005-2010 The SimGrid team */
+/* Copyright (c) 2005-2014. The SimGrid Team.
+ * All rights reserved. */
+
/* Copyright (c) 2002-2004 Ralf S. Engelschall <rse@engelschall.com> */
/* Copyright (c) 2002-2004 The OSSP Project <http://www.ossp.org/> */
/* Copyright (c) 2002-2004 Cable & Wireless <http://www.cw.com/> */
/* Copyright (c) 2002-2004 Ralf S. Engelschall <rse@engelschall.com> */
/* Copyright (c) 2002-2004 The OSSP Project <http://www.ossp.org/> */
/* Copyright (c) 2002-2004 Cable & Wireless <http://www.cw.com/> */
@@
-46,11
+48,9
@@
#include "portable.h" /* execinfo when available */
#include "xbt/ex.h"
#include "xbt/str.h"
#include "portable.h" /* execinfo when available */
#include "xbt/ex.h"
#include "xbt/str.h"
-#include "xbt/
module.h" /* xbt_binary_name */
+#include "xbt/
synchro_core.h"
#include "xbt_modinter.h" /* backtrace initialization headers */
#include "xbt_modinter.h" /* backtrace initialization headers */
-#include "xbt/synchro.h" /* xbt_thread_self */
-#include "gras/Virtu/virtu_interface.h" /* gras_os_myname */
#include "xbt/ex_interface.h"
#undef HAVE_BACKTRACE
#include "xbt/ex_interface.h"
#undef HAVE_BACKTRACE
@@
-65,8
+65,10
@@
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_ex, xbt, "Exception mecanism");
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_ex, xbt, "Exception mecanism");
+XBT_EXPORT_NO_IMPORT(const xbt_running_ctx_t) __xbt_ex_ctx_initializer = XBT_RUNNING_CTX_INITIALIZER;
+
/* default __ex_ctx callback function */
/* default __ex_ctx callback function */
-
ex
_ctx_t *__xbt_ex_ctx_default(void)
+
xbt_running
_ctx_t *__xbt_ex_ctx_default(void)
{
/* Don't scream: this is a default which is never used (so, yes,
there is one setjump container by running entity).
{
/* Don't scream: this is a default which is never used (so, yes,
there is one setjump container by running entity).
@@
-75,10
+77,10
@@
ex_ctx_t *__xbt_ex_ctx_default(void)
real life and in simulation when using threads to implement the simulation
processes (ie, with pthreads and on windows).
real life and in simulation when using threads to implement the simulation
processes (ie, with pthreads and on windows).
- It also gets overriden in xbt/context.c when using ucontext
e
s (as well as
+ It also gets overriden in xbt/context.c when using ucontexts (as well as
in Java for now, but after the java overhaul, it will get cleaned out)
*/
in Java for now, but after the java overhaul, it will get cleaned out)
*/
- static
ex_ctx_t ctx = XBT
_CTX_INITIALIZER;
+ static
xbt_running_ctx_t ctx = XBT_RUNNING
_CTX_INITIALIZER;
return &ctx;
}
return &ctx;
}
@@
-98,17
+100,16
@@
void xbt_backtrace_display(xbt_ex_t * e)
fprintf(stderr, "Backtrace (displayed in thread %p):\n",
(void *) xbt_thread_self());
fprintf(stderr, "Backtrace (displayed in thread %p):\n",
(void *) xbt_thread_self());
- for (i = 1; i < e->used; i++) /* no need to display "xbt_
display_backtrace
" */
+ for (i = 1; i < e->used; i++) /* no need to display "xbt_
backtrace_display
" */
fprintf(stderr, "---> %s\n", e->bt_strings[i] + 4);
}
/* don't fool xbt_ex_free with uninitialized msg field */
e->msg = NULL;
fprintf(stderr, "---> %s\n", e->bt_strings[i] + 4);
}
/* don't fool xbt_ex_free with uninitialized msg field */
e->msg = NULL;
- e->remote = 0;
xbt_ex_free(*e);
#else
xbt_ex_free(*e);
#else
-
ERROR0
("No backtrace on this arch");
+
XBT_ERROR
("No backtrace on this arch");
#endif
}
#endif
}
@@
-133,35
+134,37
@@
void xbt_ex_display(xbt_ex_t * e)
{
char *thrower = NULL;
{
char *thrower = NULL;
- if (e->remote)
- thrower = bprintf(" on host %s(%d)", e->host, e->pid);
-
fprintf(stderr,
"** SimGrid: UNCAUGHT EXCEPTION received on %s(%d): category: %s; value: %d\n"
"** %s\n"
"** Thrown by %s()%s\n",
fprintf(stderr,
"** SimGrid: UNCAUGHT EXCEPTION received on %s(%d): category: %s; value: %d\n"
"** %s\n"
"** Thrown by %s()%s\n",
-
gras_os_myname(), (*xbt_getpid)
(),
+
xbt_binary_name, xbt_getpid
(),
xbt_ex_catname(e->category), e->value, e->msg,
e->procname, thrower ? thrower : " in this process");
xbt_ex_catname(e->category), e->value, e->msg,
e->procname, thrower ? thrower : " in this process");
- CRITICAL1("%s", e->msg);
+ XBT_CRITICAL("%s", e->msg);
+ xbt_free(thrower);
- if (!e->
remote && !e->
bt_strings)
+ if (!e->bt_strings)
xbt_ex_setup_backtrace(e);
#ifdef HAVE_BACKTRACE
xbt_ex_setup_backtrace(e);
#ifdef HAVE_BACKTRACE
- /* We have everything to build neat backtraces */
- {
+ if (e->used && e->bt_strings) {
+ /* We have everything to build neat backtraces */
int i;
fprintf(stderr, "\n");
for (i = 0; i < e->used; i++)
fprintf(stderr, "%s\n", e->bt_strings[i]);
int i;
fprintf(stderr, "\n");
for (i = 0; i < e->used; i++)
fprintf(stderr, "%s\n", e->bt_strings[i]);
- }
-#else
- fprintf(stderr, " at %s:%d:%s (no backtrace available on that arch)\n",
- e->file, e->line, e->func);
+ } else
#endif
#endif
+ {
+ fprintf(stderr,
+ "\n"
+ "** In %s() at %s:%d\n"
+ "** (no backtrace available)\n",
+ e->func, e->file, e->line);
+ }
}
}
@@
-169,12
+172,11
@@
void xbt_ex_display(xbt_ex_t * e)
void __xbt_ex_terminate_default(xbt_ex_t * e)
{
xbt_ex_display(e);
void __xbt_ex_terminate_default(xbt_ex_t * e)
{
xbt_ex_display(e);
-
- abort();
+ xbt_abort();
}
/* the externally visible API */
}
/* the externally visible API */
-XBT_EXPORT_NO_IMPORT(
ex_ctx_cb_t) __xbt_ex_ctx
= &__xbt_ex_ctx_default;
+XBT_EXPORT_NO_IMPORT(
xbt_running_ctx_fetcher_t) __xbt_running_ctx_fetch
= &__xbt_ex_ctx_default;
XBT_EXPORT_NO_IMPORT(ex_term_cb_t) __xbt_ex_terminate =
&__xbt_ex_terminate_default;
XBT_EXPORT_NO_IMPORT(ex_term_cb_t) __xbt_ex_terminate =
&__xbt_ex_terminate_default;
@@
-183,19
+185,12
@@
void xbt_ex_free(xbt_ex_t e)
{
int i;
{
int i;
- if (e.msg)
- free(e.msg);
- if (e.remote) {
- free(e.procname);
- free(e.file);
- free(e.func);
- free(e.host);
- }
+ free(e.msg);
if (e.bt_strings) {
for (i = 0; i < e.used; i++)
if (e.bt_strings) {
for (i = 0; i < e.used; i++)
- free(
(char *)
e.bt_strings[i]);
- free(
(char **)
e.bt_strings);
+ free(e.bt_strings[i]);
+ free(e.bt_strings);
}
/* memset(e,0,sizeof(xbt_ex_t)); */
}
}
/* memset(e,0,sizeof(xbt_ex_t)); */
}
@@
-205,24
+200,36
@@
const char *xbt_ex_catname(xbt_errcat_t cat)
{
switch (cat) {
case unknown_error:
{
switch (cat) {
case unknown_error:
- return "unknown
_er
r";
+ return "unknown
erro
r";
case arg_error:
case arg_error:
- return "invalid_arg";
+ return "invalid argument";
+ case bound_error:
+ return "out of bounds";
case mismatch_error:
return "mismatch";
case not_found_error:
return "not found";
case system_error:
case mismatch_error:
return "mismatch";
case not_found_error:
return "not found";
case system_error:
- return "system
_er
r";
+ return "system
erro
r";
case network_error:
case network_error:
- return "network
_er
r";
+ return "network
erro
r";
case timeout_error:
return "timeout";
case timeout_error:
return "timeout";
+ case cancel_error:
+ return "action canceled";
case thread_error:
case thread_error:
- return "thread_err";
- default:
- return "INVALID_ERR";
+ return "thread error";
+ case host_error:
+ return "host failed";
+ case tracing_error:
+ return "tracing error";
+ case io_error:
+ return "io error";
+ case vm_error:
+ return "vm error";
+
}
}
+ return "INVALID ERROR";
}
}
@@
-237,48
+244,48
@@
XBT_TEST_UNIT("controlflow", test_controlflow, "basic nested control flow")
xbt_ex_t ex;
volatile int n = 1;
xbt_ex_t ex;
volatile int n = 1;
- xbt_test_add
0
("basic nested control flow");
+ xbt_test_add("basic nested control flow");
TRY {
if (n != 1)
TRY {
if (n != 1)
- xbt_test_fail
1
("M1: n=%d (!= 1)", n);
+ xbt_test_fail("M1: n=%d (!= 1)", n);
n++;
TRY {
if (n != 2)
n++;
TRY {
if (n != 2)
- xbt_test_fail
1
("M2: n=%d (!= 2)", n);
+ xbt_test_fail("M2: n=%d (!= 2)", n);
n++;
n++;
- THROW
0
(unknown_error, 0, "something");
+ THROW
F
(unknown_error, 0, "something");
}
CATCH(ex) {
if (n != 3)
}
CATCH(ex) {
if (n != 3)
- xbt_test_fail
1
("M3: n=%d (!= 3)", n);
+ xbt_test_fail("M3: n=%d (!= 3)", n);
n++;
xbt_ex_free(ex);
}
n++;
TRY {
if (n != 5)
n++;
xbt_ex_free(ex);
}
n++;
TRY {
if (n != 5)
- xbt_test_fail
1
("M2: n=%d (!= 5)", n);
+ xbt_test_fail("M2: n=%d (!= 5)", n);
n++;
n++;
- THROW
0
(unknown_error, 0, "something");
+ THROW
F
(unknown_error, 0, "something");
}
}
- CATCH
(ex)
{
+ CATCH
_ANONYMOUS
{
if (n != 6)
if (n != 6)
- xbt_test_fail
1
("M3: n=%d (!= 6)", n);
+ xbt_test_fail("M3: n=%d (!= 6)", n);
n++;
RETHROW;
n++;
}
n++;
RETHROW;
n++;
}
- xbt_test_fail
1
("MX: n=%d (shouldn't reach this point)", n);
+ xbt_test_fail("MX: n=%d (shouldn't reach this point)", n);
}
CATCH(ex) {
if (n != 7)
}
CATCH(ex) {
if (n != 7)
- xbt_test_fail
1
("M4: n=%d (!= 7)", n);
+ xbt_test_fail("M4: n=%d (!= 7)", n);
n++;
xbt_ex_free(ex);
}
if (n != 8)
n++;
xbt_ex_free(ex);
}
if (n != 8)
- xbt_test_fail
1
("M5: n=%d (!= 8)", n);
+ xbt_test_fail("M5: n=%d (!= 8)", n);
}
XBT_TEST_UNIT("value", test_value, "exception value passing")
}
XBT_TEST_UNIT("value", test_value, "exception value passing")
@@
-286,16
+293,16
@@
XBT_TEST_UNIT("value", test_value, "exception value passing")
xbt_ex_t ex;
TRY {
xbt_ex_t ex;
TRY {
- THROW
0
(unknown_error, 2, "toto");
+ THROW
F
(unknown_error, 2, "toto");
}
CATCH(ex) {
}
CATCH(ex) {
- xbt_test_add
0
("exception value passing");
+ xbt_test_add("exception value passing");
if (ex.category != unknown_error)
if (ex.category != unknown_error)
- xbt_test_fail
1("category=%d (!= 1)",
ex.category);
+ xbt_test_fail
("category=%d (!= 1)", (int)
ex.category);
if (ex.value != 2)
if (ex.value != 2)
- xbt_test_fail
1
("value=%d (!= 2)", ex.value);
+ xbt_test_fail("value=%d (!= 2)", ex.value);
if (strcmp(ex.msg, "toto"))
if (strcmp(ex.msg, "toto"))
- xbt_test_fail
1
("message=%s (!= toto)", ex.msg);
+ xbt_test_fail("message=%s (!= toto)", ex.msg);
xbt_ex_free(ex);
}
}
xbt_ex_free(ex);
}
}
@@
-303,23
+310,26
@@
XBT_TEST_UNIT("value", test_value, "exception value passing")
XBT_TEST_UNIT("variables", test_variables, "variable value preservation")
{
xbt_ex_t ex;
XBT_TEST_UNIT("variables", test_variables, "variable value preservation")
{
xbt_ex_t ex;
- int r1, r2;
- volatile int v1, v2;
+ int r1;
+ int _XBT_GNUC_UNUSED r2;
+ int v1;
+ volatile int v2;
r1 = r2 = v1 = v2 = 1234;
TRY {
r2 = 5678;
v2 = 5678;
r1 = r2 = v1 = v2 = 1234;
TRY {
r2 = 5678;
v2 = 5678;
- THROW0(unknown_error, 0, "toto");
- } CATCH(ex) {
- xbt_test_add0("variable preservation");
+ THROWF(unknown_error, 0, "toto");
+ }
+ CATCH(ex) {
+ xbt_test_add("variable preservation");
if (r1 != 1234)
if (r1 != 1234)
- xbt_test_fail
1
("r1=%d (!= 1234)", r1);
+ xbt_test_fail("r1=%d (!= 1234)", r1);
if (v1 != 1234)
if (v1 != 1234)
- xbt_test_fail
1
("v1=%d (!= 1234)", v1);
+ xbt_test_fail("v1=%d (!= 1234)", v1);
/* r2 is allowed to be destroyed because not volatile */
if (v2 != 5678)
/* r2 is allowed to be destroyed because not volatile */
if (v2 != 5678)
- xbt_test_fail
1
("v2=%d (!= 5678)", v2);
+ xbt_test_fail("v2=%d (!= 5678)", v2);
xbt_ex_free(ex);
}
}
xbt_ex_free(ex);
}
}
@@
-330,27
+340,28
@@
XBT_TEST_UNIT("cleanup", test_cleanup, "cleanup handling")
volatile int v1;
int c;
volatile int v1;
int c;
- xbt_test_add
0
("cleanup handling");
+ xbt_test_add("cleanup handling");
v1 = 1234;
c = 0;
TRY {
v1 = 5678;
v1 = 1234;
c = 0;
TRY {
v1 = 5678;
- THROW0(1, 2, "blah");
- } TRY_CLEANUP {
+ THROWF(1, 2, "blah");
+ }
+ TRY_CLEANUP {
if (v1 != 5678)
if (v1 != 5678)
- xbt_test_fail
1
("v1 = %d (!= 5678)", v1);
+ xbt_test_fail("v1 = %d (!= 5678)", v1);
c = 1;
}
CATCH(ex) {
if (v1 != 5678)
c = 1;
}
CATCH(ex) {
if (v1 != 5678)
- xbt_test_fail
1
("v1 = %d (!= 5678)", v1);
+ xbt_test_fail("v1 = %d (!= 5678)", v1);
if (!(ex.category == 1 && ex.value == 2 && !strcmp(ex.msg, "blah")))
if (!(ex.category == 1 && ex.value == 2 && !strcmp(ex.msg, "blah")))
- xbt_test_fail
0
("unexpected exception contents");
+ xbt_test_fail("unexpected exception contents");
xbt_ex_free(ex);
}
if (!c)
xbt_ex_free(ex);
}
if (!c)
- xbt_test_fail
0
("xbt_ex_free not executed");
+ xbt_test_fail("xbt_ex_free not executed");
}
}
@@
-385,15
+396,13
@@
static void bad_example(void)
cp3 = mallocex(SMALLAMOUNT);
strcpy(cp1, "foo");
strcpy(cp2, "bar");
cp3 = mallocex(SMALLAMOUNT);
strcpy(cp1, "foo");
strcpy(cp2, "bar");
- } TRY_CLEANUP {
- if (cp3 != NULL)
- free(cp3);
- if (cp2 != NULL)
- free(cp2);
- if (cp1 != NULL)
- free(cp1);
}
}
- CATCH(ex) {
+ TRY_CLEANUP {
+ free(cp3);
+ free(cp2);
+ free(cp1);
+ }
+ CATCH_ANONYMOUS {
printf("cp3=%s", cp3);
RETHROW;
}
printf("cp3=%s", cp3);
RETHROW;
}
@@
-406,8
+415,7
@@
typedef struct {
static void good_example(void)
{
static void good_example(void)
{
- global_context_t *global_context = malloc(sizeof(global_context_t));
- xbt_ex_t ex;
+ global_context_t *global_context = xbt_malloc(sizeof(global_context_t));
/* GOOD_EXAMPLE */
{ /*01 */
/* GOOD_EXAMPLE */
{ /*01 */
@@
-422,15
+430,14
@@
static void good_example(void)
cp3 = mallocex(SMALLAMOUNT);
strcpy(cp1, "foo");
strcpy(cp2, "bar");
cp3 = mallocex(SMALLAMOUNT);
strcpy(cp1, "foo");
strcpy(cp2, "bar");
- } TRY_CLEANUP { /*04 */
+ }
+ TRY_CLEANUP { /*04 */
printf("cp3=%s", cp3 == NULL /*02 */ ? "" : cp3);
printf("cp3=%s", cp3 == NULL /*02 */ ? "" : cp3);
- if (cp3 != NULL)
- free(cp3);
- if (cp2 != NULL)
- free(cp2);
+ free(cp3);
+ free(cp2);
/*05 cp1 was given away */
}
/*05 cp1 was given away */
}
- CATCH
(ex)
{
+ CATCH
_ANONYMOUS
{
/*05 global context untouched */
RETHROW;
}
/*05 global context untouched */
RETHROW;
}