X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f60c6c67576ca97e84d781811f9076c18f183b11..1e19722bba40db422336bb1330356a609b138ed0:/src/xbt/xbt_os_thread.c diff --git a/src/xbt/xbt_os_thread.c b/src/xbt/xbt_os_thread.c index c9dd6910b9..91db34bd79 100644 --- a/src/xbt/xbt_os_thread.c +++ b/src/xbt/xbt_os_thread.c @@ -2,12 +2,21 @@ /* 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 */ -/* 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 * under the terms of the license (GNU LGPL) which comes with this package. */ +#if defined(WIN32) +#elif defined(__MACH__) && defined(__APPLE__) +#include +#include +#include +#else +#include +#endif + #include "internal_config.h" #include "xbt/sysdep.h" #include "xbt/ex.h" @@ -21,18 +30,17 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_sync_os, xbt, "Synchronization mechanism (OS-level)"); /* ********************************* PTHREAD IMPLEMENTATION ************************************ */ -#ifdef HAVE_PTHREAD_H +#ifndef _XBT_WIN32 +#include #include #include -#ifdef HAVE_MUTEX_TIMEDLOCK -/* redefine the function header since we fail to get this from system headers on amd (at least) */ -int pthread_mutex_timedlock(pthread_mutex_t * mutex, - const struct timespec *abs_timeout); +#ifdef CORE_BINDING +#define _GNU_SOURCE +#include #endif - /* use named sempahore when sem_init() does not work */ #ifndef HAVE_SEM_INIT static int next_sem_ID = 0; @@ -103,7 +111,7 @@ void xbt_os_thread_mod_preinit(void) 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; @@ -193,6 +201,18 @@ xbt_os_thread_t xbt_os_thread_create(const char *name, } +#ifdef CORE_BINDING +int xbt_os_thread_bind(xbt_os_thread_t thread, int cpu){ + pthread_t pthread = thread->t; + int errcode = 0; + cpu_set_t cpuset; + CPU_ZERO(&cpuset); + CPU_SET(cpu, &cpuset); + errcode = pthread_setaffinity_np(pthread, sizeof(cpu_set_t), &cpuset); + return errcode; +} +#endif + void xbt_os_thread_setstacksize(int stack_size) { size_t alignment[] = { @@ -560,7 +580,7 @@ xbt_os_sem_t xbt_os_sem_init(unsigned int value) res->name[13] = '\0'; res->ps = sem_open(res->name, O_CREAT, 0644, value); } - if ((res->ps == (sem_t *) SEM_FAILED)) + if (res->ps == (sem_t *) SEM_FAILED) THROWF(system_error, errno, "sem_open() failed: %s", strerror(errno)); /* Remove the name from the semaphore namespace: we never join on it */ @@ -709,6 +729,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) @@ -1239,7 +1269,7 @@ int xbt_os_get_numcores(void) { SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); return sysinfo.dwNumberOfProcessors; -#elif MACOS +#elif defined(__APPLE__) && defined(__MACH__) int nm[2]; size_t len = 4; uint32_t count;