+#else /* use SUSv2 contexts */
+ VOIRP(current_context);
+ if (current_context)
+ VOIRP(current_context->save);
+
+ VOIRP(context);
+
+ if (context)
+ VOIRP(context->save);
+
+ if (context) {
+
+ int return_value = 0;
+
+ if (context->save == NULL) {
+
+ DEBUG1("[%p] **** Yielding to somebody else ****", current_context);
+ DEBUG2("Saving current_context value (%p) to context(%p)->save",
+ current_context, context);
+ context->save = current_context;
+ DEBUG1("current_context becomes context(%p) ", context);
+ current_context = context;
+ DEBUG1
+ ("Current position memorized (context->save). Jumping to context (%p)",
+ context);
+ return_value = swapcontext(&(context->save->uc), &(context->uc));
+ xbt_assert0((return_value == 0), "Context swapping failure");
+ DEBUG1("I am (%p). Coming back\n", context);
+ } else {
+ xbt_context_t old_context = context->save;
+ DEBUG1("[%p] **** Back ! ****", context);
+ DEBUG2("Setting current_context (%p) to context(%p)->save",
+ current_context, context);
+ current_context = context->save;
+ DEBUG1("Setting context(%p)->save to NULL", context);
+ context->save = NULL;
+ DEBUG2("Current position memorized (%p). Jumping to context (%p)",
+ context, old_context);
+ return_value = swapcontext(&(context->uc), &(old_context->uc));
+ xbt_assert0((return_value == 0), "Context swapping failure");
+ DEBUG1("I am (%p). Coming back\n", context);
+
+ }
+ }
+#endif
+ if (current_context->iwannadie)
+ __context_exit(current_context, 1);
+
+ return;
+}
+
+static void xbt_context_free(xbt_context_t context)
+{
+ if (!context)
+ return;
+ DEBUG1("Freeing %p", context);
+#ifdef CONTEXT_THREADS
+ /*DEBUG1("\t joining %p",(void *)context->thread->t); */
+ DEBUG1("\t joining %p", (void *) context->thread);
+
+ xbt_os_thread_join(context->thread, NULL);
+
+ DEBUG1("\t mutex_destroy %p", (void *) context->mutex);
+ xbt_os_mutex_destroy(context->mutex);
+ DEBUG1("\t cond_destroy %p", (void *) context->cond);
+ xbt_os_cond_destroy(context->cond);
+
+ context->thread = NULL;
+ context->mutex = NULL;
+ context->cond = NULL;
+#endif
+
+ if (context->exception)
+ free(context->exception);
+
+ free(context);
+ return;