X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/11819220e15518f0aacff177da8655da0a9f9826..c3fa98ca7ce6d3cebc47f87e1e783a214b04b35f:/src/xbt/context.c diff --git a/src/xbt/context.c b/src/xbt/context.c index c732042694..56936cdcf8 100644 --- a/src/xbt/context.c +++ b/src/xbt/context.c @@ -33,8 +33,10 @@ static xbt_context_t current_context = NULL; static xbt_context_t init_context = NULL; static xbt_swag_t context_to_destroy = NULL; static xbt_swag_t context_living = NULL; +#ifdef CONTEXT_THREADS static xbt_mutex_t creation_mutex; static xbt_thcond_t creation_cond; +#endif static void __context_exit(xbt_context_t context ,int value); static void __xbt_context_yield(xbt_context_t context) @@ -46,15 +48,15 @@ static void __xbt_context_yield(xbt_context_t context) #ifdef CONTEXT_THREADS if (context){ xbt_context_t self = current_context; - DEBUG1("[%p] **** Locking ****", self); + 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); - DEBUG1("[%p] **** Going to jail ****", self); + DEBUG3("[%p] **** Going to jail on individual %p/%p ****", self,context->cond, context->mutex); xbt_thcond_wait(context->cond, context->mutex); - DEBUG1("[%p] **** Unlocking ****", self); + DEBUG2("[%p] **** Unlocking individual %p ****", self,context->mutex); xbt_mutex_unlock(context->mutex); DEBUG1("[%p] **** Updating current_context ****", self); current_context = self; @@ -160,13 +162,13 @@ static void __context_exit(xbt_context_t context ,int value) DEBUG0("Yielding"); #ifdef CONTEXT_THREADS - DEBUG1("[%p] **** Locking ****", context); + 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); - DEBUG1("[%p] **** Unlocking ****", context); + 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 @@ -178,23 +180,26 @@ static void __context_exit(xbt_context_t context ,int value) static void * __context_wrapper(void* c) { - xbt_context_t context = (xbt_context_t)c; + xbt_context_t context = (xbt_context_t) current_context; #ifdef CONTEXT_THREADS context->thread = xbt_thread_self(); - DEBUG2("**[%p:%p]** Lock ****",context,(void*)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); - DEBUG2("**[%p:%p]** Releasing the creator ****",context,(void*)xbt_thread_self()); + 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); - DEBUG2("**[%p:%p]** Going to Jail ****",context,(void*)xbt_thread_self()); - xbt_mutex_lock(context->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); - DEBUG2("**[%p:%p]** Unlocking ****",context,(void*)xbt_thread_self()); + DEBUG3("**[ctx:%p;self:%p]** Unlocking individual %p ****", + context,(void*)xbt_thread_self(),context->mutex); xbt_mutex_unlock(context->mutex); #endif @@ -279,16 +284,17 @@ void xbt_context_start(xbt_context_t context) { #ifdef CONTEXT_THREADS /* Launch the thread */ - DEBUG1("**[%p]** Locking ****",context); + DEBUG3("**[ctx:%p;self:%p]** Locking creation_mutex %p ****",context,xbt_thread_self(),creation_mutex); xbt_mutex_lock(creation_mutex); - DEBUG1("**[%p]** Thread create ****",context); + DEBUG2("**[ctx:%p;self:%p]** Thread create ****",context,xbt_thread_self()); context->thread = xbt_thread_create(__context_wrapper, context); - DEBUG2("**[%p]** Thread created : %p ****",context,context->thread); + DEBUG3("**[ctx:%p;self:%p]** Thread created : %p ****",context,xbt_thread_self(),context->thread); - DEBUG1("**[%p]** Going to jail ****",context); + DEBUG4("**[ctx:%p;self:%p]** Going to jail on creation_cond/mutex (%p,%p) ****", + context,xbt_thread_self(),creation_cond, creation_mutex); xbt_thcond_wait(creation_cond, creation_mutex); - DEBUG1("**[%p]** Unlocking ****",context); + DEBUG3("**[ctx:%p;self:%p]** Unlocking creation %p ****",context, xbt_thread_self(),creation_mutex); xbt_mutex_unlock(creation_mutex); #else makecontext (&(context->uc), (void (*) (void)) __context_wrapper,1, context); @@ -383,13 +389,14 @@ void xbt_context_exit(void) { xbt_context_kill(context); } } - // xbt_context_kill(init_context); + free(init_context->exception); + free(init_context); + init_context = current_context = NULL ; xbt_context_empty_trash(); xbt_swag_free(context_to_destroy); xbt_swag_free(context_living); - init_context = current_context = NULL ; #ifdef CONTEXT_THREADS xbt_mutex_destroy(creation_mutex); xbt_thcond_destroy(creation_cond);