X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/e1ef5a6b6a94ddc9d70d61451ad064e367132def..2c8c164d58104acb6256b6d8efd476a6a2165b8a:/src/xbt/xbt_os_thread.c diff --git a/src/xbt/xbt_os_thread.c b/src/xbt/xbt_os_thread.c index c3c588fdd2..78c47333eb 100644 --- a/src/xbt/xbt_os_thread.c +++ b/src/xbt/xbt_os_thread.c @@ -1,8 +1,8 @@ /* xbt_os_thread -- portability layer over the pthread API */ /* Used in RL to get win/lin portability, and in SG when CONTEXT_THREAD */ -/* in SG, when using CONTEXT_UCONTEXT, xbt_os_thread_stub is used instead */ +/* in SG, when using HAVE_UCONTEXT_CONTEXTS, xbt_os_thread_stub is used instead */ -/* Copyright (c) 2007-2014. The SimGrid Team. +/* Copyright (c) 2007-2015. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -17,14 +17,14 @@ #include #endif -#include "internal_config.h" +#include "src/internal_config.h" #include "xbt/sysdep.h" #include "xbt/ex.h" -#include "xbt/ex_interface.h" /* We play crude games with exceptions */ -#include "portable.h" +#include "src/xbt/ex_interface.h" /* We play crude games with exceptions */ +#include "src/portable.h" #include "xbt/xbt_os_time.h" /* Portable time facilities */ #include "xbt/xbt_os_thread.h" /* This module */ -#include "xbt_modinter.h" /* Initialization/finalization of this module */ +#include "src/xbt_modinter.h" /* Initialization/finalization of this module */ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_sync_os, xbt, "Synchronization mechanism (OS-level)"); @@ -103,15 +103,18 @@ void xbt_os_thread_mod_preinit(void) "pthread_key_create failed for xbt_self_thread_key"); main_thread = xbt_new(s_xbt_os_thread_t, 1); + main_thread->name = NULL; + main_thread->detached = 0; main_thread->name = (char *) "main"; - main_thread->start_routine = NULL; main_thread->param = NULL; + main_thread->start_routine = NULL; main_thread->running_ctx = xbt_new(xbt_running_ctx_t, 1); + main_thread->extra_data = NULL; XBT_RUNNING_CTX_INITIALIZE(main_thread->running_ctx); if ((errcode = pthread_setspecific(xbt_self_thread_key, main_thread))) THROWF(system_error, errcode, - "pthread_setspecific failed for xbt_self_thread_key"); + "Impossible to set the SimGrid identity descriptor to the main thread (pthread_setspecific failed)"); __xbt_running_ctx_fetch = _os_thread_get_running_ctx; __xbt_ex_terminate = _os_thread_ex_terminate; @@ -291,14 +294,10 @@ void xbt_os_thread_exit(int *retval) xbt_os_thread_t xbt_os_thread_self(void) { - xbt_os_thread_t res; - if (!thread_mod_inited) return NULL; - res = pthread_getspecific(xbt_self_thread_key); - - return res; + return pthread_getspecific(xbt_self_thread_key); } void xbt_os_thread_key_create(xbt_os_thread_key_t* key) { @@ -729,6 +728,16 @@ static unsigned long xbt_self_thread_key; void xbt_os_thread_mod_preinit(void) { xbt_self_thread_key = TlsAlloc(); + + xbt_os_thread_t main_thread = xbt_new0(s_xbt_os_thread_t, 1); + main_thread->name = (char *) "main"; + main_thread->start_routine = NULL; + main_thread->param = NULL; + + if (!TlsSetValue(xbt_self_thread_key, main_thread)) + THROWF(system_error, (int)GetLastError(), + "Impossible to set the SimGrid identity descriptor to the main thread (TlsSetValue() failed)"); + } void xbt_os_thread_mod_postexit(void) @@ -1293,8 +1302,11 @@ void xbt_os_thread_set_extra_data(void *data) void *xbt_os_thread_get_extra_data(void) { - xbt_os_thread_t self = xbt_os_thread_self(); - return self? self->extra_data : NULL; + xbt_os_thread_t thread = xbt_os_thread_self(); + if (thread) + return xbt_os_thread_self()->extra_data; + else + return NULL; } xbt_os_rmutex_t xbt_os_rmutex_init(void)