+ int return_value = 0;
+
+ xbt_assert0(current_context,"You have to call context_init() first.");
+
+ DEBUG2("--------- current_context (%p) is yielding to context(%p) ---------",
+ current_context,context);
+
+#ifdef USE_PTHREADS
+ if (context) {
+ xbt_context_t self = current_context;
+ pthread_mutex_lock(&(context->mutex));
+ current_context = context;
+ pthread_cond_signal(&(context->cond));
+ pthread_cond_wait(&(context->cond), &(context->mutex));
+ pthread_mutex_unlock(&(context->mutex));
+ current_context = self;
+ }
+#else
+ if(current_context)
+ VOIRP(current_context->save);
+
+ VOIRP(context);
+ if(context) VOIRP(context->save);
+ if (context) {
+ if(context->save==NULL) {
+ DEBUG0("**** Yielding to somebody else ****");
+ 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 ;
+ DEBUG0("**** Back ! ****");
+ 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);
+ }