#include "portable.h"
#include "context_private.h"
-#include "xbt/error.h"
+#include "xbt/log.h"
#include "xbt/dynar.h"
#include "gras_config.h"
/* don't want to play with conditional compilation in automake tonight, sorry.
include directly the c file from here when needed. */
# include "context_win32.c"
+# define USE_WIN_CONTEXT
# endif
#endif
return NULL;
}
+/* callback: context fetching */
+static ex_ctx_t *__context_ex_ctx(void)
+{
+ return current_context->exception;
+}
+
+/* callback: termination */
+static void __context_ex_terminate(xbt_ex_t *e)
+{
+ exit(e->value);
+}
+
/** \name Functions
* \ingroup XBT_context
*/
{
if(!current_context) {
current_context = init_context = xbt_new0(s_xbt_context_t,1);
+ init_context->exception = xbt_new(ex_ctx_t,1);
+ XBT_CTX_INITIALIZE(init_context->exception);
+ __xbt_ex_ctx = __context_ex_ctx;
+ __xbt_ex_terminate = __context_ex_terminate;
context_to_destroy = xbt_swag_new(xbt_swag_offset(*current_context,hookup));
context_living = xbt_swag_new(xbt_swag_offset(*current_context,hookup));
xbt_swag_insert(init_context, context_living);
res->thread = xbt_new0(pthread_t,1);
xbt_assert0(!pthread_mutex_init(&(res->mutex), NULL), "Mutex initialization error");
xbt_assert0(!pthread_cond_init(&(res->cond), NULL), "Condition initialization error");
-#else
+#else
/* FIXME: strerror is not thread safe */
xbt_assert2(getcontext(&(res->uc))==0,"Error in context saving: %d (%s)", errno, strerror(errno));
res->uc.uc_link = NULL;
/* WARNING : when this context is over, the current_context (i.e. the
father), is awaken... Theorically, the wrapper should prevent using
this feature. */
+# ifndef USE_WIN_CONTEXT
res->uc.uc_stack.ss_sp = pth_skaddr_makecontext(res->stack,STACK_SIZE);
res->uc.uc_stack.ss_size = pth_sksize_makecontext(res->stack,STACK_SIZE);
-#endif
+# endif /* USE_WIN_CONTEXT */
+#endif /* USE_PTHREADS or not */
res->argc = argc;
res->argv = argv;
res->startup_func = startup_func;
res->startup_arg = startup_arg;
res->cleanup_func = cleanup_func;
res->cleanup_arg = cleanup_arg;
+ res->exception = xbt_new(ex_ctx_t,1);
+ XBT_CTX_INITIALIZE(res->exception);
xbt_swag_insert(res, context_living);
for(i=0;i<context->argc; i++)
if(context->argv[i]) free(context->argv[i]);
if(context->argv) free(context->argv);
+ if(context->exception) free(context->exception);
if(context->cleanup_func)
context->cleanup_func(context->cleanup_arg);