From deff9ab3d0c1c5d17f215f440b88dde9cf983418 Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Sat, 5 Jan 2019 00:06:02 +0100 Subject: [PATCH] kill xbt_os_sem_t and the required cmake-detection cruft --- CMakeLists.txt | 75 +---------------------- ChangeLog | 4 +- src/xbt/xbt_os_thread.c | 90 ---------------------------- tools/cmake/DefinePackages.cmake | 2 - tools/cmake/src/internal_config.h.in | 2 - 5 files changed, 4 insertions(+), 169 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ce93b4aee7..27cca00c15 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -406,79 +406,8 @@ endif() #-------------------------------------------------------------------------------------------------- ### Initialize of CONTEXT THREADS -set(HAVE_THREAD_CONTEXTS 0) -if(CMAKE_USE_PTHREADS_INIT) - ### Test that we have a way to create semaphores - - set(HAVE_SEM_OPEN 0) - CHECK_LIBRARY_EXISTS(pthread sem_open "" HAVE_SEM_OPEN_LIB) - if(HAVE_SEM_OPEN_LIB) - try_run(semopen_retval semopen_compilable - ${CMAKE_BINARY_DIR} - ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_sem_open.c - LINK_LIBRARIES pthread - COMPILE_OUTPUT_VARIABLE semopen_compilmsg - RUN_OUTPUT_VARIABLE semopen_runmsg) - - if(semopen_compilable) - if(NOT semopen_retval) # error if not 0 - message(STATUS "sem_open is compilable and executable") - set(HAVE_SEM_OPEN 1) - else() - message(STATUS "Warning: sem_open seems compilable but not executable") - message(STATUS "Compilation output: ${semopen_compilmsg}") - message(STATUS "Execution output: ${semopen_runmsg}") - message(STATUS "Exit value: ${semopen_retval}") - endif() - else() - message(STATUS "Warning: sem_open not compilable") - message(STATUS "Compilation output: ${semopen_compilmsg}") - endif() - unset(semopen_compilable) - unset(semopen_retval) - unset(semopen_runmsg) - unset(semopen_compilmsg) - endif() - - set(HAVE_SEM_INIT 0) - if(NOT APPLE) # OS X El Capitan deprecates this function - CHECK_LIBRARY_EXISTS(pthread sem_init "" HAVE_SEM_INIT_LIB) - endif() - if(HAVE_SEM_INIT_LIB) - try_run(seminit_retval seminit_compilable - ${CMAKE_BINARY_DIR} - ${CMAKE_HOME_DIRECTORY}/tools/cmake/test_prog/prog_sem_init.c - LINK_LIBRARIES pthread - COMPILE_OUTPUT_VARIABLE seminit_compilmsg - RUN_OUTPUT_VARIABLE seminit_runmsg) - - if(seminit_compilable) - if(NOT seminit_retval) # error if not 0 - message(STATUS "sem_init is compilable and executable") - set(HAVE_SEM_INIT 1) - else() - message(STATUS "Warning: sem_init seems compilable but not executable") - message(STATUS "Compilation output: ${seminit_compilmsg}") - message(STATUS "Execution output: ${seminit_runmsg}") - message(STATUS "Exit value: ${seminit_retval}") - endif() - else() - message(STATUS "Warning: sem_init not compilable") - message(STATUS "Compilation output: ${seminit_compilmsg}") - endif() - unset(seminit_compilable) - unset(seminit_retval) - unset(seminit_runmsg) - unset(seminit_compilmsg) - endif() - - if(NOT HAVE_SEM_OPEN AND NOT HAVE_SEM_INIT) - message(FATAL_ERROR "Semaphores are not usable (failed to use both sem_open and sem_init), but they are mandatory to threads (you may need to mount /dev).") - endif() - - set(HAVE_THREAD_CONTEXTS 1) - message(STATUS "Support for thread context factory ok.") -endif() +set(HAVE_THREAD_CONTEXTS 1) +message(STATUS "Support for thread context factory ok.") set(HAVE_UCONTEXT_CONTEXTS 0) if(NOT HAVE_UCONTEXT_H) diff --git a/ChangeLog b/ChangeLog index e9981e095a..2a0cb75612 100644 --- a/ChangeLog +++ b/ChangeLog @@ -17,8 +17,8 @@ XBT: - Drop sg_cmdline. Please use xbt_cmdline instead. - Drop the C xbt_os_sem_t; Use the C++ xbt::OsSemaphore. OsSemaphore is implemented in a portable way with C++11 threads. - This should introduce a major scalability improvement to the thread - backend, from which Mac users and Java users will benefit for free. + This should allow much more threads to be created at the same time, + allowing Mac and Java users to simulate many more actors. Fixed bugs: - #261: Document the parameters of parallel execution's constructor diff --git a/src/xbt/xbt_os_thread.c b/src/xbt/xbt_os_thread.c index fdbbd81026..4361e4148e 100644 --- a/src/xbt/xbt_os_thread.c +++ b/src/xbt/xbt_os_thread.c @@ -43,12 +43,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_sync_os, xbt, "Synchronization mechanism (OS-level)"); -/* use named semaphore when sem_init() does not work */ -#if !HAVE_SEM_INIT -static int next_sem_ID = 0; -static xbt_os_mutex_t next_sem_ID_lock; -#endif - typedef struct xbt_os_thread_ { pthread_t t; char *name; @@ -97,10 +91,6 @@ void xbt_os_thread_mod_preinit(void) pthread_attr_init(&thread_attr); thread_mod_inited = 1; - -#if !HAVE_SEM_INIT - next_sem_ID_lock = xbt_os_mutex_init(); -#endif } void xbt_os_thread_mod_postexit(void) @@ -115,9 +105,6 @@ void xbt_os_thread_mod_postexit(void) free(main_thread); main_thread = NULL; thread_mod_inited = 0; -#if !HAVE_SEM_INIT - xbt_os_mutex_destroy(next_sem_ID_lock); -#endif } /** Calls pthread_atfork() if present, and raise an exception otherwise. @@ -288,83 +275,6 @@ void xbt_os_mutex_destroy(xbt_os_mutex_t mutex) free(mutex); } -typedef struct xbt_os_sem_ { -#if !HAVE_SEM_INIT - char *name; -#endif - sem_t s; - sem_t *ps; -} s_xbt_os_sem_t; - -#ifndef SEM_FAILED -#define SEM_FAILED (-1) -#endif - -xbt_os_sem_t xbt_os_sem_init(unsigned int value) -{ - xbt_os_sem_t res = xbt_new(s_xbt_os_sem_t, 1); - - /* On some systems (macOS), only the stub of sem_init is to be found. - * Any attempt to use it leads to ENOSYS (function not implemented). - * If such a prehistoric system is detected, do the job with sem_open instead - */ -#if HAVE_SEM_INIT - if (sem_init(&(res->s), 0, value) != 0) - THROWF(system_error, errno, "sem_init() failed: %s", strerror(errno)); - res->ps = &(res->s); - -#else /* damn, no sem_init(). Reimplement it */ - - xbt_os_mutex_acquire(next_sem_ID_lock); - res->name = bprintf("/sg-%d", ++next_sem_ID); - xbt_os_mutex_release(next_sem_ID_lock); - - sem_unlink(res->name); - res->ps = sem_open(res->name, O_CREAT, 0644, value); - if ((res->ps == (sem_t *) SEM_FAILED) && (errno == ENAMETOOLONG)) { - /* Old darwins only allow 13 chars. Did you create *that* amount of semaphores? */ - res->name[13] = '\0'; - sem_unlink(res->name); - res->ps = sem_open(res->name, O_CREAT, 0644, value); - } - 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 */ - if (sem_unlink(res->name) < 0) - THROWF(system_error, errno, "sem_unlink() failed: %s", - strerror(errno)); - -#endif - - return res; -} - -void xbt_os_sem_acquire(xbt_os_sem_t sem) -{ - if (sem_wait(sem->ps) < 0) - THROWF(system_error, errno, "sem_wait() failed: %s", strerror(errno)); -} - -void xbt_os_sem_release(xbt_os_sem_t sem) -{ - if (sem_post(sem->ps) < 0) - THROWF(system_error, errno, "sem_post() failed: %s", strerror(errno)); -} - -void xbt_os_sem_destroy(xbt_os_sem_t sem) -{ -#if HAVE_SEM_INIT - if (sem_destroy(sem->ps) < 0) - THROWF(system_error, errno, "sem_destroy() failed: %s", strerror(errno)); -#else - if (sem_close(sem->ps) < 0) - THROWF(system_error, errno, "sem_close() failed: %s", strerror(errno)); - xbt_free(sem->name); -#endif - xbt_free(sem); -} - void xbt_os_thread_set_extra_data(void *data) { xbt_os_thread_self()->extra_data = data; diff --git a/tools/cmake/DefinePackages.cmake b/tools/cmake/DefinePackages.cmake index 9ed5340770..b3bab2dd3d 100644 --- a/tools/cmake/DefinePackages.cmake +++ b/tools/cmake/DefinePackages.cmake @@ -1101,8 +1101,6 @@ set(CMAKE_SOURCE_FILES tools/cmake/src/internal_config.h.in tools/cmake/test_prog/prog_asan.cpp tools/cmake/test_prog/prog_makecontext.c - tools/cmake/test_prog/prog_sem_init.c - tools/cmake/test_prog/prog_sem_open.c tools/cmake/test_prog/prog_stackgrowth.c tools/cmake/test_prog/prog_stacksetup.c tools/cmake/cross-mingw.cmake diff --git a/tools/cmake/src/internal_config.h.in b/tools/cmake/src/internal_config.h.in index d3689a724e..97c598b090 100644 --- a/tools/cmake/src/internal_config.h.in +++ b/tools/cmake/src/internal_config.h.in @@ -89,8 +89,6 @@ #cmakedefine01 HAVE_MMAP /* Function mremap */ #cmakedefine01 HAVE_MREMAP -/* Function sem_init (part of XPG6 standard only) */ -#cmakedefine01 HAVE_SEM_INIT /* Function sysconf */ #cmakedefine01 HAVE_SYSCONF /* Function vasprintf */ -- 2.20.1