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)
#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;
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
#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
{
#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);
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);