#include "context_private.h"
#include "xbt/log.h"
#include "xbt/dynar.h"
-#include "xbt/xbt_thread.h"
-/*#include <pthread.h>*/ /* I need pthread_join that is not yet available in xbt_thread.*/
+#include "xbt/xbt_os_thread.h"
#ifdef CONTEXT_THREADS
/* This file (context.c) is only loaded in libsimgrid, not libgras.
- * xbt_thread is only loaded in libgras explicitly, and we need it in
+ * xbt_os_thread is only loaded in libgras explicitly, and we need it in
* libsimgrid, but only when it is the backend used to implement the
* xbt_context. So, do load it on need.
*/
-#include "xbt/xbt_thread.c"
+#include "xbt/xbt_os_thread.c"
+#else
+/* if not, load stubs so that all symbols get resolved anyway */
+#include "xbt/xbt_os_thread_stubs.c"
#endif
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_ctx, xbt, "Context");
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;
+static xbt_os_mutex_t creation_mutex;
+static xbt_os_cond_t creation_cond;
#endif
static void __context_exit(xbt_context_t context ,int value);
#ifdef CONTEXT_THREADS
if (context){
xbt_context_t self = current_context;
- DEBUG1("[%p] **** Locking ****", self);
- xbt_mutex_lock(context->mutex);
+ DEBUG2("[%p] **** Locking ctx %p ****", self, context);
+ xbt_os_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);
- xbt_thcond_wait(context->cond, context->mutex);
- DEBUG1("[%p] **** Unlocking ****", self);
- xbt_mutex_unlock(context->mutex);
+ xbt_os_cond_signal(context->cond);
+ DEBUG3("[%p] **** Going to jail on individual %p/%p ****", self,context->cond, context->mutex);
+ xbt_os_cond_wait(context->cond, context->mutex);
+ DEBUG2("[%p] **** Unlocking individual %p ****", self,context->mutex);
+ xbt_os_mutex_unlock(context->mutex);
DEBUG1("[%p] **** Updating current_context ****", self);
current_context = self;
}
#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);
+
+ xbt_os_thread_join(context->thread,NULL);
+
DEBUG1("\t mutex_destroy %p",(void *)context->mutex);
- xbt_mutex_destroy(context->mutex);
+ xbt_os_mutex_destroy(context->mutex);
DEBUG1("\t cond_destroy %p",(void *)context->cond);
- xbt_thcond_destroy(context->cond);
+ xbt_os_cond_destroy(context->cond);
context->thread = NULL;
context->mutex = NULL;
DEBUG0("Yielding");
#ifdef CONTEXT_THREADS
- DEBUG1("[%p] **** Locking ****", context);
- xbt_mutex_lock(context->mutex);
+ DEBUG2("[%p] **** Locking %p ****", context, context->mutex);
+ xbt_os_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);
- xbt_mutex_unlock(context->mutex);
+ xbt_os_cond_signal(context->cond);
+ DEBUG2("[%p] **** Unlocking individual %p ****", context, context->mutex);
+ xbt_os_mutex_unlock(context->mutex);
DEBUG1("[%p] **** Exiting ****", context);
- xbt_thread_exit(NULL); // We should provide return value in case other wants it
+ xbt_os_thread_exit(NULL); // We should provide return value in case other wants it
#else
__xbt_context_yield(context);
#endif
static void *
__context_wrapper(void* c) {
- xbt_context_t context = (xbt_context_t)c;
+ xbt_context_t context = current_context;
#ifdef CONTEXT_THREADS
- context->thread = xbt_thread_self();
+ context = (xbt_context_t)c;
+ context->thread = xbt_os_thread_self();
- DEBUG2("**[%p:%p]** Lock ****",context,(void*)xbt_thread_self());
- xbt_mutex_lock(creation_mutex);
+ DEBUG3("**[ctx:%p;self:%p]** Lock creation_mutex %p ****",context,(void*)xbt_os_thread_self(), creation_mutex);
+ xbt_os_mutex_lock(creation_mutex);
+ xbt_os_mutex_lock(context->mutex);
- DEBUG2("**[%p:%p]** Releasing the creator ****",context,(void*)xbt_thread_self());
- xbt_thcond_signal(creation_cond);
- xbt_mutex_unlock(creation_mutex);
+ DEBUG4("**[ctx:%p;self:%p]** Releasing the creator (creation_cond %p,%p) ****",
+ context,(void*)xbt_os_thread_self(),creation_cond,creation_mutex);
+ xbt_os_cond_signal(creation_cond);
+ xbt_os_mutex_unlock(creation_mutex);
- DEBUG2("**[%p:%p]** Going to Jail ****",context,(void*)xbt_thread_self());
- xbt_mutex_lock(context->mutex);
- xbt_thcond_wait(context->cond, context->mutex);
+ DEBUG4("**[ctx:%p;self:%p]** Going to Jail on lock %p and cond %p ****",
+ context,(void*)xbt_os_thread_self(),context->mutex,context->cond);
+ xbt_os_cond_wait(context->cond, context->mutex);
- DEBUG2("**[%p:%p]** Unlocking ****",context,(void*)xbt_thread_self());
- xbt_mutex_unlock(context->mutex);
+ DEBUG3("**[ctx:%p;self:%p]** Unlocking individual %p ****",
+ context,(void*)xbt_os_thread_self(),context->mutex);
+ xbt_os_mutex_unlock(context->mutex);
#endif
context_living = xbt_swag_new(xbt_swag_offset(*current_context,hookup));
xbt_swag_insert(init_context, context_living);
#ifdef CONTEXT_THREADS
- creation_mutex = xbt_mutex_init();
- creation_cond = xbt_thcond_init();
+ creation_mutex = xbt_os_mutex_init();
+ creation_cond = xbt_os_cond_init();
#endif
}
}
{
#ifdef CONTEXT_THREADS
/* Launch the thread */
- DEBUG1("**[%p]** Locking ****",context);
- xbt_mutex_lock(creation_mutex);
+ DEBUG3("**[ctx:%p;self:%p]** Locking creation_mutex %p ****",context,xbt_os_thread_self(),creation_mutex);
+ xbt_os_mutex_lock(creation_mutex);
- DEBUG1("**[%p]** Thread create ****",context);
- context->thread = xbt_thread_create(__context_wrapper, context);
- DEBUG2("**[%p]** Thread created : %p ****",context,context->thread);
+ DEBUG2("**[ctx:%p;self:%p]** Thread create ****",context,xbt_os_thread_self());
+ context->thread = xbt_os_thread_create(__context_wrapper, context);
+ DEBUG3("**[ctx:%p;self:%p]** Thread created : %p ****",context,xbt_os_thread_self(),context->thread);
- DEBUG1("**[%p]** Going to jail ****",context);
- xbt_thcond_wait(creation_cond, creation_mutex);
- DEBUG1("**[%p]** Unlocking ****",context);
- xbt_mutex_unlock(creation_mutex);
+ DEBUG4("**[ctx:%p;self:%p]** Going to jail on creation_cond/mutex (%p,%p) ****",
+ context,xbt_os_thread_self(),creation_cond, creation_mutex);
+ xbt_os_cond_wait(creation_cond, creation_mutex);
+ DEBUG3("**[ctx:%p;self:%p]** Unlocking creation %p ****",context, xbt_os_thread_self(),creation_mutex);
+ xbt_os_mutex_unlock(creation_mutex);
#else
makecontext (&(context->uc), (void (*) (void)) __context_wrapper,1, context);
#endif
* \param argc first argument of function \a code
* \param argv seconde argument of function \a code
*/
-xbt_context_t xbt_context_new(xbt_context_function_t code,
+xbt_context_t xbt_context_new(xbt_main_func_t code,
void_f_pvoid_t startup_func, void *startup_arg,
void_f_pvoid_t cleanup_func, void *cleanup_arg,
int argc, char *argv[])
res->code = code;
#ifdef CONTEXT_THREADS
- res->mutex = xbt_mutex_init();
- res->cond = xbt_thcond_init();
+ res->mutex = xbt_os_mutex_init();
+ res->cond = xbt_os_cond_init();
#else
xbt_assert2(getcontext(&(res->uc))==0,"Error in context saving: %d (%s)", errno, strerror(errno));
xbt_swag_free(context_living);
#ifdef CONTEXT_THREADS
- xbt_mutex_destroy(creation_mutex);
- xbt_thcond_destroy(creation_cond);
+ xbt_os_mutex_destroy(creation_mutex);
+ xbt_os_cond_destroy(creation_cond);
#endif
}
return;
}
/* @} */
+
+/* Stub of the stuff to interact with JAVA threads; not used in native lib */
+void xbt_context_set_jprocess(xbt_context_t context, void *jp) {}
+void* xbt_context_get_jprocess(xbt_context_t context) { return NULL; }
+
+void xbt_context_set_jmutex(xbt_context_t context,void *jm) {}
+void* xbt_context_get_jmutex(xbt_context_t context) { return NULL; }
+
+void xbt_context_set_jcond(xbt_context_t context,void *jc) {}
+void* xbt_context_get_jcond(xbt_context_t context) { return NULL; }
+
+void xbt_context_set_jenv(xbt_context_t context,void* je) {}
+void* xbt_context_get_jenv(xbt_context_t context) { return NULL; }