+static void __context_exit(xbt_context_t context ,int value)
+{
+ int i;
+ DEBUG0("Freeing arguments");
+ for(i=0;i<context->argc; i++)
+ if(context->argv[i]) free(context->argv[i]);
+ if(context->argv) free(context->argv);
+
+ if(context->cleanup_func) {
+ DEBUG0("Calling cleanup function");
+ context->cleanup_func(context->cleanup_arg);
+ }
+
+ DEBUG0("Putting context in the to_destroy set");
+ xbt_swag_remove(context, context_living);
+ xbt_swag_insert(context, context_to_destroy);
+ DEBUG0("Context put in the to_destroy set");
+
+ DEBUG0("Yielding");
+#ifdef USE_PTHREADS
+ DEBUG0("**** Locking ****");
+ pthread_mutex_lock(&(context->mutex));
+ DEBUG0("**** Updating current_context ****");
+ current_context = context;
+ DEBUG0("**** Releasing the prisonner ****");
+ pthread_cond_signal(&(context->cond));
+ DEBUG0("**** Unlocking ****");
+ pthread_mutex_unlock(&(context->mutex));
+ DEBUG0("**** Exiting ****");
+ pthread_exit(0);
+#else
+ __xbt_context_yield(context);
+#endif
+ xbt_assert0(0,"You can't be here!");
+}
+
+static void *__context_wrapper(void *c)
+{
+ xbt_context_t context = c;
+
+#ifdef USE_PTHREADS
+ DEBUG2("**[%p:%p]** Lock ****",context,(void*)pthread_self());
+ pthread_mutex_lock(&(context->mutex));
+ DEBUG2("**[%p:%p]** Releasing the prisonner ****",context,(void*)pthread_self());
+ pthread_cond_signal(&(context->cond));
+ DEBUG2("**[%p:%p]** Going to Jail ****",context,(void*)pthread_self());
+ pthread_cond_wait(&(context->cond), &(context->mutex));
+ DEBUG2("**[%p:%p]** Unlocking ****",context,(void*)pthread_self());
+ pthread_mutex_unlock(&(context->mutex));
+#endif
+
+ if(context->startup_func)
+ context->startup_func(context->startup_arg);
+
+ DEBUG0("Calling the main function");
+
+ __context_exit(context, (context->code) (context->argc,context->argv));
+ 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)
+{
+ __context_exit(current_context, e->value);
+}
+
+/** \name Functions
+ * \ingroup XBT_context
+ */
+/* @{ */
+/** Context module initialization
+ *
+ * \warning It has to be called before using any other function of this module.
+ */