- DEBUG2("--------- current_context (%p) is yielding to context(%p) ---------",current_context,context);
-
- #ifdef CONTEXT_THREADS
- if (context){
- xbt_context_t self = current_context;
- DEBUG2("[%p] **** Locking ctx %p ****", self, context);
- xbt_mutex_lock(context->mutex);
- DEBUG1("[%p] **** Updating current_context ****", self);
- current_context = context;
- DEBUG1("[%p] **** Releasing the prisonner ****", self);
- xbt_thcond_signal(context->cond);
- DEBUG3("[%p] **** Going to jail on individual %p/%p ****", self,context->cond, context->mutex);
- xbt_thcond_wait(context->cond, context->mutex);
- DEBUG2("[%p] **** Unlocking individual %p ****", self,context->mutex);
- xbt_mutex_unlock(context->mutex);
- DEBUG1("[%p] **** Updating current_context ****", self);
- current_context = self;
- }
- #else /* use SUSv2 contexts */
- 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);
- /*pthread_join(context->thread->t,NULL);*/
- xbt_thread_join(context->thread,NULL);
- DEBUG1("\t xbt_free %p",(void *)context->thread);
- xbt_free(context->thread);
- DEBUG1("\t mutex_destroy %p",(void *)context->mutex);
- xbt_mutex_destroy(context->mutex);
- DEBUG1("\t cond_destroy %p",(void *)context->cond);
- xbt_thcond_destroy(context->cond);
-
- context->thread = NULL;
- context->mutex = NULL;
- context->cond = NULL;
-#endif
-
- if(context->exception)
- free(context->exception);
-
- free(context);
- return;
-}
-
-static void __context_exit(xbt_context_t context ,int value)
-{
- int i;
-
- DEBUG1("--------- %p is exiting ---------",context);
-
- DEBUG0("Calling cleanup functions");
- if(context->cleanup_func){
- DEBUG0("Calling cleanup function");
- context->cleanup_func(context->cleanup_arg);
- }
-
- DEBUG0("Freeing arguments");
- for(i=0;i<context->argc; i++)
- if(context->argv[i])
- free(context->argv[i]);
-
- if(context->argv)
- free(context->argv);
-
- 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 CONTEXT_THREADS
- DEBUG2("[%p] **** Locking %p ****", context, context->mutex);
- xbt_mutex_lock(context->mutex);
-/* DEBUG1("[%p] **** Updating current_context ****"); */
-/* current_context = context; */
- DEBUG1("[%p] **** Releasing the prisonner ****", context);
- xbt_thcond_signal(context->cond);
- DEBUG2("[%p] **** Unlocking individual %p ****", context, context->mutex);
- xbt_mutex_unlock(context->mutex);
- DEBUG1("[%p] **** Exiting ****", context);
- xbt_thread_exit(NULL); // We should provide return value in case other wants it
- #else
- __xbt_context_yield(context);
- #endif
- xbt_assert0(0,"You can't be here!");
-}
-
-static void *
-__context_wrapper(void* c) {
- xbt_context_t context = current_context;
-
- #ifdef CONTEXT_THREADS
- context = (xbt_context_t)c;
- context->thread = xbt_thread_self();
-
- DEBUG3("**[ctx:%p;self:%p]** Lock creation_mutex %p ****",context,(void*)xbt_thread_self(), creation_mutex);
- xbt_mutex_lock(creation_mutex);
- xbt_mutex_lock(context->mutex);
-
- DEBUG4("**[ctx:%p;self:%p]** Releasing the creator (creation_cond %p,%p) ****",
- context,(void*)xbt_thread_self(),creation_cond,creation_mutex);
- xbt_thcond_signal(creation_cond);
- xbt_mutex_unlock(creation_mutex);
-
- DEBUG4("**[ctx:%p;self:%p]** Going to Jail on lock %p and cond %p ****",
- context,(void*)xbt_thread_self(),context->mutex,context->cond);
- xbt_thcond_wait(context->cond, context->mutex);
-
- DEBUG3("**[ctx:%p;self:%p]** Unlocking individual %p ****",
- context,(void*)xbt_thread_self(),context->mutex);
- xbt_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;