+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!");
+}
+