diff --git a/.github/workflows/ccpp.yml b/.github/workflows/ccpp.yml index 24e3bcc..2ad6b86 100644 --- a/.github/workflows/ccpp.yml +++ b/.github/workflows/ccpp.yml @@ -1,34 +1,92 @@ -name: Build +name: CI -on: [push, pull_request] +on: + push: + pull_request: jobs: - windows: - name: Build (${{ matrix.os }} - ${{ matrix.type }}) - runs-on: ${{ matrix.os }} + + msvc: + name: msvc-${{ matrix.variant }}-${{ matrix.link }} + runs-on: windows-latest strategy: + fail-fast: false matrix: - os: [windows-2022, windows-2019] - type: [Debug, Release] - exception: [No-Exceptions, C++-Exceptions, structured-Exceptions] + variant: [C, SE, CE] + link: [static, shared] + + steps: + - uses: actions/checkout@v4 + - uses: microsoft/setup-msbuild@v1 + + - name: Configure + run: > + cmake -S . -B build + -G "Visual Studio 17 2022" + -DPTHREADS4W_BUILD_${{ matrix.variant }}=ON + -DPTHREADS4W_BUILD_SHARED=${{ matrix.link == 'shared' && 'ON' || 'OFF' }} + + - name: Build + run: cmake --build build --config Release + + - name: Test + run: ctest --test-dir build -C Release --output-on-failure + + msys: + name: msys-${{ matrix.sys }} + runs-on: ${{ matrix.os || 'windows-latest' }} + + strategy: fail-fast: false + matrix: + sys: [mingw32, mingw64, ucrt64, clang64, clangarm64] + include: + - sys: clangarm64 + os: windows-11-arm + + defaults: + run: + shell: msys2 {0} steps: - - uses: actions/checkout@v2 - - - if: matrix.exception == 'No-Exceptions' - name: Configure - run: cmake -S . -B build - - if: matrix.exception == 'C++-Exceptions' - name: Configure - run: cmake -S . -B build -DPTHREADS4W_BUILD_C=FALSE -DPTHREADS4W_BUILD_CE=TRUE - - if: matrix.exception == 'structured-Exceptions' - name: Configure - run: cmake -S . -B build -DPTHREADS4W_BUILD_C=FALSE -DPTHREADS4W_BUILD_SE=TRUE - - name: Build ${{ matrix.type }} - run: cmake --build build --config ${{ matrix.type }} - - name: Test ${{ matrix.type }} + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup MSYS2 + uses: msys2/setup-msys2@v2 + with: + msystem: ${{ matrix.sys }} + update: true + install: >- + make + pacboy: >- + toolchain:p + cmake:p + + - name: Configure + if: matrix.sys != 'clang64' && matrix.sys != 'clangarm64' run: | - cd build - ctest -C ${{ matrix.type }} + cmake -G "Unix Makefiles" \ + -S . \ + -B build \ + -DCMAKE_VERBOSE_MAKEFILE=ON \ + -DCMAKE_BUILD_TYPE=Release + + - name: Configure clang + if: matrix.sys == 'clang64' || matrix.sys == 'clangarm64' + run: | + CC=clang CXX=clang++ \ + cmake -G "Unix Makefiles" \ + -S . \ + -B build \ + -DCMAKE_VERBOSE_MAKEFILE=ON \ + -DCMAKE_BUILD_TYPE=Release + + - name: Build + run: cmake --build build + + - name: Test + run: ctest --output-on-failure --test-dir build diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ad2ac9..2ef7e6a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,459 +1,225 @@ cmake_minimum_required (VERSION 3.11) project (PTHREADS4W - VERSION 3.0.3.0 - LANGUAGES C -) + VERSION 3.0.3.0 + LANGUAGES C CXX) include (GNUInstallDirs) set (CMAKE_DEBUG_POSTFIX d) -if (EXISTS "${CMAKE_SOURCE_DIR}/.git") - set (DEFAULT_BUILD_TYPE "Debug") -endif() - -if (MSVC) - set (COMPILER_INDICATOR "V") -else() - set (COMPILER_INDICATOR "G") -endif() - -# Set the possible values of build type for cmake-gui -if (CMAKE_CONFIGURATION_TYPES) - set (CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE - STRING "Semicolon separated list of supported configuration types, only supports debug and release, anything else will be ignored" FORCE - ) - - set_property (CACHE CMAKE_CONFIGURATION_TYPES PROPERTY STRINGS - "Debug" "Release" - ) -endif() - if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - message (STATUS "Setting build type to '${DEFAULT_BUILD_TYPE}' as none was specified.") + message (STATUS "Setting build type to Release as none was specified.") - set (CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE - STRING "Choose the type of build." FORCE - ) + set (CMAKE_BUILD_TYPE "Release") endif() -option (BUILD_TESTING "Run Tests after compile" ON) +option (PTHREADS4W_BUILD_ALL "Build all 3 flavours of the libs" OFF) option (PTHREADS4W_BUILD_C "Build lib with no exceptions - uses setjmp/longjmp" ON) option (PTHREADS4W_BUILD_CE "Build lib with C++ Error Handling" OFF) option (PTHREADS4W_BUILD_SE "Build lib with structured Error Handling" OFF) -option (PTHREADS4W_BUILD_ALL "Build all 3 flavours of the libs" OFF) +option (PTHREADS4W_BUILD_SHARED "Build shared libs" ON) +option (PTHREADS4W_BUILD_STATIC "Build static libs" ON) +option (PTHREADS4W_BUILD_TESTING "Run Tests after compile" ON) if (PTHREADS4W_BUILD_ALL) - set (PTHREADS4W_BUILD_C TRUE) - set (PTHREADS4W_BUILD_CE TRUE) - set (PTHREADS4W_BUILD_SE TRUE) + set (PTHREADS4W_BUILD_C TRUE) + set (PTHREADS4W_BUILD_CE TRUE) + set (PTHREADS4W_BUILD_SE TRUE) endif() -set (PTHREAD_SOURCES - cleanup.c - create.c - dll.c - errno.c - global.c - pthread_attr_destroy.c - pthread_attr_getaffinity_np.c - pthread_attr_getdetachstate.c - pthread_attr_getinheritsched.c - pthread_attr_getname_np.c - pthread_attr_getschedparam.c - pthread_attr_getschedpolicy.c - pthread_attr_getscope.c - pthread_attr_getstackaddr.c - pthread_attr_getstacksize.c - pthread_attr_init.c - pthread_attr_setaffinity_np.c - pthread_attr_setdetachstate.c - pthread_attr_setinheritsched.c - pthread_attr_setname_np.c - pthread_attr_setschedparam.c - pthread_attr_setschedpolicy.c - pthread_attr_setscope.c - pthread_attr_setstackaddr.c - pthread_attr_setstacksize.c - pthread_barrier_destroy.c - pthread_barrier_init.c - pthread_barrier_wait.c - pthread_barrierattr_destroy.c - pthread_barrierattr_getpshared.c - pthread_barrierattr_init.c - pthread_barrierattr_setpshared.c - pthread_cancel.c - pthread_cond_destroy.c - pthread_cond_init.c - pthread_cond_signal.c - pthread_cond_wait.c - pthread_condattr_destroy.c - pthread_condattr_getpshared.c - pthread_condattr_init.c - pthread_condattr_setpshared.c - pthread_delay_np.c - pthread_detach.c - pthread_equal.c - pthread_exit.c - pthread_getconcurrency.c - pthread_getname_np.c - pthread_getschedparam.c - pthread_getspecific.c - pthread_getunique_np.c - pthread_getw32threadhandle_np.c - pthread_join.c - pthread_key_create.c - pthread_key_delete.c - pthread_kill.c - pthread_mutex_consistent.c - pthread_mutex_destroy.c - pthread_mutex_init.c - pthread_mutex_lock.c - pthread_mutex_timedlock.c - pthread_mutex_trylock.c - pthread_mutex_unlock.c - pthread_mutexattr_destroy.c - pthread_mutexattr_getkind_np.c - pthread_mutexattr_getpshared.c - pthread_mutexattr_getrobust.c - pthread_mutexattr_gettype.c - pthread_mutexattr_init.c - pthread_mutexattr_setkind_np.c - pthread_mutexattr_setpshared.c - pthread_mutexattr_setrobust.c - pthread_mutexattr_settype.c - pthread_num_processors_np.c - pthread_once.c - pthread_rwlock_destroy.c - pthread_rwlock_init.c - pthread_rwlock_rdlock.c - pthread_rwlock_timedrdlock.c - pthread_rwlock_timedwrlock.c - pthread_rwlock_tryrdlock.c - pthread_rwlock_trywrlock.c - pthread_rwlock_unlock.c - pthread_rwlock_wrlock.c - pthread_rwlockattr_destroy.c - pthread_rwlockattr_getpshared.c - pthread_rwlockattr_init.c - pthread_rwlockattr_setpshared.c - pthread_self.c - pthread_setaffinity.c - pthread_setcancelstate.c - pthread_setcanceltype.c - pthread_setconcurrency.c - pthread_setname_np.c - pthread_setschedparam.c - pthread_setspecific.c - pthread_spin_destroy.c - pthread_spin_init.c - pthread_spin_lock.c - pthread_spin_trylock.c - pthread_spin_unlock.c - pthread_testcancel.c - pthread_timechange_handler_np.c - pthread_timedjoin_np.c - pthread_tryjoin_np.c - pthread_win32_attach_detach_np.c - ptw32_calloc.c - ptw32_callUserDestroyRoutines.c - ptw32_cond_check_need_init.c - ptw32_getprocessors.c - ptw32_is_attr.c - ptw32_MCS_lock.c - ptw32_mutex_check_need_init.c - ptw32_new.c - ptw32_processInitialize.c - ptw32_processTerminate.c - ptw32_relmillisecs.c - ptw32_reuse.c - ptw32_rwlock_cancelwrwait.c - ptw32_rwlock_check_need_init.c - ptw32_semwait.c - ptw32_spinlock_check_need_init.c - ptw32_threadDestroy.c - ptw32_threadStart.c - ptw32_throw.c - ptw32_timespec.c - ptw32_tkAssocCreate.c - ptw32_tkAssocDestroy.c - sched_get_priority_max.c - sched_get_priority_min.c - sched_getscheduler.c - sched_setaffinity.c - sched_setscheduler.c - sched_yield.c - sem_close.c - sem_destroy.c - sem_getvalue.c - sem_init.c - sem_open.c - sem_post_multiple.c - sem_post.c - sem_timedwait.c - sem_trywait.c - sem_unlink.c - sem_wait.c - w32_CancelableWait.c -) - -set (PTHREAD_HEADERS - _ptw32.h - pthread.h - sched.h -) - -if (PTHREADS4W_BUILD_C) - add_library (pthread${COMPILER_INDICATOR}C SHARED - ${PTHREAD_SOURCES} - ) - - add_library (Threads::Threads ALIAS pthread${COMPILER_INDICATOR}C) - add_library (Threads::Shared ALIAS pthread${COMPILER_INDICATOR}C) - - target_include_directories (pthread${COMPILER_INDICATOR}C - INTERFACE $ - PUBLIC $ - ) - - set_target_properties (pthread${COMPILER_INDICATOR}C PROPERTIES - OUTPUT_NAME pthreadV${COMPILER_INDICATOR}${PTHREADS4W_VERSION_MAJOR} - EXPORT_NAME Threads::Threads - VERSION ${PTHREADS4W_VERSION} - SOVERSION ${PTHREADS4W_VERSION_MAJOR} - PUBLIC_HEADER "${PTHREAD_HEADERS}" - ) - - target_compile_definitions (pthread${COMPILER_INDICATOR}C - PUBLIC CLEANUP=__PTW32_CLEANUP_C - PRIVATE __PTW32_BUILD_INLINED - PRIVATE HAVE_CONFIG_H - ) - - install (TARGETS pthread${COMPILER_INDICATOR}C - DESTINATION ${CMAKE_INSTALL_LIBDIR} - COMPONENT Runtime - EXPORT PTHREADS4W - LIBRARY - DESTINATION ${CMAKE_INSTALL_LIBDIR} - PUBLIC_HEADER - COMPONENT Development - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pthread - ) - - add_library (pthread${COMPILER_INDICATOR}C-static STATIC - ${PTHREAD_SOURCES} - ) - - add_library (Threads::Static ALIAS pthread${COMPILER_INDICATOR}C-static) - - target_include_directories (pthread${COMPILER_INDICATOR}C-static - INTERFACE $ - PUBLIC $ - ) - - set_target_properties (pthread${COMPILER_INDICATOR}C-static PROPERTIES - OUTPUT_NAME libpthread${COMPILER_INDICATOR}C${PTHREADS4W_VERSION_MAJOR} - EXPORT_NAME Threads::Static - VERSION ${PTHREADS4W_VERSION} - SOVERSION ${PTHREADS4W_VERSION_MAJOR} - PUBLIC_HEADER "${PTHREAD_HEADERS}" - ) - - target_compile_definitions (pthread${COMPILER_INDICATOR}C-static - PUBLIC CLEANUP=__PTW32_CLEANUP_C - PRIVATE __PTW32_BUILD_INLINED - PRIVATE __PTW32_STATIC_LIB - PRIVATE HAVE_CONFIG_H - ) - - install (TARGETS pthread${COMPILER_INDICATOR}C-static - COMPONENT Development - DESTINATION ${CMAKE_INSTALL_LIBDIR} - EXPORT PTHREADS4W - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pthread - ) +if(PTHREADS4W_BUILD_CE AND NOT MSVC) + message(FATAL_ERROR "Native pthreads conflicts with this and breaks everything.") endif() -if (PTHREADS4W_BUILD_CE) - add_library (pthread${COMPILER_INDICATOR}CE SHARED - ${PTHREAD_SOURCES} - ) - - add_library (Threads::CEShared ALIAS pthread${COMPILER_INDICATOR}CE) - - target_include_directories (pthread${COMPILER_INDICATOR}CE - INTERFACE $ - PUBLIC $ - ) - - set_target_properties (pthread${COMPILER_INDICATOR}CE PROPERTIES - OUTPUT_NAME pthread${COMPILER_INDICATOR}CE${PTHREADS4W_VERSION_MAJOR} - EXPORT_NAME Threads::CEShared - VERSION ${PTHREADS4W_VERSION} - SOVERSION ${PTHREADS4W_VERSION_MAJOR} - PUBLIC_HEADER "${PTHREAD_HEADERS}" - ) - - target_compile_definitions (pthread${COMPILER_INDICATOR}CE - PUBLIC CLEANUP=__PTW32_CLEANUP_CXX - PRIVATE __PTW32_BUILD_INLINED - PRIVATE HAVE_CONFIG_H - ) - - target_compile_options (pthread${COMPILER_INDICATOR}CE - PRIVATE "/EHs" - PRIVATE "/TP" - ) - - install (TARGETS pthread${COMPILER_INDICATOR}CE - DESTINATION ${CMAKE_INSTALL_LIBDIR} - COMPONENT Runtime - EXPORT PTHREADS4W - LIBRARY - DESTINATION ${CMAKE_INSTALL_LIBDIR} - PUBLIC_HEADER - COMPONENT Development - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pthread - ) - - add_library (pthread${COMPILER_INDICATOR}CE-static STATIC - ${PTHREAD_SOURCES} - ) - - add_library (Threads::CEStatic ALIAS pthread${COMPILER_INDICATOR}CE-static) - - target_include_directories (pthread${COMPILER_INDICATOR}CE-static - INTERFACE $ - PUBLIC $ - ) - - set_target_properties (pthread${COMPILER_INDICATOR}CE-static PROPERTIES - OUTPUT_NAME libpthreadVCE${PTHREADS4W_VERSION_MAJOR} - EXPORT_NAME Threads::CEStatic - VERSION ${PTHREADS4W_VERSION} - SOVERSION ${PTHREADS4W_VERSION_MAJOR} - PUBLIC_HEADER "${PTHREAD_HEADERS}" - ) - - target_compile_definitions (pthread${COMPILER_INDICATOR}CE-static - PUBLIC CLEANUP=__PTW32_CLEANUP_CXX - PRIVATE __PTW32_BUILD_INLINED - PRIVATE __PTW32_STATIC_LIB - PRIVATE HAVE_CONFIG_H - ) - - target_compile_options (pthread${COMPILER_INDICATOR}CE-static - PRIVATE "/EHs" - PRIVATE "/TP" - ) - install (TARGETS pthread${COMPILER_INDICATOR}CE-static - COMPONENT Development - DESTINATION ${CMAKE_INSTALL_LIBDIR} - EXPORT PTHREADS4W - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pthread - ) +if(PTHREADS4W_BUILD_SE AND NOT MSVC) + message(FATAL_ERROR "SEH is only on MSVC fully supported") endif() -if (PTHREADS4W_BUILD_SE) - add_library (pthread${COMPILER_INDICATOR}SE SHARED - ${PTHREAD_SOURCES} - ) - - add_library (Threads::SEShared ALIAS pthread${COMPILER_INDICATOR}SE) - - target_include_directories (pthreadVSE - INTERFACE $ - PUBLIC $ - ) - - set_target_properties (pthread${COMPILER_INDICATOR}SE PROPERTIES - OUTPUT_NAME pthreadVSE${PTHREADS4W_VERSION_MAJOR} - EXPORT_NAME Threads::SEShared - VERSION ${PTHREADS4W_VERSION} - SOVERSION ${PTHREADS4W_VERSION_MAJOR} - PUBLIC_HEADER "${PTHREAD_HEADERS}" - ) - - target_compile_definitions (pthread${COMPILER_INDICATOR}SE - PUBLIC CLEANUP=__PTW32_CLEANUP_SEH - PRIVATE __PTW32_BUILD_INLINED - PRIVATE HAVE_CONFIG_H - ) - - install (TARGETS pthread${COMPILER_INDICATOR}SE - DESTINATION ${CMAKE_INSTALL_LIBDIR} - COMPONENT Runtime - EXPORT PTHREADS4W - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - PUBLIC_HEADER - COMPONENT Development - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pthread - ) - - add_library (pthread${COMPILER_INDICATOR}SE-static STATIC - ${PTHREAD_SOURCES} - ) - - add_library (Threads::SEStatic ALIAS pthread${COMPILER_INDICATOR}SE-static) +set (PTHREAD_SOURCES + ${PTHREADS4W_SOURCE_DIR}/cleanup.c + ${PTHREADS4W_SOURCE_DIR}/create.c + ${PTHREADS4W_SOURCE_DIR}/dll.c + ${PTHREADS4W_SOURCE_DIR}/errno.c + ${PTHREADS4W_SOURCE_DIR}/global.c + ${PTHREADS4W_SOURCE_DIR}/pthread_attr_destroy.c + ${PTHREADS4W_SOURCE_DIR}/pthread_attr_getaffinity_np.c + ${PTHREADS4W_SOURCE_DIR}/pthread_attr_getdetachstate.c + ${PTHREADS4W_SOURCE_DIR}/pthread_attr_getinheritsched.c + ${PTHREADS4W_SOURCE_DIR}/pthread_attr_getname_np.c + ${PTHREADS4W_SOURCE_DIR}/pthread_attr_getschedparam.c + ${PTHREADS4W_SOURCE_DIR}/pthread_attr_getschedpolicy.c + ${PTHREADS4W_SOURCE_DIR}/pthread_attr_getscope.c + ${PTHREADS4W_SOURCE_DIR}/pthread_attr_getstackaddr.c + ${PTHREADS4W_SOURCE_DIR}/pthread_attr_getstacksize.c + ${PTHREADS4W_SOURCE_DIR}/pthread_attr_init.c + ${PTHREADS4W_SOURCE_DIR}/pthread_attr_setaffinity_np.c + ${PTHREADS4W_SOURCE_DIR}/pthread_attr_setdetachstate.c + ${PTHREADS4W_SOURCE_DIR}/pthread_attr_setinheritsched.c + ${PTHREADS4W_SOURCE_DIR}/pthread_attr_setname_np.c + ${PTHREADS4W_SOURCE_DIR}/pthread_attr_setschedparam.c + ${PTHREADS4W_SOURCE_DIR}/pthread_attr_setschedpolicy.c + ${PTHREADS4W_SOURCE_DIR}/pthread_attr_setscope.c + ${PTHREADS4W_SOURCE_DIR}/pthread_attr_setstackaddr.c + ${PTHREADS4W_SOURCE_DIR}/pthread_attr_setstacksize.c + ${PTHREADS4W_SOURCE_DIR}/pthread_barrier_destroy.c + ${PTHREADS4W_SOURCE_DIR}/pthread_barrier_init.c + ${PTHREADS4W_SOURCE_DIR}/pthread_barrier_wait.c + ${PTHREADS4W_SOURCE_DIR}/pthread_barrierattr_destroy.c + ${PTHREADS4W_SOURCE_DIR}/pthread_barrierattr_getpshared.c + ${PTHREADS4W_SOURCE_DIR}/pthread_barrierattr_init.c + ${PTHREADS4W_SOURCE_DIR}/pthread_barrierattr_setpshared.c + ${PTHREADS4W_SOURCE_DIR}/pthread_cancel.c + ${PTHREADS4W_SOURCE_DIR}/pthread_cond_destroy.c + ${PTHREADS4W_SOURCE_DIR}/pthread_cond_init.c + ${PTHREADS4W_SOURCE_DIR}/pthread_cond_signal.c + ${PTHREADS4W_SOURCE_DIR}/pthread_cond_wait.c + ${PTHREADS4W_SOURCE_DIR}/pthread_condattr_destroy.c + ${PTHREADS4W_SOURCE_DIR}/pthread_condattr_getpshared.c + ${PTHREADS4W_SOURCE_DIR}/pthread_condattr_init.c + ${PTHREADS4W_SOURCE_DIR}/pthread_condattr_setpshared.c + ${PTHREADS4W_SOURCE_DIR}/pthread_delay_np.c + ${PTHREADS4W_SOURCE_DIR}/pthread_detach.c + ${PTHREADS4W_SOURCE_DIR}/pthread_equal.c + ${PTHREADS4W_SOURCE_DIR}/pthread_exit.c + ${PTHREADS4W_SOURCE_DIR}/pthread_getconcurrency.c + ${PTHREADS4W_SOURCE_DIR}/pthread_getname_np.c + ${PTHREADS4W_SOURCE_DIR}/pthread_getschedparam.c + ${PTHREADS4W_SOURCE_DIR}/pthread_getspecific.c + ${PTHREADS4W_SOURCE_DIR}/pthread_getunique_np.c + ${PTHREADS4W_SOURCE_DIR}/pthread_getw32threadhandle_np.c + ${PTHREADS4W_SOURCE_DIR}/pthread_join.c + ${PTHREADS4W_SOURCE_DIR}/pthread_key_create.c + ${PTHREADS4W_SOURCE_DIR}/pthread_key_delete.c + ${PTHREADS4W_SOURCE_DIR}/pthread_kill.c + ${PTHREADS4W_SOURCE_DIR}/pthread_mutex_consistent.c + ${PTHREADS4W_SOURCE_DIR}/pthread_mutex_destroy.c + ${PTHREADS4W_SOURCE_DIR}/pthread_mutex_init.c + ${PTHREADS4W_SOURCE_DIR}/pthread_mutex_lock.c + ${PTHREADS4W_SOURCE_DIR}/pthread_mutex_timedlock.c + ${PTHREADS4W_SOURCE_DIR}/pthread_mutex_trylock.c + ${PTHREADS4W_SOURCE_DIR}/pthread_mutex_unlock.c + ${PTHREADS4W_SOURCE_DIR}/pthread_mutexattr_destroy.c + ${PTHREADS4W_SOURCE_DIR}/pthread_mutexattr_getkind_np.c + ${PTHREADS4W_SOURCE_DIR}/pthread_mutexattr_getpshared.c + ${PTHREADS4W_SOURCE_DIR}/pthread_mutexattr_getrobust.c + ${PTHREADS4W_SOURCE_DIR}/pthread_mutexattr_gettype.c + ${PTHREADS4W_SOURCE_DIR}/pthread_mutexattr_init.c + ${PTHREADS4W_SOURCE_DIR}/pthread_mutexattr_setkind_np.c + ${PTHREADS4W_SOURCE_DIR}/pthread_mutexattr_setpshared.c + ${PTHREADS4W_SOURCE_DIR}/pthread_mutexattr_setrobust.c + ${PTHREADS4W_SOURCE_DIR}/pthread_mutexattr_settype.c + ${PTHREADS4W_SOURCE_DIR}/pthread_num_processors_np.c + ${PTHREADS4W_SOURCE_DIR}/pthread_once.c + ${PTHREADS4W_SOURCE_DIR}/pthread_rwlock_destroy.c + ${PTHREADS4W_SOURCE_DIR}/pthread_rwlock_init.c + ${PTHREADS4W_SOURCE_DIR}/pthread_rwlock_rdlock.c + ${PTHREADS4W_SOURCE_DIR}/pthread_rwlock_timedrdlock.c + ${PTHREADS4W_SOURCE_DIR}/pthread_rwlock_timedwrlock.c + ${PTHREADS4W_SOURCE_DIR}/pthread_rwlock_tryrdlock.c + ${PTHREADS4W_SOURCE_DIR}/pthread_rwlock_trywrlock.c + ${PTHREADS4W_SOURCE_DIR}/pthread_rwlock_unlock.c + ${PTHREADS4W_SOURCE_DIR}/pthread_rwlock_wrlock.c + ${PTHREADS4W_SOURCE_DIR}/pthread_rwlockattr_destroy.c + ${PTHREADS4W_SOURCE_DIR}/pthread_rwlockattr_getpshared.c + ${PTHREADS4W_SOURCE_DIR}/pthread_rwlockattr_init.c + ${PTHREADS4W_SOURCE_DIR}/pthread_rwlockattr_setpshared.c + ${PTHREADS4W_SOURCE_DIR}/pthread_self.c + ${PTHREADS4W_SOURCE_DIR}/pthread_setaffinity.c + ${PTHREADS4W_SOURCE_DIR}/pthread_setcancelstate.c + ${PTHREADS4W_SOURCE_DIR}/pthread_setcanceltype.c + ${PTHREADS4W_SOURCE_DIR}/pthread_setconcurrency.c + ${PTHREADS4W_SOURCE_DIR}/pthread_setname_np.c + ${PTHREADS4W_SOURCE_DIR}/pthread_setschedparam.c + ${PTHREADS4W_SOURCE_DIR}/pthread_setspecific.c + ${PTHREADS4W_SOURCE_DIR}/pthread_spin_destroy.c + ${PTHREADS4W_SOURCE_DIR}/pthread_spin_init.c + ${PTHREADS4W_SOURCE_DIR}/pthread_spin_lock.c + ${PTHREADS4W_SOURCE_DIR}/pthread_spin_trylock.c + ${PTHREADS4W_SOURCE_DIR}/pthread_spin_unlock.c + ${PTHREADS4W_SOURCE_DIR}/pthread_testcancel.c + ${PTHREADS4W_SOURCE_DIR}/pthread_timechange_handler_np.c + ${PTHREADS4W_SOURCE_DIR}/pthread_timedjoin_np.c + ${PTHREADS4W_SOURCE_DIR}/pthread_tryjoin_np.c + ${PTHREADS4W_SOURCE_DIR}/pthread_win32_attach_detach_np.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_calloc.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_callUserDestroyRoutines.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_cond_check_need_init.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_getprocessors.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_is_attr.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_MCS_lock.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_mutex_check_need_init.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_new.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_processInitialize.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_processTerminate.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_relmillisecs.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_reuse.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_rwlock_cancelwrwait.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_rwlock_check_need_init.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_semwait.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_spinlock_check_need_init.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_threadDestroy.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_threadStart.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_throw.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_timespec.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_tkAssocCreate.c + ${PTHREADS4W_SOURCE_DIR}/ptw32_tkAssocDestroy.c + ${PTHREADS4W_SOURCE_DIR}/sched_get_priority_max.c + ${PTHREADS4W_SOURCE_DIR}/sched_get_priority_min.c + ${PTHREADS4W_SOURCE_DIR}/sched_getscheduler.c + ${PTHREADS4W_SOURCE_DIR}/sched_setaffinity.c + ${PTHREADS4W_SOURCE_DIR}/sched_setscheduler.c + ${PTHREADS4W_SOURCE_DIR}/sched_yield.c + ${PTHREADS4W_SOURCE_DIR}/sem_close.c + ${PTHREADS4W_SOURCE_DIR}/sem_destroy.c + ${PTHREADS4W_SOURCE_DIR}/sem_getvalue.c + ${PTHREADS4W_SOURCE_DIR}/sem_init.c + ${PTHREADS4W_SOURCE_DIR}/sem_open.c + ${PTHREADS4W_SOURCE_DIR}/sem_post_multiple.c + ${PTHREADS4W_SOURCE_DIR}/sem_post.c + ${PTHREADS4W_SOURCE_DIR}/sem_timedwait.c + ${PTHREADS4W_SOURCE_DIR}/sem_trywait.c + ${PTHREADS4W_SOURCE_DIR}/sem_unlink.c + ${PTHREADS4W_SOURCE_DIR}/sem_wait.c + ${PTHREADS4W_SOURCE_DIR}/w32_CancelableWait.c) - target_include_directories (pthread${COMPILER_INDICATOR}SE-static - INTERFACE $ - PUBLIC $ - ) +set (PTHREAD_HEADERS + ${PTHREADS4W_SOURCE_DIR}/_ptw32.h + ${PTHREADS4W_SOURCE_DIR}/pthread.h + ${PTHREADS4W_SOURCE_DIR}/sched.h) - set_target_properties (pthread${COMPILER_INDICATOR}SE-static PROPERTIES - OUTPUT_NAME libpthreadVSE${PTHREADS4W_VERSION_MAJOR} - EXPORT_NAME Threads::SEStatic - VERSION ${PTHREADS4W_VERSION} - SOVERSION ${PTHREADS4W_VERSION_MAJOR} - PUBLIC_HEADER "${PTHREAD_HEADERS}" - ) +include(CheckIncludeFile) +check_include_file(stdint.h HAVE_STDINT_H) - target_compile_definitions (pthread${COMPILER_INDICATOR}SE-static - PUBLIC CLEANUP=__PTW32_CLEANUP_SEH - PRIVATE __PTW32_BUILD_INLINED - PRIVATE __PTW32_STATIC_LIB - PRIVATE HAVE_CONFIG_H - ) +if(PTHREADS4W_BUILD_C OR PTHREADS4W_BUILD_SE) + add_subdirectory(c-se/) +endif() - install (TARGETS pthread${COMPILER_INDICATOR}SE-static - COMPONENT Development - DESTINATION ${CMAKE_INSTALL_LIBDIR} - EXPORT PTHREADS4W - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pthread - ) +if(PTHREADS4W_BUILD_CE) + add_subdirectory(ce/) endif() include (CMakePackageConfigHelpers) configure_package_config_file ( - PTHREADS.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/PTHREADS4WConfig.cmake - INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ -) + PTHREADS.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/PTHREADS4WConfig.cmake + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/) WRITE_BASIC_PACKAGE_VERSION_FILE (PTHREADS4WConfigVersion.cmake - VERSION ${PTHREADS4W_VERSION} - COMPATIBILITY SameMajorVersion -) + VERSION ${PTHREADS4W_VERSION} + COMPATIBILITY SameMajorVersion) install (EXPORT PTHREADS4W - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake -) + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/PTHREADS4W) install (FILES - ${CMAKE_CURRENT_BINARY_DIR}/PTHREADS4WConfig.cmake - ${CMAKE_CURRENT_BINARY_DIR}/PTHREADS4WConfigVersion.cmake - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ -) + ${CMAKE_CURRENT_BINARY_DIR}/PTHREADS4WConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/PTHREADS4WConfigVersion.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/PTHREADS4W) -if (BUILD_TESTING) - enable_testing() - add_subdirectory (tests) +if (PTHREADS4W_BUILD_TESTING) + enable_testing() + add_subdirectory (tests) endif() -set (CPACK_RESOURCE_FILE_LICENSE ${PROJECT_SOURCE_DIR}/LICENSE) +set (CPACK_RESOURCE_FILE_LICENSE ${PTHREADS4W_SOURCE_DIR}/LICENSE) include (CPack) diff --git a/PTHREADS.cmake.in b/PTHREADS.cmake.in index 6403dae..c67c0be 100644 --- a/PTHREADS.cmake.in +++ b/PTHREADS.cmake.in @@ -1,5 +1,72 @@ @PACKAGE_INIT@ -INCLUDE (${CMAKE_CURRENT_LIST_DIR}/PTHREADS4W.cmake) -INCLUDE (CMakeFindDependencyMacro) -ADD_LIBRARY (Threads::Shared ALIAS Threads::Threads) +set(_pthreads4w_available_components) + +if(@PTHREADS4W_BUILD_C@) + if(@PTHREADS4W_BUILD_SHARED@) + list(APPEND _pthreads4w_available_components Shared) + endif() + + if(@PTHREADS4W_BUILD_STATIC@) + list(APPEND _pthreads4w_available_components Static) + endif() +endif() + +if(@PTHREADS4W_BUILD_CE@) + if(@PTHREADS4W_BUILD_SHARED@) + list(APPEND _pthreads4w_available_components CEShared) + endif() + + if(@PTHREADS4W_BUILD_STATIC@) + list(APPEND _pthreads4w_available_components CEStatic) + endif() +endif() + +if(@PTHREADS4W_BUILD_SE@) + if(@PTHREADS4W_BUILD_SHARED@) + list(APPEND _pthreads4w_available_components SEShared) + endif() + + if(@PTHREADS4W_BUILD_STATIC@) + list(APPEND _pthreads4w_available_components SEStatic) + endif() +endif() + +if(PTHREADS4W_FIND_COMPONENTS) + set(_valid_components + Shared + Static + CEShared + CEStatic + SEShared + SEStatic) + + foreach(comp IN LISTS PTHREADS4W_FIND_COMPONENTS) + if(NOT comp IN_LIST _valid_components) + set(PTHREADS4W_FOUND FALSE) + set(PTHREADS4W_NOT_FOUND_MESSAGE + "Unknown component: ${comp}") + return() + endif() + endforeach() +endif() + +include(${CMAKE_CURRENT_LIST_DIR}/PTHREADS4W.cmake) + +if(NOT PTHREADS4W_FIND_COMPONENTS) + set(PTHREADS4W_FOUND TRUE) +else() + foreach(comp IN LISTS PTHREADS4W_FIND_COMPONENTS) + list(FIND _pthreads4w_available_components "${comp}" _idx) + + if(_idx EQUAL -1) + set(PTHREADS4W_FOUND FALSE) + set(PTHREADS4W_NOT_FOUND_MESSAGE + "Component ${comp} is not available in this build") + endif() + endforeach() +endif() + +if(TARGET Threads::Shared) + add_library(Threads::Threads ALIAS Threads::Shared) +endif() \ No newline at end of file diff --git a/c-se/CMakeLists.txt b/c-se/CMakeLists.txt new file mode 100644 index 0000000..94cd6a2 --- /dev/null +++ b/c-se/CMakeLists.txt @@ -0,0 +1,159 @@ +cmake_minimum_required (VERSION 3.11) + +project (PTHREADS4W_C_SE + VERSION 3.0.3.0 + LANGUAGES C) + +if (PTHREADS4W_BUILD_C) + if(PTHREADS4W_BUILD_SHARED) + add_library (pthreadC SHARED + ${PTHREAD_SOURCES} + ${PTHREAD_HEADERS}) + + add_library (Threads::Threads ALIAS pthreadC) + add_library (Threads::Shared ALIAS pthreadC) + + target_include_directories (pthreadC + INTERFACE $ + PUBLIC $) + + set_target_properties (pthreadC + PROPERTIES + OUTPUT_NAME pthreadC${PTHREADS4W_VERSION_MAJOR} + EXPORT_NAME Threads::Shared + VERSION ${PTHREADS4W_VERSION} + SOVERSION ${PTHREADS4W_VERSION_MAJOR} + PUBLIC_HEADER "${PTHREAD_HEADERS}") + + target_compile_definitions (pthreadC + PUBLIC + CLEANUP=__PTW32_CLEANUP_C + $<$:HAVE_STDINT_H=1> + PRIVATE + HAVE_CONFIG_H + $<$:__PTW32_BUILD_INLINED>) + + install (TARGETS pthreadC + DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT Runtime + EXPORT PTHREADS4W + LIBRARY + DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER + COMPONENT Development + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pthread) + endif(PTHREADS4W_BUILD_SHARED) + + if(PTHREADS4W_BUILD_STATIC) + add_library (pthreadC-static STATIC + ${PTHREAD_SOURCES} + ${PTHREAD_HEADERS}) + + add_library (Threads::Static ALIAS pthreadC-static) + + target_include_directories (pthreadC-static + INTERFACE $ + PUBLIC $) + + set_target_properties (pthreadC-static + PROPERTIES + OUTPUT_NAME libpthreadC${PTHREADS4W_VERSION_MAJOR}s + EXPORT_NAME Threads::Static + VERSION ${PTHREADS4W_VERSION} + SOVERSION ${PTHREADS4W_VERSION_MAJOR} + PUBLIC_HEADER "${PTHREAD_HEADERS}") + + target_compile_definitions (pthreadC-static + PUBLIC + CLEANUP=__PTW32_CLEANUP_C + $<$:HAVE_STDINT_H=1> + PRIVATE + __PTW32_STATIC_LIB + HAVE_CONFIG_H + $<$:__PTW32_BUILD_INLINED>) + + install (TARGETS pthreadC-static + COMPONENT Development + DESTINATION ${CMAKE_INSTALL_LIBDIR} + EXPORT PTHREADS4W + LIBRARY + DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pthread) + endif(PTHREADS4W_BUILD_STATIC) +endif() + +if (PTHREADS4W_BUILD_SE) + if(PTHREADS4W_BUILD_SHARED) + add_library (pthreadSE SHARED + ${PTHREAD_SOURCES} + ${PTHREAD_HEADERS}) + + add_library (Threads::SEShared ALIAS pthreadSE) + + target_include_directories (pthreadSE + INTERFACE $ + PUBLIC $) + + set_target_properties (pthreadSE + PROPERTIES + OUTPUT_NAME pthreadSE${PTHREADS4W_VERSION_MAJOR} + EXPORT_NAME Threads::SEShared + VERSION ${PTHREADS4W_VERSION} + SOVERSION ${PTHREADS4W_VERSION_MAJOR} + PUBLIC_HEADER "${PTHREAD_HEADERS}") + + target_compile_definitions (pthreadSE + PUBLIC + __PTW32_CLEANUP_SEH + $<$:HAVE_STDINT_H=1> + PRIVATE + __PTW32_BUILD_INLINED + HAVE_CONFIG_H) + + install (TARGETS pthreadSE + DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT Runtime + EXPORT PTHREADS4W + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER + COMPONENT Development + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pthread) + endif(PTHREADS4W_BUILD_SHARED) + + if(PTHREADS4W_BUILD_STATIC) + add_library (pthreadSE-static STATIC + ${PTHREAD_SOURCES} + ${PTHREAD_HEADERS}) + + add_library (Threads::SEStatic ALIAS pthreadSE-static) + + target_include_directories (pthreadSE-static + INTERFACE $ + PUBLIC $) + + set_target_properties (pthreadSE-static + PROPERTIES + OUTPUT_NAME libpthreadSE${PTHREADS4W_VERSION_MAJOR}s + EXPORT_NAME Threads::SEStatic + VERSION ${PTHREADS4W_VERSION} + SOVERSION ${PTHREADS4W_VERSION_MAJOR} + PUBLIC_HEADER "${PTHREAD_HEADERS}") + + target_compile_definitions (pthreadSE-static + PUBLIC + __PTW32_CLEANUP_SEH + $<$:HAVE_STDINT_H=1> + PRIVATE + __PTW32_BUILD_INLINED + PRIVATE __PTW32_STATIC_LIB + PRIVATE HAVE_CONFIG_H) + + install (TARGETS pthreadSE-static + COMPONENT Development + DESTINATION ${CMAKE_INSTALL_LIBDIR} + EXPORT PTHREADS4W + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pthread) + endif(PTHREADS4W_BUILD_STATIC) +endif() diff --git a/ce/CMakeLists.txt b/ce/CMakeLists.txt new file mode 100644 index 0000000..2510478 --- /dev/null +++ b/ce/CMakeLists.txt @@ -0,0 +1,97 @@ +cmake_minimum_required (VERSION 3.11) + +project (PTHREADS4W_CE + VERSION 3.0.3.0 + LANGUAGES CXX) + +string(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + +if(PTHREADS4W_BUILD_SHARED) + add_library (pthreadCE SHARED + ${PTHREAD_SOURCES} + ${PTHREAD_HEADERS}) + + add_library (Threads::CEShared ALIAS pthreadCE) + + target_include_directories (pthreadCE + INTERFACE $ + PUBLIC $) + + set_target_properties (pthreadCE + PROPERTIES + OUTPUT_NAME pthreadCE${PTHREADS4W_VERSION_MAJOR} + EXPORT_NAME Threads::CEShared + VERSION ${PTHREADS4W_VERSION} + SOVERSION ${PTHREADS4W_VERSION_MAJOR} + PUBLIC_HEADER "${PTHREAD_HEADERS}") + + target_compile_definitions (pthreadCE + PUBLIC + __PTW32_CLEANUP_CXX + $<$:HAVE_STDINT_H=1> + PRIVATE + HAVE_CONFIG_H) + + target_compile_options(pthreadCE + PRIVATE + $<$:/EHa>) + + set_source_files_properties(${PTHREAD_SOURCES} + TARGET_DIRECTORY pthreadCE + PROPERTIES LANGUAGE CXX) + + install (TARGETS pthreadCE + DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT Runtime + EXPORT PTHREADS4W + LIBRARY + DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER + COMPONENT Development + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pthread) +endif(PTHREADS4W_BUILD_SHARED) + +if(PTHREADS4W_BUILD_STATIC) + add_library (pthreadCE-static STATIC + ${PTHREAD_SOURCES} + ${PTHREAD_HEADERS}) + + add_library (Threads::CEStatic ALIAS pthreadCE-static) + + target_include_directories (pthreadCE-static + INTERFACE $ + PUBLIC $) + + set_target_properties (pthreadCE-static + PROPERTIES + OUTPUT_NAME libpthreadCE${PTHREADS4W_VERSION_MAJOR}s + EXPORT_NAME Threads::CEStatic + VERSION ${PTHREADS4W_VERSION} + SOVERSION ${PTHREADS4W_VERSION_MAJOR} + PUBLIC_HEADER "${PTHREAD_HEADERS}") + + target_compile_definitions (pthreadCE-static + PUBLIC + __PTW32_CLEANUP_CXX + $<$:HAVE_STDINT_H=1> + PRIVATE + __PTW32_STATIC_LIB + HAVE_CONFIG_H) + + target_compile_options(pthreadCE-static + PRIVATE + $<$:/EHa>) + + set_source_files_properties(${PTHREAD_SOURCES} + TARGET_DIRECTORY pthreadCE-static + PROPERTIES LANGUAGE CXX) + + install (TARGETS pthreadCE-static + COMPONENT Development + DESTINATION ${CMAKE_INSTALL_LIBDIR} + EXPORT PTHREADS4W + LIBRARY + DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pthread) +endif(PTHREADS4W_BUILD_STATIC) diff --git a/create.c b/create.c index 3ed7ca9..a96c463 100644 --- a/create.c +++ b/create.c @@ -88,7 +88,7 @@ pthread_create (pthread_t * tid, pthread_t thread; __ptw32_thread_t * tp; __ptw32_thread_t * sp; - register pthread_attr_t a; + pthread_attr_t a; HANDLE threadH = 0; int result = EAGAIN; int run = __PTW32_TRUE; diff --git a/dll.c b/dll.c index 674f7c7..04ab95c 100644 --- a/dll.c +++ b/dll.c @@ -140,8 +140,15 @@ extern int __ptw32_on_process_exit(void) } #if defined(__GNUC__) -__attribute__((section(".ctors"), used)) extern int (*gcc_ctor)(void) = __ptw32_on_process_init; -__attribute__((section(".dtors"), used)) extern int (*gcc_dtor)(void) = __ptw32_on_process_exit; +__attribute__((constructor)) +static void ptw32_init_ctor(void) { + __ptw32_on_process_init(); +} + +__attribute__((destructor)) +static void ptw32_fini_dtor(void) { + __ptw32_on_process_exit(); +} #elif defined(_MSC_VER) # if _MSC_VER >= 1400 /* MSVC8+ */ # pragma section(".CRT$XCU", long, read) diff --git a/implement.h b/implement.h index 81c5f29..0f41706 100644 --- a/implement.h +++ b/implement.h @@ -779,173 +779,114 @@ __PTW32_END_C_DECLS # define __PTW32_TO_VLONG64PTR(ptr) (ptr) #endif -#if defined(__GNUC__) -# if defined(_WIN64) -# define __PTW32_INTERLOCKED_COMPARE_EXCHANGE_64(location, value, comparand) \ - ({ \ - __typeof (value) _result; \ - __asm__ __volatile__ \ - ( \ - "lock\n\t" \ - "cmpxchgq %2,(%1)" \ - :"=a" (_result) \ - :"r" (location), "r" (value), "a" (comparand) \ - :"memory", "cc"); \ - _result; \ - }) -# define __PTW32_INTERLOCKED_EXCHANGE_64(location, value) \ - ({ \ - __typeof (value) _result; \ - __asm__ __volatile__ \ - ( \ - "xchgq %0,(%1)" \ - :"=r" (_result) \ - :"r" (location), "0" (value) \ - :"memory", "cc"); \ - _result; \ - }) -# define __PTW32_INTERLOCKED_EXCHANGE_ADD_64(location, value) \ - ({ \ - __typeof (value) _result; \ - __asm__ __volatile__ \ - ( \ - "lock\n\t" \ - "xaddq %0,(%1)" \ - :"=r" (_result) \ - :"r" (location), "0" (value) \ - :"memory", "cc"); \ - _result; \ - }) -# define __PTW32_INTERLOCKED_INCREMENT_64(location) \ - ({ \ - __PTW32_INTERLOCKED_LONG _temp = 1; \ - __asm__ __volatile__ \ - ( \ - "lock\n\t" \ - "xaddq %0,(%1)" \ - :"+r" (_temp) \ - :"r" (location) \ - :"memory", "cc"); \ - ++_temp; \ - }) -# define __PTW32_INTERLOCKED_DECREMENT_64(location) \ - ({ \ - __PTW32_INTERLOCKED_LONG _temp = -1; \ - __asm__ __volatile__ \ - ( \ - "lock\n\t" \ - "xaddq %2,(%1)" \ - :"+r" (_temp) \ - :"r" (location) \ - :"memory", "cc"); \ - --_temp; \ - }) -#endif -# define __PTW32_INTERLOCKED_COMPARE_EXCHANGE_LONG(location, value, comparand) \ - ({ \ - __typeof (value) _result; \ - __asm__ __volatile__ \ - ( \ - "lock\n\t" \ - "cmpxchgl %2,(%1)" \ - :"=a" (_result) \ - :"r" (location), "r" (value), "a" (comparand) \ - :"memory", "cc"); \ - _result; \ - }) -# define __PTW32_INTERLOCKED_EXCHANGE_LONG(location, value) \ - ({ \ - __typeof (value) _result; \ - __asm__ __volatile__ \ - ( \ - "xchgl %0,(%1)" \ - :"=r" (_result) \ - :"r" (location), "0" (value) \ - :"memory", "cc"); \ - _result; \ +#if defined(__GNUC__) || defined(__clang__) + +/* 32-bit long */ + +#define __PTW32_INTERLOCKED_INCREMENT_LONG(p) __atomic_add_fetch((p), 1, __ATOMIC_SEQ_CST) + +#define __PTW32_INTERLOCKED_DECREMENT_LONG(p) __atomic_sub_fetch((p), 1, __ATOMIC_SEQ_CST) + +#define __PTW32_INTERLOCKED_EXCHANGE_ADD_LONG(p, v) __atomic_fetch_add((p), (v), __ATOMIC_SEQ_CST) + +#define __PTW32_INTERLOCKED_EXCHANGE_LONG(p, v) __atomic_exchange_n((p), (v), __ATOMIC_SEQ_CST) + +#define __PTW32_INTERLOCKED_COMPARE_EXCHANGE_LONG(p, v, c) \ + ({ \ + __PTW32_INTERLOCKED_LONG __expected = (c); \ + __atomic_compare_exchange_n((p), &__expected, (v), 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); \ + __expected; \ }) -# define __PTW32_INTERLOCKED_EXCHANGE_ADD_LONG(location, value) \ - ({ \ - __typeof (value) _result; \ - __asm__ __volatile__ \ - ( \ - "lock\n\t" \ - "xaddl %0,(%1)" \ - :"=r" (_result) \ - :"r" (location), "0" (value) \ - :"memory", "cc"); \ - _result; \ + +/* 64-bit */ + +#define __PTW32_INTERLOCKED_INCREMENT_64(p) __atomic_add_fetch((p), 1, __ATOMIC_SEQ_CST) + +#define __PTW32_INTERLOCKED_DECREMENT_64(p) __atomic_sub_fetch((p), 1, __ATOMIC_SEQ_CST) + +#define __PTW32_INTERLOCKED_EXCHANGE_ADD_64(p, v) __atomic_fetch_add((p), (v), __ATOMIC_SEQ_CST) + +#define __PTW32_INTERLOCKED_EXCHANGE_64(p, v) __atomic_exchange_n((p), (v), __ATOMIC_SEQ_CST) + +#define __PTW32_INTERLOCKED_COMPARE_EXCHANGE_64(p, v, c) \ + ({ \ + __PTW32_INTERLOCKED_SIZE __expected = (c); \ + __atomic_compare_exchange_n((p), &__expected, (v), 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); \ + __expected; \ }) -# define __PTW32_INTERLOCKED_INCREMENT_LONG(location) \ - ({ \ - __PTW32_INTERLOCKED_LONG _temp = 1; \ - __asm__ __volatile__ \ - ( \ - "lock\n\t" \ - "xaddl %0,(%1)" \ - :"+r" (_temp) \ - :"r" (location) \ - :"memory", "cc"); \ - ++_temp; \ + +/* Pointer */ + +#define __PTW32_INTERLOCKED_EXCHANGE_PTR(p, v) __atomic_exchange_n((p), (v), __ATOMIC_SEQ_CST) + +#define __PTW32_INTERLOCKED_COMPARE_EXCHANGE_PTR(p, v, c) \ + ({ \ + void *__expected = (c); \ + __atomic_compare_exchange_n((p), &__expected, (v), 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); \ + __expected; \ }) -# define __PTW32_INTERLOCKED_DECREMENT_LONG(location) \ - ({ \ - __PTW32_INTERLOCKED_LONG _temp = -1; \ - __asm__ __volatile__ \ - ( \ - "lock\n\t" \ - "xaddl %0,(%1)" \ - :"+r" (_temp) \ - :"r" (location) \ - :"memory", "cc"); \ - --_temp; \ + +#define __PTW32_INTERLOCKED_COMPARE_EXCHANGE_SIZE(p, v, c) \ + ({ \ + __PTW32_INTERLOCKED_SIZE __expected = (c); \ + __atomic_compare_exchange_n((p), &__expected, (v), 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); \ + __expected; \ }) -# define __PTW32_INTERLOCKED_COMPARE_EXCHANGE_PTR(location, value, comparand) \ - __PTW32_INTERLOCKED_COMPARE_EXCHANGE_SIZE ((__PTW32_INTERLOCKED_SIZEPTR)location, \ - (__PTW32_INTERLOCKED_SIZE)value, \ - (__PTW32_INTERLOCKED_SIZE)comparand) -# define __PTW32_INTERLOCKED_EXCHANGE_PTR(location, value) \ - __PTW32_INTERLOCKED_EXCHANGE_SIZE ((__PTW32_INTERLOCKED_SIZEPTR)location, \ - (__PTW32_INTERLOCKED_SIZE)value) + +#define __PTW32_INTERLOCKED_EXCHANGE_ADD_SIZE(p, v) __atomic_fetch_add((p), (v), __ATOMIC_SEQ_CST) + +#define __PTW32_INTERLOCKED_EXCHANGE_SIZE(p, v) __atomic_exchange_n((p), (v), __ATOMIC_SEQ_CST) + +#define __PTW32_INTERLOCKED_INCREMENT_SIZE(p) __atomic_add_fetch((p), 1, __ATOMIC_SEQ_CST) + +#define __PTW32_INTERLOCKED_DECREMENT_SIZE(p) __atomic_sub_fetch((p), 1, __ATOMIC_SEQ_CST) #else -# if defined(_WIN64) -# define __PTW32_INTERLOCKED_COMPARE_EXCHANGE_64(p,v,c) InterlockedCompareExchange64 (__PTW32_TO_VLONG64PTR(p),(v),(c)) -# define __PTW32_INTERLOCKED_EXCHANGE_64(p,v) InterlockedExchange64 (__PTW32_TO_VLONG64PTR(p),(v)) -# define __PTW32_INTERLOCKED_EXCHANGE_ADD_64(p,v) InterlockedExchangeAdd64 (__PTW32_TO_VLONG64PTR(p),(v)) -# define __PTW32_INTERLOCKED_INCREMENT_64(p) InterlockedIncrement64 (__PTW32_TO_VLONG64PTR(p)) -# define __PTW32_INTERLOCKED_DECREMENT_64(p) InterlockedDecrement64 (__PTW32_TO_VLONG64PTR(p)) -# endif -# if defined (__PTW32_CONFIG_MSVC6) && !defined(_WIN64) -# define __PTW32_INTERLOCKED_COMPARE_EXCHANGE_LONG(location, value, comparand) \ - ((LONG)InterlockedCompareExchange((PVOID *)(location), (PVOID)(value), (PVOID)(comparand))) -# else -# define __PTW32_INTERLOCKED_COMPARE_EXCHANGE_LONG InterlockedCompareExchange -# endif -# define __PTW32_INTERLOCKED_EXCHANGE_LONG(p,v) InterlockedExchange((p),(v)) -# define __PTW32_INTERLOCKED_EXCHANGE_ADD_LONG(p,v) InterlockedExchangeAdd((p),(v)) -# define __PTW32_INTERLOCKED_INCREMENT_LONG(p) InterlockedIncrement((p)) -# define __PTW32_INTERLOCKED_DECREMENT_LONG(p) InterlockedDecrement((p)) -# if defined (__PTW32_CONFIG_MSVC6) && !defined(_WIN64) -# define __PTW32_INTERLOCKED_COMPARE_EXCHANGE_PTR InterlockedCompareExchange -# define __PTW32_INTERLOCKED_EXCHANGE_PTR(location, value) \ - ((PVOID)InterlockedExchange((LPLONG)(location), (LONG)(value))) -# else -# define __PTW32_INTERLOCKED_COMPARE_EXCHANGE_PTR(p,v,c) InterlockedCompareExchangePointer((p),(v),(c)) -# define __PTW32_INTERLOCKED_EXCHANGE_PTR(p,v) InterlockedExchangePointer((p),(v)) -# endif -#endif +/* MSVC fallback */ + +#define __PTW32_INTERLOCKED_DECREMENT_LONG(p) InterlockedDecrement((p)) +#define __PTW32_INTERLOCKED_EXCHANGE_ADD_LONG(p, v) InterlockedExchangeAdd((p), (v)) +#define __PTW32_INTERLOCKED_EXCHANGE_LONG(p, v) InterlockedExchange((p), (v)) +#define __PTW32_INTERLOCKED_EXCHANGE_PTR(p, v) InterlockedExchangePointer((p), (v)) +#define __PTW32_INTERLOCKED_INCREMENT_LONG(p) InterlockedIncrement((p)) + +#define __PTW32_INTERLOCKED_COMPARE_EXCHANGE_LONG(p, v, c) InterlockedCompareExchange((p), (v), (c)) + +#define __PTW32_INTERLOCKED_COMPARE_EXCHANGE_PTR(p, v, c) \ + InterlockedCompareExchangePointer((p), (v), (c)) + #if defined(_WIN64) -# define __PTW32_INTERLOCKED_COMPARE_EXCHANGE_SIZE(p,v,c) __PTW32_INTERLOCKED_COMPARE_EXCHANGE_64 (__PTW32_TO_VLONG64PTR(p),(v),(c)) -# define __PTW32_INTERLOCKED_EXCHANGE_SIZE(p,v) __PTW32_INTERLOCKED_EXCHANGE_64 (__PTW32_TO_VLONG64PTR(p),(v)) -# define __PTW32_INTERLOCKED_EXCHANGE_ADD_SIZE(p,v) __PTW32_INTERLOCKED_EXCHANGE_ADD_64 (__PTW32_TO_VLONG64PTR(p),(v)) -# define __PTW32_INTERLOCKED_INCREMENT_SIZE(p) __PTW32_INTERLOCKED_INCREMENT_64 (__PTW32_TO_VLONG64PTR(p)) -# define __PTW32_INTERLOCKED_DECREMENT_SIZE(p) __PTW32_INTERLOCKED_DECREMENT_64 (__PTW32_TO_VLONG64PTR(p)) + +#define __PTW32_INTERLOCKED_COMPARE_EXCHANGE_64(p, v, c) \ + InterlockedCompareExchange64((volatile LONG64 *) (p), (v), (c)) + +#define __PTW32_INTERLOCKED_INCREMENT_64(p) InterlockedIncrement64((volatile LONG64 *) (p)) + +#define __PTW32_INTERLOCKED_DECREMENT_64(p) InterlockedDecrement64((volatile LONG64 *) (p)) + +#define __PTW32_INTERLOCKED_EXCHANGE_64(p, v) InterlockedExchange64((volatile LONG64 *) (p), (v)) + +#define __PTW32_INTERLOCKED_EXCHANGE_ADD_64(p, v) \ + InterlockedExchangeAdd64((volatile LONG64 *) (p), (v)) + +#define __PTW32_INTERLOCKED_EXCHANGE_ADD_SIZE(p, v) __PTW32_INTERLOCKED_EXCHANGE_ADD_64((p), (v)) + +#define __PTW32_INTERLOCKED_COMPARE_EXCHANGE_SIZE(p, v, c) \ + __PTW32_INTERLOCKED_COMPARE_EXCHANGE_64((p), (v), (c)) + +#define __PTW32_INTERLOCKED_COMPARE_EXCHANGE_ADD_SIZE(p, cmp, add) \ + __PTW32_INTERLOCKED_COMPARE_EXCHANGE_SIZE((p), (cmp), (cmp) + (add)) + #else -# define __PTW32_INTERLOCKED_COMPARE_EXCHANGE_SIZE(p,v,c) __PTW32_INTERLOCKED_COMPARE_EXCHANGE_LONG((p),(v),(c)) -# define __PTW32_INTERLOCKED_EXCHANGE_SIZE(p,v) __PTW32_INTERLOCKED_EXCHANGE_LONG((p),(v)) -# define __PTW32_INTERLOCKED_EXCHANGE_ADD_SIZE(p,v) __PTW32_INTERLOCKED_EXCHANGE_ADD_LONG((p),(v)) -# define __PTW32_INTERLOCKED_INCREMENT_SIZE(p) __PTW32_INTERLOCKED_INCREMENT_LONG((p)) -# define __PTW32_INTERLOCKED_DECREMENT_SIZE(p) __PTW32_INTERLOCKED_DECREMENT_LONG((p)) + +#define __PTW32_INTERLOCKED_EXCHANGE_ADD_SIZE(p, v) __PTW32_INTERLOCKED_EXCHANGE_ADD_LONG((p), (v)) + +#define __PTW32_INTERLOCKED_COMPARE_EXCHANGE_SIZE(p, v, c) \ + __PTW32_INTERLOCKED_COMPARE_EXCHANGE_LONG((p), (v), (c)) + +#define __PTW32_INTERLOCKED_COMPARE_EXCHANGE_ADD_SIZE(p, cmp, add) \ + __PTW32_INTERLOCKED_COMPARE_EXCHANGE_SIZE((p), (cmp), (cmp) + (add)) + +#endif #endif #if defined(NEED_CREATETHREAD) diff --git a/pthread.h b/pthread.h index a270e6c..428ad66 100644 --- a/pthread.h +++ b/pthread.h @@ -80,13 +80,15 @@ #undef __PTW32_LEVEL_MAX #define __PTW32_LEVEL_MAX 3 -#if _POSIX_C_SOURCE >= 200112L /* POSIX.1-2001 and later */ +#if defined _POSIX_C_SOURCE && _POSIX_C_SOURCE >= 200112L +/* POSIX.1-2001 and later */ # define __PTW32_LEVEL __PTW32_LEVEL_MAX /* include everything */ #elif defined INCLUDE_NP /* earlier than POSIX.1-2001, but... */ # define __PTW32_LEVEL 2 /* include non-portable extensions */ -#elif _POSIX_C_SOURCE >= 199309L /* POSIX.1-1993 */ +#elif defined _POSIX_C_SOURCE && _POSIX_C_SOURCE >= 199309L +/* POSIX.1-1993 */ # define __PTW32_LEVEL 1 /* include 1b, 1c, and 1d */ #elif defined _POSIX_SOURCE /* early POSIX */ @@ -1207,12 +1209,6 @@ __PTW32_DLLPORT unsigned long __PTW32_CDECL __ptw32_get_exception_services_code catch( __ptw32_exception & ) { throw; } \ catch( ... ) -#else /* _MSC_VER */ - -#define catch( E ) \ - catch( __ptw32_exception & ) { throw; } \ - catch( E ) - #endif /* _MSC_VER */ #endif /* __PTW32_CLEANUP_CXX */ diff --git a/pthread_spin_destroy.c b/pthread_spin_destroy.c index c25873a..544b5bc 100644 --- a/pthread_spin_destroy.c +++ b/pthread_spin_destroy.c @@ -43,7 +43,7 @@ int pthread_spin_destroy (pthread_spinlock_t * lock) { - register pthread_spinlock_t s; + pthread_spinlock_t s; int result = 0; if (lock == NULL || *lock == NULL) diff --git a/pthread_spin_lock.c b/pthread_spin_lock.c index 54e7281..531e83b 100644 --- a/pthread_spin_lock.c +++ b/pthread_spin_lock.c @@ -43,7 +43,7 @@ int pthread_spin_lock (pthread_spinlock_t * lock) { - register pthread_spinlock_t s; + pthread_spinlock_t s; if (NULL == lock || NULL == *lock) { diff --git a/pthread_spin_trylock.c b/pthread_spin_trylock.c index b177f6a..fdb70b4 100644 --- a/pthread_spin_trylock.c +++ b/pthread_spin_trylock.c @@ -43,7 +43,7 @@ int pthread_spin_trylock (pthread_spinlock_t * lock) { - register pthread_spinlock_t s; + pthread_spinlock_t s; if (NULL == lock || NULL == *lock) { diff --git a/pthread_spin_unlock.c b/pthread_spin_unlock.c index 5c9d548..c02fb60 100644 --- a/pthread_spin_unlock.c +++ b/pthread_spin_unlock.c @@ -43,7 +43,7 @@ int pthread_spin_unlock (pthread_spinlock_t * lock) { - register pthread_spinlock_t s; + pthread_spinlock_t s; if (NULL == lock || NULL == *lock) { diff --git a/ptw32_callUserDestroyRoutines.c b/ptw32_callUserDestroyRoutines.c index 9d85e05..4933fe6 100644 --- a/ptw32_callUserDestroyRoutines.c +++ b/ptw32_callUserDestroyRoutines.c @@ -50,7 +50,7 @@ # if defined(__GNUC__) && __GNUC__ < 3 # include # else -# include +# include using std::terminate; # endif diff --git a/ptw32_mutex_check_need_init.c b/ptw32_mutex_check_need_init.c index c7b1301..119da5e 100644 --- a/ptw32_mutex_check_need_init.c +++ b/ptw32_mutex_check_need_init.c @@ -50,8 +50,8 @@ static pthread_mutexattr_t __ptw32_errorcheck_mutexattr = &__ptw32_errorcheck_mu INLINE int __ptw32_mutex_check_need_init (pthread_mutex_t * mutex) { - register int result = 0; - register pthread_mutex_t mtx; + int result = 0; + pthread_mutex_t mtx; __ptw32_mcs_local_node_t node; __ptw32_mcs_lock_acquire(&__ptw32_mutex_test_init_lock, &node); diff --git a/ptw32_threadStart.c b/ptw32_threadStart.c index fc41ca2..99a550e 100644 --- a/ptw32_threadStart.c +++ b/ptw32_threadStart.c @@ -95,7 +95,7 @@ ExceptionFilter (EXCEPTION_POINTERS * ep, DWORD * ei) # if defined(__GNUC__) && __GNUC__ < 3 # include # else -# include +# include using std::terminate; using diff --git a/sched.h b/sched.h index 81630d9..8f0c9ee 100644 --- a/sched.h +++ b/sched.h @@ -56,21 +56,21 @@ typedef int pid_t; #endif -#if __GNUC__ < 4 -/* GCC v4.0 and later, (as used by MinGW), allows us to repeat a +#if !defined __GNUC__ || __GNUC__ < 4 + /* GCC v4.0 and later, (as used by MinGW), allows us to repeat a * typedef, provided every duplicate is consistent; only set this * multiple definition guard when we cannot be certain that it is * permissable to repeat typedefs. */ -#define __have_typedef_pid_t 1 +#define __have_typedef_pid_t 1 #endif #endif -/* POSIX.1-1993 says that WILL expose all of + /* POSIX.1-1993 says that WILL expose all of */ #undef __SCHED_H_SOURCED__ #if _POSIX_C_SOURCE >= 200112L -/* POSIX.1-2001 and later revises this to say only that it MAY do so; + /* POSIX.1-2001 and later revises this to say only that it MAY do so; * only struct timespec, and associated time_t are actually required, * so prefer to be selective; (MinGW.org's offers an option * for selective #inclusion, when __SCHED_H_SOURCED__ is defined): @@ -82,46 +82,41 @@ #include #if defined __MINGW64__ || _MSC_VER >= 1900 -/* These are known to define struct timespec, when has been + /* These are known to define struct timespec, when has been * #included, but may not, (probably don't), follow the convention of * defining __struct_timespec_defined, as adopted by MinGW.org; for * these cases, we unconditionally assume that struct timespec has * been defined, otherwise, if MinGW.org's criterion has not been * satisfied... */ -#elif ! defined __struct_timespec_defined -# ifndef _TIMESPEC_DEFINED -# define _TIMESPEC_DEFINED +#elif !defined __struct_timespec_defined +#ifndef _TIMESPEC_DEFINED +#define _TIMESPEC_DEFINED struct timespec { /* ...we fall back on this explicit definition. */ time_t tv_sec; int tv_nsec; }; -# endif +#endif #endif -/* + /* * Microsoft VC++6.0 lacks these *_PTR types */ -#if defined(_MSC_VER) && _MSC_VER < 1300 && !defined (__PTW32_HAVE_DWORD_PTR) -typedef unsigned long ULONG_PTR; -typedef ULONG_PTR DWORD_PTR; +#if defined(_MSC_VER) && _MSC_VER < 1300 && !defined(__PTW32_HAVE_DWORD_PTR) + typedef unsigned long ULONG_PTR; + typedef ULONG_PTR DWORD_PTR; #endif -/* Thread scheduling policies */ + /* Thread scheduling policies */ -enum -{ SCHED_OTHER = 0, - SCHED_FIFO, - SCHED_RR, - SCHED_MIN = SCHED_OTHER, - SCHED_MAX = SCHED_RR -}; + enum { SCHED_OTHER = 0, SCHED_FIFO, SCHED_RR, SCHED_MIN = SCHED_OTHER, SCHED_MAX = SCHED_RR }; -struct sched_param -{ int sched_priority; -}; + struct sched_param + { + int sched_priority; + }; /* * CPU affinity diff --git a/sem_getvalue.c b/sem_getvalue.c index 2e043db..82d8901 100644 --- a/sem_getvalue.c +++ b/sem_getvalue.c @@ -82,7 +82,7 @@ sem_getvalue (sem_t * sem, int *sval) int result = 0; __ptw32_mcs_local_node_t node; - register sem_t s = *sem; + sem_t s = *sem; __ptw32_mcs_lock_acquire(&s->lock, &node); *sval = s->value; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 5df9b09..68368a6 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,832 +1,1081 @@ function (PT4WCREATE_TEST TESTNAME) - set (OPTS NEEDS_LINK NEEDS_ROOT_INCL) - set (OVA ADDITIONAL_SOURCE ADITIONAL_LIB) - set (MVA DEPENDS) - - cmake_parse_arguments (PARSE_ARGV 1 PT4WCT "${OPTS}" "${OVA}" "${MVA}") - - foreach (SUFFIX ${SUFFIXES}) - add_executable (test-pthread4w${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME} - ${TESTNAME}.c - ${PT4WCT_ADDITIONAL_SOURCE} - ) - - if (PT4WCT_NEEDS_ROOT_INCL) - target_include_directories (test-pthread4w${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME} - PRIVATE ${PROJECT_SOURCE_DIR} - ) - endif() - - add_test (NAME pthread4w_${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME} - COMMAND test-pthread4w${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME} - ) - - set_tests_properties (pthread4w_${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME} PROPERTIES - FIXTURES_SETUP ${TESTNAME}${COMPILER_INDICATOR}${SUFFIX} - ) - - if (PT4WCT_DEPENDS) - set_tests_properties (pthread4w_${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME} PROPERTIES - FIXTURES_REQUIRED "${PT4WCT_DEPENDS}${COMPILER_INDICATOR}${SUFFIX}" - ) - endif() - - if (PT4WCT_NEEDS_LINK) - add_executable (test-pthread4w${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME}-static - ${TESTNAME}.c - ${PT4WCT_ADDITIONAL_SOURCE} - ) - - add_test (NAME pthread4w_${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME}-static - COMMAND test-pthread4w${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME}-static - ) - - add_executable (test-pthread4w${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME}-static-nolib - ${TESTNAME}.c - ${PROJECT_SOURCE_DIR}/pthread.c - ${PT4WCT_ADDITIONAL_SOURCE} - ) - - add_test (NAME pthread4w_${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME}-static-nolib - COMMAND test-pthread4w${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME}-static-nolib - ) - - target_compile_definitions (test-pthread4w${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME}-static-nolib - PRIVATE __PTW32_DLLPORT= - PRIVATE __PTW32_CONFIG_H - PRIVATE __PTW32_STATIC_LIB - ) - - target_include_directories (test-pthread4w${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME}-static-nolib - PRIVATE ${PROJECT_SOURCE_DIR} - ) - - target_link_libraries (test-pthread4w${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME} - PRIVATE pthread${COMPILER_INDICATOR}${SUFFIX} - PRIVATE ${PT4WCT_ADITIONAL_LIB} - ) - - target_link_libraries (test-pthread4w${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME}-static - PRIVATE pthread${COMPILER_INDICATOR}${SUFFIX}-static - PRIVATE ${PT4WCT_ADITIONAL_LIB} - ) - - target_link_libraries (test-pthread4w${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME}-static-nolib - PRIVATE ${PT4WCT_ADITIONAL_LIB} - ) - - set_tests_properties (pthread4w_${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME} PROPERTIES - ENVIRONMENT "PATH=$\;%PATH%" - ) - - set_tests_properties (pthread4w_${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME}-static PROPERTIES - FIXTURES_SETUP ${TESTNAME}${COMPILER_INDICATOR}${SUFFIX}-static - ) - - set_tests_properties (pthread4w_${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME}-static-nolib PROPERTIES - FIXTURES_SETUP ${TESTNAME}${COMPILER_INDICATOR}${SUFFIX}-static-nolib - ) - - if (PT4WCT_DEPENDS) - set_tests_properties (pthread4w_${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME}-static PROPERTIES - FIXTURES_REQUIRED "${PT4WCT_DEPENDS}${COMPILER_INDICATOR}${SUFFIX}-static" - ) - - set_tests_properties (pthread4w_${COMPILER_INDICATOR}${SUFFIX}-${TESTNAME}-static-nolib PROPERTIES - FIXTURES_REQUIRED "${PT4WCT_DEPENDS}${COMPILER_INDICATOR}${SUFFIX}-static-nolib" - ) - endif() - endif() - endforeach() + set (OPTS NEEDS_LINK NEEDS_OPENMP NEEDS_ROOT_INCL) + set (OVA ADDITIONAL_SOURCE ADITIONAL_LIB) + set (MVA DEPENDS) + + cmake_parse_arguments (PARSE_ARGV 1 PT4WCT "${OPTS}" "${OVA}" "${MVA}") + + foreach (SUFFIX ${SUFFIXES}) + if(SUFFIX STREQUAL "CE") + set_source_files_properties( + ${PTHREADS4W_SOURCE_DIR}/tests/${TESTNAME}.c + ${PTHREADS4W_SOURCE_DIR}/tests/${PT4WCT_ADDITIONAL_SOURCE} + ${PTHREADS4W_SOURCE_DIR}/pthread.c + PROPERTIES LANGUAGE CXX) + endif() + + if(PTHREADS4W_BUILD_SHARED) + add_executable (pthreads4w${SUFFIX}-${TESTNAME} + ${PTHREADS4W_SOURCE_DIR}/tests/${TESTNAME}.c + ${PTHREADS4W_SOURCE_DIR}/tests/${PT4WCT_ADDITIONAL_SOURCE}) + + if(SUFFIX STREQUAL "CE") + target_compile_options(pthreads4w${SUFFIX}-${TESTNAME} + PRIVATE $<$:/EHa>) + endif() + + if (PT4WCT_NEEDS_ROOT_INCL) + target_include_directories (pthreads4w${SUFFIX}-${TESTNAME} + PRIVATE ${PTHREADS4W_SOURCE_DIR}) + endif() + + add_test (NAME pthreads4w_${SUFFIX}-${TESTNAME} + COMMAND pthreads4w${SUFFIX}-${TESTNAME}) + + set_tests_properties (pthreads4w_${SUFFIX}-${TESTNAME} + PROPERTIES + FIXTURES_SETUP ${TESTNAME}${SUFFIX}) + + if (PT4WCT_DEPENDS) + set_tests_properties (pthreads4w_${SUFFIX}-${TESTNAME} + PROPERTIES + FIXTURES_REQUIRED "${PT4WCT_DEPENDS}${SUFFIX}") + endif() + endif(PTHREADS4W_BUILD_SHARED) + + if (PT4WCT_NEEDS_LINK) + if(PTHREADS4W_BUILD_STATIC) + add_executable (pthreads4w${SUFFIX}-${TESTNAME}-static + ${PTHREADS4W_SOURCE_DIR}/tests/${TESTNAME}.c + ${PTHREADS4W_SOURCE_DIR}/tests/${PT4WCT_ADDITIONAL_SOURCE}) + + add_test (NAME pthreads4w_${SUFFIX}-${TESTNAME}-static + COMMAND pthreads4w${SUFFIX}-${TESTNAME}-static) + + if(NOT ${SUFFIX} STREQUAL "SE") + add_executable (pthreads4w${SUFFIX}-${TESTNAME}-static-nolib + ${PTHREADS4W_SOURCE_DIR}/tests/${TESTNAME}.c + ${PTHREADS4W_SOURCE_DIR}/tests/${PT4WCT_ADDITIONAL_SOURCE} + ${PTHREADS4W_SOURCE_DIR}/pthread.c) + + target_include_directories(pthreads4w${SUFFIX}-${TESTNAME}-static-nolib + PRIVATE ${PTHREADS4W_SOURCE_DIR}) + + add_test (NAME pthreads4w_${SUFFIX}-${TESTNAME}-static-nolib + COMMAND pthreads4w${SUFFIX}-${TESTNAME}-static-nolib) + + target_compile_definitions (pthreads4w${SUFFIX}-${TESTNAME}-static-nolib + PRIVATE + __PTW32_DLLPORT= + __PTW32_CONFIG_H + __PTW32_STATIC_LIB + $<$:__PTW32_CLEANUP_C> + $<$:__PTW32_CLEANUP_CXX> + $<$:HAVE_STDINT_H=1>) + target_include_directories (pthreads4w${SUFFIX}-${TESTNAME}-static-nolib + PRIVATE ${PROJECT_SOURCE_DIR}) + + target_link_libraries (pthreads4w${SUFFIX}-${TESTNAME}-static-nolib + PRIVATE ${PT4WCT_ADITIONAL_LIB}) + + set_tests_properties (pthreads4w_${SUFFIX}-${TESTNAME}-static-nolib + PROPERTIES + FIXTURES_SETUP ${TESTNAME}${SUFFIX}-static-nolib) + endif() + + if(SUFFIX STREQUAL "CE") + target_compile_definitions (pthreads4w${SUFFIX}-${TESTNAME}-static-nolib + PRIVATE + __PtW32NoCatchWarn + $<$:HAVE_STDINT_H=1>) + target_compile_definitions (pthreads4w${SUFFIX}-${TESTNAME}-static + PRIVATE + __PtW32NoCatchWarn) + + target_compile_options(pthreads4w${SUFFIX}-${TESTNAME}-static + PRIVATE $<$:/EHa>) + target_compile_options(pthreads4w${SUFFIX}-${TESTNAME}-static-nolib + PRIVATE $<$:/EHa>) + + set_source_files_properties(${TESTNAME}.c + TARGET_DIRECTORY pthreads4w${SUFFIX}-${TESTNAME}-static + PROPERTIES LANGUAGE CXX) + set_source_files_properties(${TESTNAME}.c + TARGET_DIRECTORY pthreads4w${SUFFIX}-${TESTNAME}-static-nolib + PROPERTIES LANGUAGE CXX) + if(PT4WCT_ADDITIONAL_SOURCE) + set_source_files_properties(${PT4WCT_ADDITIONAL_SOURCE} + TARGET_DIRECTORY pthreads4w${SUFFIX}-${TESTNAME}-static + PROPERTIES LANGUAGE CXX) + set_source_files_properties(${PT4WCT_ADDITIONAL_SOURCE} + TARGET_DIRECTORY pthreads4w${SUFFIX}-${TESTNAME}-static-nolib + PROPERTIES LANGUAGE CXX) + endif() + endif() + + target_link_libraries (pthreads4w${SUFFIX}-${TESTNAME}-static + PRIVATE + pthread${SUFFIX}-static + ${PT4WCT_ADITIONAL_LIB}) + + set_tests_properties (pthreads4w_${SUFFIX}-${TESTNAME}-static + PROPERTIES + FIXTURES_SETUP ${TESTNAME}${SUFFIX}-static) + + + if (PT4WCT_DEPENDS) + set_tests_properties (pthreads4w_${SUFFIX}-${TESTNAME}-static + PROPERTIES + FIXTURES_REQUIRED "${PT4WCT_DEPENDS}${SUFFIX}-static") + + if(NOT ${SUFFIX} STREQUAL "SE") + set_tests_properties (pthreads4w_${SUFFIX}-${TESTNAME}-static-nolib + PROPERTIES + FIXTURES_REQUIRED "${PT4WCT_DEPENDS}${SUFFIX}-static-nolib") + endif() + endif() + endif(PTHREADS4W_BUILD_STATIC) + + if(PTHREADS4W_BUILD_SHARED) + target_link_libraries (pthreads4w${SUFFIX}-${TESTNAME} + PRIVATE + pthread${SUFFIX} + ${PT4WCT_ADITIONAL_LIB}) + + if(SUFFIX STREQUAL "CE") + target_compile_definitions (pthreads4w${SUFFIX}-${TESTNAME} + PRIVATE + __PtW32NoCatchWarn) + set_source_files_properties(${TESTNAME}.c + TARGET_DIRECTORY pthreads4w${SUFFIX}-${TESTNAME} + PROPERTIES LANGUAGE CXX) + if(PT4WCT_ADDITIONAL_SOURCE) + set_source_files_properties(${PT4WCT_ADDITIONAL_SOURCE} + TARGET_DIRECTORY pthreads4w${SUFFIX}-${TESTNAME} + PROPERTIES LANGUAGE CXX) + endif() + endif() + + get_filename_component(COMPILER_DIR "${CMAKE_C_COMPILER}" DIRECTORY) + + set(TEST_PATH "PATH=${COMPILER_DIR}\;$\;%PATH%") + set_tests_properties(pthreads4w_${SUFFIX}-${TESTNAME} + PROPERTIES + ENVIRONMENT "${TEST_PATH}") + endif(PTHREADS4W_BUILD_SHARED) + endif(PT4WCT_NEEDS_LINK) + + if(PT4WCT_NEEDS_OPENMP) + if(SUFFIX STREQUAL "CE") + set (_omp_lib OpenMP::OpenMP_CXX) + + #Working around broken omp targets + if (MSVC) + target_link_libraries(OpenMP::OpenMP_CXX INTERFACE vcomp) + endif() + else() + set (_omp_lib OpenMP::OpenMP_C) + + #Working around broken omp targets + if (MSVC) + target_link_libraries(OpenMP::OpenMP_C INTERFACE vcomp) + endif() + endif() + + if(PTHREADS4W_BUILD_SHARED) + target_link_libraries(pthreads4w${SUFFIX}-${TESTNAME} + PRIVATE ${_omp_lib}) + endif() + + if(PTHREADS4W_BUILD_STATIC) + target_link_libraries(pthreads4w${SUFFIX}-${TESTNAME}-static + PRIVATE ${_omp_lib}) + if(NOT ${SUFFIX} STREQUAL "SE") + target_link_libraries(pthreads4w${SUFFIX}-${TESTNAME}-static-nolib + PRIVATE ${_omp_lib}) + endif() + endif() + endif() + endforeach() endfunction() -if (PTHREADS4W_BUILD_C) - list (APPEND SUFFIXES "C") -endif() +macro(PT4W_make_tests) + PT4WCREATE_TEST (affinity1 NEEDS_LINK) + PT4WCREATE_TEST (affinity2 NEEDS_LINK) + + PT4WCREATE_TEST (affinity3 + NEEDS_LINK + DEPENDS self1) + + PT4WCREATE_TEST (affinity4 + NEEDS_LINK + DEPENDS self1) + + PT4WCREATE_TEST (affinity5 + NEEDS_LINK + DEPENDS join0 self1) + + PT4WCREATE_TEST (affinity6 + NEEDS_LINK + DEPENDS join0 self1) + + PT4WCREATE_TEST (barrier1 NEEDS_LINK) + + PT4WCREATE_TEST (barrier2 + NEEDS_LINK + DEPENDS barrier1) + + PT4WCREATE_TEST (barrier3 + NEEDS_LINK + DEPENDS barrier1 join0) + + PT4WCREATE_TEST (barrier4 + NEEDS_LINK + DEPENDS barrier1 join0 mutex1) + + PT4WCREATE_TEST (barrier5 + NEEDS_LINK + DEPENDS barrier1 join0) + + PT4WCREATE_TEST (barrier6 + NEEDS_LINK + DEPENDS barrier1 join0 mutex1) + + PT4WCREATE_TEST (benchtest1 + NEEDS_LINK + ADDITIONAL_SOURCE benchlib.c + DEPENDS mutex5) + + PT4WCREATE_TEST (benchtest2 + NEEDS_LINK + ADDITIONAL_SOURCE benchlib.c + DEPENDS join0 mutex5) + + PT4WCREATE_TEST (benchtest3 + NEEDS_LINK + ADDITIONAL_SOURCE benchlib.c + DEPENDS join0 mutex3 mutex5) + + PT4WCREATE_TEST (benchtest4 + NEEDS_LINK + ADDITIONAL_SOURCE benchlib.c + DEPENDS mutex3 mutex5) + + PT4WCREATE_TEST (benchtest5 + NEEDS_LINK + DEPENDS semaphore5) + + PT4WCREATE_TEST (cancel1 + NEEDS_LINK + DEPENDS create1 self1) + + PT4WCREATE_TEST (cancel3 + NEEDS_LINK + DEPENDS cancel1 join0 mutex1) + + PT4WCREATE_TEST (cancel4 + NEEDS_LINK + DEPENDS cancel3) + + PT4WCREATE_TEST (cancel5 + NEEDS_LINK + DEPENDS cancel3) + + PT4WCREATE_TEST (cancel6a + NEEDS_LINK + DEPENDS cancel3) + + PT4WCREATE_TEST (cancel6d + NEEDS_LINK + DEPENDS cancel3) + + PT4WCREATE_TEST (cancel7 + NEEDS_LINK + DEPENDS cancel3 kill1) + + PT4WCREATE_TEST (cancel8 + NEEDS_LINK + DEPENDS cleanup0 condvar4 kill1) + + PT4WCREATE_TEST (cancel9 + NEEDS_LINK + ADITIONAL_LIB ws2_32 + DEPENDS cancel3) + + PT4WCREATE_TEST (cleanup0 + NEEDS_LINK + DEPENDS cancel3) + + PT4WCREATE_TEST (cleanup1 + NEEDS_LINK + DEPENDS cleanup0) + + PT4WCREATE_TEST (cleanup2 + NEEDS_LINK + DEPENDS cleanup0) + + PT4WCREATE_TEST (cleanup3 + NEEDS_LINK + DEPENDS cleanup0) + + PT4WCREATE_TEST (condvar1 NEEDS_LINK) + + PT4WCREATE_TEST (condvar1_1 + NEEDS_LINK + DEPENDS condvar1) + + PT4WCREATE_TEST (condvar1_2 + NEEDS_LINK + DEPENDS condvar1 join0) + + PT4WCREATE_TEST (condvar2 + NEEDS_LINK + DEPENDS condvar1 mutex1) -if (PTHREADS4W_BUILD_CE) - list (APPEND SUFFIXES "CE") + PT4WCREATE_TEST (condvar2_1 + NEEDS_LINK + DEPENDS condvar2 join0) + + PT4WCREATE_TEST (condvar3 + NEEDS_LINK + DEPENDS condvar2 join0 self1) + + PT4WCREATE_TEST (condvar3_1 + NEEDS_LINK + DEPENDS condvar3) + + PT4WCREATE_TEST (condvar3_2 + NEEDS_LINK + DEPENDS condvar5) + + PT4WCREATE_TEST (condvar3_3 + NEEDS_LINK + DEPENDS condvar3) + + PT4WCREATE_TEST (condvar4 + NEEDS_LINK + DEPENDS condvar3) + + PT4WCREATE_TEST (condvar5 + NEEDS_LINK + DEPENDS condvar4) + + PT4WCREATE_TEST (condvar6 + NEEDS_LINK + DEPENDS condvar5) + + PT4WCREATE_TEST (condvar7 + NEEDS_LINK + DEPENDS condvar5) + + PT4WCREATE_TEST (condvar8 + NEEDS_LINK + DEPENDS condvar5) + + PT4WCREATE_TEST (condvar9 + NEEDS_LINK + DEPENDS condvar5) + + PT4WCREATE_TEST (context1 + NEEDS_LINK + DEPENDS create1 exit1) + + PT4WCREATE_TEST (count1 + NEEDS_LINK + DEPENDS join0 mutex1) + + PT4WCREATE_TEST (create1 NEEDS_LINK) + + PT4WCREATE_TEST (create2 + NEEDS_LINK + DEPENDS join0) + + PT4WCREATE_TEST (create3 + NEEDS_LINK + DEPENDS create2) + + PT4WCREATE_TEST (delay1 NEEDS_LINK) + + PT4WCREATE_TEST (delay2 + NEEDS_LINK + DEPENDS cleanup0 delay1) + + PT4WCREATE_TEST (detach1 + NEEDS_LINK + DEPENDS create1 exit1 kill1) + + PT4WCREATE_TEST (equal0 + NEEDS_LINK + DEPENDS self1) + + PT4WCREATE_TEST (equal1 + NEEDS_LINK + DEPENDS create1 equal0) + + PT4WCREATE_TEST (errno0 + NEEDS_LINK + DEPENDS semaphore5) + + PT4WCREATE_TEST (errno1 + NEEDS_LINK + DEPENDS create1 mutex1 self1) + + PT4WCREATE_TEST (exception1 + NEEDS_LINK + DEPENDS cancel3 self1) + + PT4WCREATE_TEST (exception2 + NEEDS_LINK + DEPENDS exception1) + +if("${SUFFIXES}" STREQUAL "CE") + PT4WCREATE_TEST (exception3 + NEEDS_LINK + NEEDS_ROOT_INCL + DEPENDS exception1 exit1 mutex5) +else() + PT4WCREATE_TEST (exception3 + NEEDS_ROOT_INCL + DEPENDS exception1 exit1 mutex5) endif() -if (PTHREADS4W_BUILD_SE) - list (APPEND SUFFIXES "SE") + PT4WCREATE_TEST (exception3_0 + NEEDS_ROOT_INCL + DEPENDS exception3) + + PT4WCREATE_TEST (exit1 NEEDS_LINK) + + PT4WCREATE_TEST (exit2 + NEEDS_LINK + DEPENDS create1 exit1) + + PT4WCREATE_TEST (exit3 + NEEDS_LINK + DEPENDS create1 exit1) + + PT4WCREATE_TEST (exit4 + NEEDS_LINK + DEPENDS cancel3 exit1) + + PT4WCREATE_TEST (exit5 + NEEDS_LINK + DEPENDS cancel3 exit1 kill1) + + PT4WCREATE_TEST (exit6 NEEDS_LINK) + + PT4WCREATE_TEST (eyal1 + NEEDS_LINK + DEPENDS join0 mutex3) + + PT4WCREATE_TEST (inherit1 + NEEDS_LINK + DEPENDS join0 priority1) + + PT4WCREATE_TEST (join0 + NEEDS_LINK + DEPENDS create1 exit1) + + PT4WCREATE_TEST (join1 + NEEDS_LINK + DEPENDS join0) + + PT4WCREATE_TEST (join2 + NEEDS_LINK + DEPENDS join0) + + PT4WCREATE_TEST (join3 + NEEDS_LINK + DEPENDS join0) + + PT4WCREATE_TEST (join4 + NEEDS_LINK + DEPENDS create1) + + PT4WCREATE_TEST (kill1 + NEEDS_LINK + DEPENDS self1) + + PT4WCREATE_TEST (mutex1 NEEDS_LINK) + + PT4WCREATE_TEST (mutex1e + NEEDS_LINK + DEPENDS mutex1 mutex5) + + PT4WCREATE_TEST (mutex1n + NEEDS_LINK + DEPENDS mutex1 mutex5) + + PT4WCREATE_TEST (mutex1r + NEEDS_LINK + DEPENDS mutex1 mutex5) + + PT4WCREATE_TEST (mutex2 + NEEDS_LINK + DEPENDS mutex1) + + PT4WCREATE_TEST (mutex2e + NEEDS_LINK + DEPENDS mutex1) + + PT4WCREATE_TEST (mutex2r + NEEDS_LINK + DEPENDS mutex1) + + PT4WCREATE_TEST (mutex3 + NEEDS_LINK + DEPENDS join0 mutex1) + + PT4WCREATE_TEST (mutex3e + NEEDS_LINK + DEPENDS join0 mutex3) + + PT4WCREATE_TEST (mutex3r + NEEDS_LINK + DEPENDS join0 mutex3) + + PT4WCREATE_TEST (mutex4 + NEEDS_LINK + DEPENDS join0 mutex3 mutex5) + + PT4WCREATE_TEST (mutex5 NEEDS_LINK) + + PT4WCREATE_TEST (mutex6 + NEEDS_LINK + DEPENDS create1 mutex3) + + PT4WCREATE_TEST (mutex6e + NEEDS_LINK + DEPENDS join0 mutex1 mutex5) + + PT4WCREATE_TEST (mutex6es + NEEDS_LINK + DEPENDS join0 mutex1 mutex5) + + PT4WCREATE_TEST (mutex6n + NEEDS_LINK + DEPENDS create1 mutex1 mutex5) + + PT4WCREATE_TEST (mutex6r + NEEDS_LINK + DEPENDS join0 mutex1 mutex5) + + PT4WCREATE_TEST (mutex6rs + NEEDS_LINK + DEPENDS join0 mutex1 mutex5) + + PT4WCREATE_TEST (mutex6s + NEEDS_LINK + DEPENDS create3) + + PT4WCREATE_TEST (mutex7 + NEEDS_LINK + DEPENDS create1 mutex3) + + PT4WCREATE_TEST (mutex7e + NEEDS_LINK + DEPENDS join0 mutex3 mutex5) + + PT4WCREATE_TEST (mutex7n + NEEDS_LINK + DEPENDS create1 mutex3 mutex5) + + PT4WCREATE_TEST (mutex7r + NEEDS_LINK + DEPENDS join0 mutex3 mutex5) + + PT4WCREATE_TEST (mutex8 + NEEDS_LINK + DEPENDS create1 mutex1) + + PT4WCREATE_TEST (mutex8e + NEEDS_LINK + DEPENDS create1 mutex5 mutex8) + + PT4WCREATE_TEST (mutex8n + NEEDS_LINK + DEPENDS create1 mutex5 mutex8) + + PT4WCREATE_TEST (mutex8r + NEEDS_LINK + DEPENDS create1 mutex5 mutex8) + + PT4WCREATE_TEST (name_np1 + NEEDS_LINK + DEPENDS barrier1 join0 self1) + + PT4WCREATE_TEST (name_np2 + NEEDS_LINK + DEPENDS name_np1) + + PT4WCREATE_TEST (once1 + NEEDS_LINK + DEPENDS create1) + + PT4WCREATE_TEST (once2 + NEEDS_LINK + DEPENDS join0 once1) + + PT4WCREATE_TEST (once3 + NEEDS_LINK + DEPENDS cancel3 once1 self1) + + PT4WCREATE_TEST (once4 + NEEDS_LINK + DEPENDS cleanup0 once1 priority1) + + find_package(OpenMP QUIET) + + if(OpenMP_FOUND) + PT4WCREATE_TEST (openmp1 + NEEDS_LINK + NEEDS_OPENMP) + endif() + + PT4WCREATE_TEST (priority1 + NEEDS_LINK + DEPENDS join0 self1) + + PT4WCREATE_TEST (priority2 + NEEDS_LINK + DEPENDS barrier1 inherit1 join0) + + PT4WCREATE_TEST (reinit1 + NEEDS_LINK + DEPENDS join0 rwlock3 sequence1) + + PT4WCREATE_TEST (reuse1 + NEEDS_LINK + DEPENDS equal0 join0) + + PT4WCREATE_TEST (reuse2 + NEEDS_LINK + DEPENDS create2) + + PT4WCREATE_TEST (robust1 + NEEDS_LINK + DEPENDS join0 mutex1 mutex5) + + PT4WCREATE_TEST (robust2 + NEEDS_LINK + DEPENDS join0 mutex1 mutex5) + + PT4WCREATE_TEST (robust3 + NEEDS_LINK + DEPENDS join0 mutex1 mutex5) + + PT4WCREATE_TEST (robust4 + NEEDS_LINK + DEPENDS join0 mutex1 mutex5) + + PT4WCREATE_TEST (robust5 + NEEDS_LINK + DEPENDS join0 mutex1 mutex5) + + PT4WCREATE_TEST (rwlock1 NEEDS_LINK) + + PT4WCREATE_TEST (rwlock2 + NEEDS_LINK + DEPENDS rwlock1) + + PT4WCREATE_TEST (rwlock2_t + NEEDS_LINK + DEPENDS rwlock2) + + PT4WCREATE_TEST (rwlock3 + NEEDS_LINK + DEPENDS join0 rwlock2) + + PT4WCREATE_TEST (rwlock3_t + NEEDS_LINK + DEPENDS create1 rwlock2) + + PT4WCREATE_TEST (rwlock4 + NEEDS_LINK + DEPENDS join0 rwlock2) + + PT4WCREATE_TEST (rwlock4_t + NEEDS_LINK + DEPENDS create1 rwlock2_t) + + PT4WCREATE_TEST (rwlock5 + NEEDS_LINK + DEPENDS join0 rwlock2) + + PT4WCREATE_TEST (rwlock5_t + NEEDS_LINK + DEPENDS create1 rwlock2_t) + + PT4WCREATE_TEST (rwlock6 + NEEDS_LINK + DEPENDS join0 rwlock3) + + PT4WCREATE_TEST (rwlock6_t + NEEDS_LINK + DEPENDS join0 rwlock2_t rwlock3) + + PT4WCREATE_TEST (rwlock6_t2 + NEEDS_LINK + DEPENDS join0 rwlock2_t rwlock3_t) + + PT4WCREATE_TEST (self1 + NEEDS_LINK + DEPENDS exit6) + + PT4WCREATE_TEST (self2 + NEEDS_LINK + DEPENDS create1 equal0 exit6 self1) + + PT4WCREATE_TEST (semaphore1 + NEEDS_LINK + DEPENDS join0) + + PT4WCREATE_TEST (semaphore2 NEEDS_LINK) + + PT4WCREATE_TEST (semaphore3 + NEEDS_LINK + DEPENDS join0 semaphore2) + + PT4WCREATE_TEST (semaphore4 + NEEDS_LINK + DEPENDS cancel3 semaphore2) + + PT4WCREATE_TEST (semaphore4t + NEEDS_LINK + DEPENDS cancel4 semaphore2) + + PT4WCREATE_TEST (semaphore5 + NEEDS_LINK + DEPENDS join0) + + PT4WCREATE_TEST (sequence1 + NEEDS_LINK + DEPENDS create2 self1) + + PT4WCREATE_TEST (sizes + NEEDS_ROOT_INCL + DEPENDS once1) + + PT4WCREATE_TEST (spin1 NEEDS_LINK) + + PT4WCREATE_TEST (spin2 + NEEDS_LINK + DEPENDS join0 spin1) + + PT4WCREATE_TEST (spin3 + NEEDS_LINK + DEPENDS join0 spin1) + + PT4WCREATE_TEST (spin4 + NEEDS_LINK + DEPENDS join0 spin1) + + PT4WCREATE_TEST (stress1 + NEEDS_LINK + DEPENDS barrier1 condvar4) + + PT4WCREATE_TEST (timeouts + NEEDS_LINK + DEPENDS condvar2 mutex5) + + PT4WCREATE_TEST (tsd1 + NEEDS_LINK + DEPENDS barrier1 exit6 join0 once1 self1) + + PT4WCREATE_TEST (tsd2 + NEEDS_LINK + DEPENDS barrier1 exit6 join0 once1 self1) + + PT4WCREATE_TEST (tsd3 + NEEDS_LINK + DEPENDS barrier1 exit6 join0 once1 self1) + + PT4WCREATE_TEST (valid1 + NEEDS_LINK + DEPENDS join0 kill1) + + PT4WCREATE_TEST (valid2 + NEEDS_LINK + DEPENDS kill1) +endmacro() + +add_test( + NAME pthreads4w_install + COMMAND ${CMAKE_COMMAND} --install ${PTHREADS4W_BINARY_DIR} --prefix + ${CMAKE_CURRENT_BINARY_DIR}/test_install --config $ + WORKING_DIRECTORY ${PTHREADS4W_BINARY_DIR}) + +set_tests_properties(pthreads4w_install + PROPERTIES + FIXTURES_SETUP pthreads4w_install) + +set(GENERATOR ${CMAKE_GENERATOR_PLATFORM}) + +if(GENERATOR) + set(PLATFORM "-A ${GENERATOR}") +endif(GENERATOR) + +if (PTHREADS4W_BUILD_C OR PTHREADS4W_BUILD_SE) + add_subdirectory(c-se/) + + file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_exclude_test_C-SE) + file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_test_C-SE) + file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/find_package_test_C-SE) + + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/add_subdirectory_exclude_test.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_exclude_test_C-SE/CMakeLists.txt + @ONLY) + + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/add_subdirectory_test.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_test_C-SE/CMakeLists.txt + @ONLY) + + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/find_package_test.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/find_package_test_C-SE/CMakeLists.txt + @ONLY) + +# +# add_subdirectory_exclude_test +# + add_test( + NAME pthreads4w_add_subdirectory_exclude_configure_C-SE + COMMAND + ${CMAKE_COMMAND} + ${PLATFORM} + -B${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_exclude_test_build_C-SE + -DCMAKE_BUILD_TYPE=$ + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} + -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/test_install + -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} + -DPTHREADS4W_BUILD_C=${PTHREADS4W_BUILD_C} + -DPTHREADS4W_BUILD_CE=OFF + -DPTHREADS4W_BUILD_SE=${PTHREADS4W_BUILD_S} + -G "${CMAKE_GENERATOR}" + -S${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_exclude_test_C-SE) + + add_test( + NAME pthreads4w_add_subdirectory_exclude_build_C-SE + COMMAND ${CMAKE_COMMAND} --build . --config $ + WORKING_DIRECTORY + ${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_exclude_test_build_C-SE) + + set_tests_properties( + pthreads4w_add_subdirectory_exclude_configure_C-SE + PROPERTIES + FIXTURES_REQUIRED pthreads4w_install + FIXTURES_SETUP asx_config_c-se) + + set_tests_properties( + pthreads4w_add_subdirectory_exclude_build_C-SE + PROPERTIES + FIXTURES_REQUIRED asx_config_c-se + FIXTURES_SETUP asx_build_c-se) + +# +# add_subdirectory_test +# + add_test( + NAME pthreads4w_add_subdirectory_configure_C-SE + COMMAND + ${CMAKE_COMMAND} + ${PLATFORM} + -B${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_test_build_C-SE + -DCMAKE_BUILD_TYPE=$ + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} + -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/test_install + -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} + -DPTHREADS4W_BUILD_C=${PTHREADS4W_BUILD_C} + -DPTHREADS4W_BUILD_CE=OFF + -DPTHREADS4W_BUILD_SE=${PTHREADS4W_BUILD_S} + -G "${CMAKE_GENERATOR}" + -S${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_test_C-SE) + + add_test( + NAME pthreads4w_add_subdirectory_build_C-SE + COMMAND ${CMAKE_COMMAND} --build . --config $ + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_test_build_C-SE) + + set_tests_properties( + pthreads4w_add_subdirectory_configure_C-SE + PROPERTIES + FIXTURES_REQUIRED pthreads4w_install + FIXTURES_SETUP as_config_c-se) + + set_tests_properties( + pthreads4w_add_subdirectory_build_C-SE + PROPERTIES + FIXTURES_REQUIRED as_config_c-se + FIXTURES_SETUP as_build_c-se) + +# +# findpackage_test +# + add_test(NAME pthreads4w_find_package_configure_C-SE + COMMAND + ${CMAKE_COMMAND} + ${PLATFORM} + -B${CMAKE_CURRENT_BINARY_DIR}/findpackage_test_build_C-SE + -DCMAKE_BUILD_TYPE=$ + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} + -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/test_install + -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} + -DPTHREADS4W_BUILD_C=${PTHREADS4W_BUILD_C} + -DPTHREADS4W_BUILD_CE=OFF + -DPTHREADS4W_BUILD_SE=${PTHREADS4W_BUILD_S} + -DPTHREADS4W_ROOT=${CMAKE_CURRENT_BINARY_DIR}/test_install + -G "${CMAKE_GENERATOR}" + -S${CMAKE_CURRENT_BINARY_DIR}/find_package_test_C-SE) + + add_test( + NAME pthreads4w_find_package_build_C-SE + COMMAND ${CMAKE_COMMAND} --build . --config $ + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/findpackage_test_build_C-SE) + + set_tests_properties(pthreads4w_find_package_configure_C-SE + PROPERTIES + FIXTURES_REQUIRED pthreads4w_install + FIXTURES_SETUP fp_config_c-se) + + set_tests_properties(pthreads4w_find_package_build_C-SE + PROPERTIES + FIXTURES_REQUIRED fp_config_c-se + FIXTURES_SETUP fp_build_c-se) endif() -PT4WCREATE_TEST (affinity1 NEEDS_LINK) -PT4WCREATE_TEST (affinity2 NEEDS_LINK) - -PT4WCREATE_TEST (affinity3 - NEEDS_LINK - DEPENDS self1 -) - -PT4WCREATE_TEST (affinity4 - NEEDS_LINK - DEPENDS self1) - -PT4WCREATE_TEST (affinity5 - NEEDS_LINK - DEPENDS join0 self1 -) - -PT4WCREATE_TEST (affinity6 - NEEDS_LINK - DEPENDS join0 self1 -) - -PT4WCREATE_TEST (barrier1 NEEDS_LINK) - -PT4WCREATE_TEST (barrier2 - NEEDS_LINK - DEPENDS barrier1 -) - -PT4WCREATE_TEST (barrier3 - NEEDS_LINK - DEPENDS barrier1 join0 -) - -PT4WCREATE_TEST (barrier4 - NEEDS_LINK - DEPENDS barrier1 join0 mutex1 -) - -PT4WCREATE_TEST (barrier5 - NEEDS_LINK - DEPENDS barrier1 join0 -) - -PT4WCREATE_TEST (barrier6 - NEEDS_LINK - DEPENDS barrier1 join0 mutex1 -) - -PT4WCREATE_TEST (benchtest1 - NEEDS_LINK - ADDITIONAL_SOURCE benchlib.c - DEPENDS mutex5 -) - -PT4WCREATE_TEST (benchtest2 - NEEDS_LINK - ADDITIONAL_SOURCE benchlib.c - DEPENDS join0 mutex5 -) - -PT4WCREATE_TEST (benchtest3 - NEEDS_LINK - ADDITIONAL_SOURCE benchlib.c - DEPENDS join0 mutex3 mutex5 -) - -PT4WCREATE_TEST (benchtest4 - NEEDS_LINK - ADDITIONAL_SOURCE benchlib.c - DEPENDS mutex3 mutex5 -) - -PT4WCREATE_TEST (benchtest5 - NEEDS_LINK - DEPENDS semaphore5 -) - -PT4WCREATE_TEST (cancel1 - NEEDS_LINK - DEPENDS create1 self1 -) - -PT4WCREATE_TEST (cancel3 - NEEDS_LINK - DEPENDS cancel1 join0 mutex1 -)#- quserex.dll and alertdrv.sys are not available. - -PT4WCREATE_TEST (cancel4 - NEEDS_LINK - DEPENDS cancel3 -) - -PT4WCREATE_TEST (cancel5 - NEEDS_LINK - DEPENDS cancel3 -) - -PT4WCREATE_TEST (cancel6a - NEEDS_LINK - DEPENDS cancel3 -) - -PT4WCREATE_TEST (cancel6d - NEEDS_LINK - DEPENDS cancel3 -) - -PT4WCREATE_TEST (cancel7 - NEEDS_LINK - DEPENDS cancel3 kill1 -) - -PT4WCREATE_TEST (cancel8 - NEEDS_LINK - DEPENDS cleanup0 condvar4 kill1 -) - -PT4WCREATE_TEST (cancel9 - NEEDS_LINK - ADITIONAL_LIB ws2_32 - DEPENDS cancel3 -) - -PT4WCREATE_TEST (cleanup0 - NEEDS_LINK - DEPENDS cancel3 -) - -PT4WCREATE_TEST (cleanup1 - NEEDS_LINK - DEPENDS cleanup0 -) - -PT4WCREATE_TEST (cleanup2 - NEEDS_LINK - DEPENDS cleanup0 -) - -PT4WCREATE_TEST (cleanup3 - NEEDS_LINK - DEPENDS cleanup0 -) - -PT4WCREATE_TEST (condvar1 NEEDS_LINK) - -PT4WCREATE_TEST (condvar1_1 - NEEDS_LINK - DEPENDS condvar1 -) - -PT4WCREATE_TEST (condvar1_2 - NEEDS_LINK - DEPENDS condvar1 join0 -) - -PT4WCREATE_TEST (condvar2 - NEEDS_LINK - DEPENDS condvar1 mutex1 -) - -PT4WCREATE_TEST (condvar2_1 - NEEDS_LINK - DEPENDS condvar2 join0 -) - -PT4WCREATE_TEST (condvar3 - NEEDS_LINK - DEPENDS condvar2 join0 self1 -) - -PT4WCREATE_TEST (condvar3_1 - NEEDS_LINK - DEPENDS condvar3 -) - -PT4WCREATE_TEST (condvar3_2 - NEEDS_LINK - DEPENDS condvar5 -) - -PT4WCREATE_TEST (condvar3_3 - NEEDS_LINK - DEPENDS condvar3 -) - -PT4WCREATE_TEST (condvar4 - NEEDS_LINK - DEPENDS condvar3 -) - -PT4WCREATE_TEST (condvar5 - NEEDS_LINK - DEPENDS condvar4 -) - -PT4WCREATE_TEST (condvar6 - NEEDS_LINK - DEPENDS condvar5 -) - -PT4WCREATE_TEST (condvar7 - NEEDS_LINK - DEPENDS condvar5 -) - -PT4WCREATE_TEST (condvar8 - NEEDS_LINK - DEPENDS condvar5 -) - -PT4WCREATE_TEST (condvar9 - NEEDS_LINK - DEPENDS condvar5 -) - -PT4WCREATE_TEST (context1 - NEEDS_LINK - DEPENDS create1 exit1 -) - -PT4WCREATE_TEST (count1 - NEEDS_LINK - DEPENDS join0 mutex1 -) - -PT4WCREATE_TEST (create1 NEEDS_LINK) - -PT4WCREATE_TEST (create2 - NEEDS_LINK - DEPENDS join0 -) - -PT4WCREATE_TEST (create3 - NEEDS_LINK - DEPENDS create2 -) - -PT4WCREATE_TEST (delay1 NEEDS_LINK) - -PT4WCREATE_TEST (delay2 - NEEDS_LINK - DEPENDS cleanup0 delay1 -) - -PT4WCREATE_TEST (detach1 - NEEDS_LINK - DEPENDS create1 exit1 kill1 -) - -PT4WCREATE_TEST (equal0 - NEEDS_LINK - DEPENDS self1 -) - -PT4WCREATE_TEST (equal1 - NEEDS_LINK - DEPENDS create1 equal0 -) - -PT4WCREATE_TEST (errno0 - NEEDS_LINK - DEPENDS semaphore5 -) - -PT4WCREATE_TEST (errno1 - NEEDS_LINK - DEPENDS create1 mutex1 self1 -) - -PT4WCREATE_TEST (exception1 - NEEDS_LINK - DEPENDS cancel3 self1 -) - -PT4WCREATE_TEST (exception2 - NEEDS_LINK - DEPENDS exception1 -) - -PT4WCREATE_TEST (exception3 - NEEDS_ROOT_INCL - DEPENDS exception1 exit1 mutex5 -) - -PT4WCREATE_TEST (exception3_0 - NEEDS_ROOT_INCL - DEPENDS exception3 -) - -PT4WCREATE_TEST (exit1 NEEDS_LINK) - -PT4WCREATE_TEST (exit2 - NEEDS_LINK - DEPENDS create1 exit1 -) - -PT4WCREATE_TEST (exit3 - NEEDS_LINK - DEPENDS create1 exit1 -) - -PT4WCREATE_TEST (exit4 - NEEDS_LINK - DEPENDS cancel3 exit1 -) - -PT4WCREATE_TEST (exit5 - NEEDS_LINK - DEPENDS cancel3 exit1 kill1 -) - -PT4WCREATE_TEST (exit6 NEEDS_LINK) - -PT4WCREATE_TEST (eyal1 - NEEDS_LINK - DEPENDS join0 mutex3 -) - -PT4WCREATE_TEST (inherit1 - NEEDS_LINK - DEPENDS join0 priority1 -) - -PT4WCREATE_TEST (join0 - NEEDS_LINK - DEPENDS create1 exit1 -) - -PT4WCREATE_TEST (join1 - NEEDS_LINK - DEPENDS join0 -) - -PT4WCREATE_TEST (join2 - NEEDS_LINK - DEPENDS join0 -) - -PT4WCREATE_TEST (join3 - NEEDS_LINK - DEPENDS join0 -) - -PT4WCREATE_TEST (join4 - NEEDS_LINK - DEPENDS create1 -) - -PT4WCREATE_TEST (kill1 - NEEDS_LINK - DEPENDS self1 -) - -PT4WCREATE_TEST (mutex1 NEEDS_LINK) - -PT4WCREATE_TEST (mutex1e - NEEDS_LINK - DEPENDS mutex1 mutex5 -) - -PT4WCREATE_TEST (mutex1n - NEEDS_LINK - DEPENDS mutex1 mutex5 -) - -PT4WCREATE_TEST (mutex1r - NEEDS_LINK - DEPENDS mutex1 mutex5 -) - -PT4WCREATE_TEST (mutex2 - NEEDS_LINK - DEPENDS mutex1 -) - -PT4WCREATE_TEST (mutex2e - NEEDS_LINK - DEPENDS mutex1 -) - -PT4WCREATE_TEST (mutex2r - NEEDS_LINK - DEPENDS mutex1 -) - -PT4WCREATE_TEST (mutex3 - NEEDS_LINK - DEPENDS join0 mutex1 -) - -PT4WCREATE_TEST (mutex3e - NEEDS_LINK - DEPENDS join0 mutex3 -) - -PT4WCREATE_TEST (mutex3r - NEEDS_LINK - DEPENDS join0 mutex3 -) - -PT4WCREATE_TEST (mutex4 - NEEDS_LINK - DEPENDS join0 mutex3 mutex5 -) - -PT4WCREATE_TEST (mutex5 NEEDS_LINK) - -PT4WCREATE_TEST (mutex6 - NEEDS_LINK - DEPENDS create1 mutex3 -) - -PT4WCREATE_TEST (mutex6e - NEEDS_LINK - DEPENDS join0 mutex1 mutex5 -) - -PT4WCREATE_TEST (mutex6es - NEEDS_LINK - DEPENDS join0 mutex1 mutex5 -) - -PT4WCREATE_TEST (mutex6n - NEEDS_LINK - DEPENDS create1 mutex1 mutex5 -) - -PT4WCREATE_TEST (mutex6r - NEEDS_LINK - DEPENDS join0 mutex1 mutex5 -) - -PT4WCREATE_TEST (mutex6rs - NEEDS_LINK - DEPENDS join0 mutex1 mutex5 -) - -PT4WCREATE_TEST (mutex6s - NEEDS_LINK - DEPENDS create3 -) - -PT4WCREATE_TEST (mutex7 - NEEDS_LINK - DEPENDS create1 mutex3 -) - -PT4WCREATE_TEST (mutex7e - NEEDS_LINK - DEPENDS join0 mutex3 mutex5 -) - -PT4WCREATE_TEST (mutex7n - NEEDS_LINK - DEPENDS create1 mutex3 mutex5 -) - -PT4WCREATE_TEST (mutex7r - NEEDS_LINK - DEPENDS join0 mutex3 mutex5 -) - -PT4WCREATE_TEST (mutex8 - NEEDS_LINK - DEPENDS create1 mutex1 -) - -PT4WCREATE_TEST (mutex8e - NEEDS_LINK - DEPENDS create1 mutex5 mutex8 -) - -PT4WCREATE_TEST (mutex8n - NEEDS_LINK - DEPENDS create1 mutex5 mutex8 -) - -PT4WCREATE_TEST (mutex8r - NEEDS_LINK - DEPENDS create1 mutex5 mutex8 -) - -PT4WCREATE_TEST (name_np1 - NEEDS_LINK - DEPENDS barrier1 join0 self1 -) - -PT4WCREATE_TEST (name_np2 - NEEDS_LINK - DEPENDS name_np1 -) - -PT4WCREATE_TEST (once1 - NEEDS_LINK - DEPENDS create1 -) - -PT4WCREATE_TEST (once2 - NEEDS_LINK - DEPENDS join0 once1 -) - -PT4WCREATE_TEST (once3 - NEEDS_LINK - DEPENDS cancel3 once1 self1 -) - -PT4WCREATE_TEST (once4 - NEEDS_LINK - DEPENDS cleanup0 once1 priority1 -) - -PT4WCREATE_TEST (priority1 - NEEDS_LINK - DEPENDS join0 self1 -) - -PT4WCREATE_TEST (priority2 - NEEDS_LINK - DEPENDS barrier1 inherit1 join0 -) - -PT4WCREATE_TEST (reinit1 - NEEDS_LINK - DEPENDS join0 rwlock3 sequence1 -) - -PT4WCREATE_TEST (reuse1 - NEEDS_LINK - DEPENDS equal0 join0 -) - -PT4WCREATE_TEST (reuse2 - NEEDS_LINK - DEPENDS create2 -) - -PT4WCREATE_TEST (robust1 - NEEDS_LINK - DEPENDS join0 mutex1 mutex5 -) - -PT4WCREATE_TEST (robust2 - NEEDS_LINK - DEPENDS join0 mutex1 mutex5 -) - -PT4WCREATE_TEST (robust3 - NEEDS_LINK - DEPENDS join0 mutex1 mutex5 -) - -PT4WCREATE_TEST (robust4 - NEEDS_LINK - DEPENDS join0 mutex1 mutex5 -) - -PT4WCREATE_TEST (robust5 - NEEDS_LINK - DEPENDS join0 mutex1 mutex5 -) - -PT4WCREATE_TEST (rwlock1 NEEDS_LINK) - -PT4WCREATE_TEST (rwlock2 - NEEDS_LINK - DEPENDS rwlock1 -) - -PT4WCREATE_TEST (rwlock2_t - NEEDS_LINK - DEPENDS rwlock2 -) - -PT4WCREATE_TEST (rwlock3 - NEEDS_LINK - DEPENDS join0 rwlock2 -) - -PT4WCREATE_TEST (rwlock3_t - NEEDS_LINK - DEPENDS create1 rwlock2 -) - -PT4WCREATE_TEST (rwlock4 - NEEDS_LINK - DEPENDS join0 rwlock2 -) - -PT4WCREATE_TEST (rwlock4_t - NEEDS_LINK - DEPENDS create1 rwlock2_t -) - -PT4WCREATE_TEST (rwlock5 - NEEDS_LINK - DEPENDS join0 rwlock2 -) - -PT4WCREATE_TEST (rwlock5_t - NEEDS_LINK - DEPENDS create1 rwlock2_t -) - -PT4WCREATE_TEST (rwlock6 - NEEDS_LINK - DEPENDS join0 rwlock3 -) - -PT4WCREATE_TEST (rwlock6_t - NEEDS_LINK - DEPENDS join0 rwlock2_t rwlock3 -) - -PT4WCREATE_TEST (rwlock6_t2 - NEEDS_LINK - DEPENDS join0 rwlock2_t rwlock3_t -) - -PT4WCREATE_TEST (self1 - NEEDS_LINK - DEPENDS exit6 -) - -PT4WCREATE_TEST (self2 - NEEDS_LINK - DEPENDS create1 equal0 exit6 self1 -) - -PT4WCREATE_TEST (semaphore1 - NEEDS_LINK - DEPENDS join0 -) - -PT4WCREATE_TEST (semaphore2 NEEDS_LINK) - -PT4WCREATE_TEST (semaphore3 - NEEDS_LINK - DEPENDS join0 semaphore2 -) - -PT4WCREATE_TEST (semaphore4 - NEEDS_LINK - DEPENDS cancel3 semaphore2 -) - -PT4WCREATE_TEST (semaphore4t - NEEDS_LINK - DEPENDS cancel4 semaphore2 -) - -PT4WCREATE_TEST (semaphore5 - NEEDS_LINK - DEPENDS join0 -) - -PT4WCREATE_TEST (sequence1 - NEEDS_LINK - DEPENDS create2 self1 -) - -PT4WCREATE_TEST (sizes - NEEDS_ROOT_INCL - DEPENDS once1 -) - -PT4WCREATE_TEST (spin1 NEEDS_LINK) - -PT4WCREATE_TEST (spin2 - NEEDS_LINK - DEPENDS join0 spin1 -) - -PT4WCREATE_TEST (spin3 - NEEDS_LINK - DEPENDS join0 spin1 -) - -PT4WCREATE_TEST (spin4 - NEEDS_LINK - DEPENDS join0 spin1 -) - -PT4WCREATE_TEST (stress1 - NEEDS_LINK - DEPENDS barrier1 condvar4 -) - -PT4WCREATE_TEST (timeouts - NEEDS_LINK - DEPENDS condvar2 mutex5 -) - -PT4WCREATE_TEST (tsd1 - NEEDS_LINK - DEPENDS barrier1 exit6 join0 once1 self1 -) - -PT4WCREATE_TEST (tsd2 - NEEDS_LINK - DEPENDS barrier1 exit6 join0 once1 self1 -) - -PT4WCREATE_TEST (tsd3 - NEEDS_LINK - DEPENDS barrier1 exit6 join0 once1 self1 -) - -PT4WCREATE_TEST (valid1 - NEEDS_LINK - DEPENDS join0 kill1 -) - -PT4WCREATE_TEST (valid2 - NEEDS_LINK - DEPENDS kill1 -) +if(PTHREADS4W_BUILD_CE) + add_subdirectory(ce/) + + file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_exclude_test_CE) + file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_test_CE) + file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/find_package_test_CE) + + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/add_subdirectory_exclude_test.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_exclude_test_CE/CMakeLists.txt + @ONLY) + + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/add_subdirectory_test.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_test_CE/CMakeLists.txt + @ONLY) + + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/find_package_test.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/find_package_test_CE/CMakeLists.txt + @ONLY) + +# +# add_subdirectory_exclude_test +# + add_test( + NAME pthreads4w_add_subdirectory_exclude_configure_CE + COMMAND + ${CMAKE_COMMAND} + ${PLATFORM} + -B${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_exclude_test_build_CE + -DCMAKE_BUILD_TYPE=$ + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} + -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/test_install + -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} + -DPTHREADS4W_BUILD_C=OFF + -DPTHREADS4W_BUILD_CE=${PTHREADS4W_BUILD_CE} + -DPTHREADS4W_BUILD_SE=OFF + -G "${CMAKE_GENERATOR}" + -S${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_exclude_test_CE) + + add_test( + NAME pthreads4w_add_subdirectory_exclude_build_CE + COMMAND ${CMAKE_COMMAND} --build . --config $ + WORKING_DIRECTORY + ${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_exclude_test_build_CE) + + set_tests_properties( + pthreads4w_add_subdirectory_exclude_configure_CE + PROPERTIES + FIXTURES_REQUIRED pthreads4w_install + FIXTURES_SETUP asx_config_ce) + + set_tests_properties( + pthreads4w_add_subdirectory_exclude_build_CE + PROPERTIES + FIXTURES_REQUIRED asx_config_ce + FIXTURES_SETUP asx_build_ce) + +# +# add_subdirectory_test +# + add_test( + NAME pthreads4w_add_subdirectory_configure_CE + COMMAND + ${CMAKE_COMMAND} + ${PLATFORM} + -B${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_test_build_CE + -DCMAKE_BUILD_TYPE=$ + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} + -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/test_install + -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} + -DPTHREADS4W_BUILD_C=OFF + -DPTHREADS4W_BUILD_CE=${PTHREADS4W_BUILD_CE} + -DPTHREADS4W_BUILD_SE=OFF + -G "${CMAKE_GENERATOR}" + -S${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_test_CE) + + add_test( + NAME pthreads4w_add_subdirectory_build_CE + COMMAND ${CMAKE_COMMAND} --build . --config $ + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/add_subdirectory_test_build_CE) + + set_tests_properties( + pthreads4w_add_subdirectory_configure_CE + PROPERTIES + FIXTURES_REQUIRED pthreads4w_install + FIXTURES_SETUP as_config_ce) + + set_tests_properties( + pthreads4w_add_subdirectory_build_CE + PROPERTIES + FIXTURES_REQUIRED as_config_ce + FIXTURES_SETUP as_build_ce) + +# +# findpackage_test +# + add_test(NAME pthreads4w_find_package_configure_CE + COMMAND + ${CMAKE_COMMAND} + ${PLATFORM} + -B${CMAKE_CURRENT_BINARY_DIR}/findpackage_test_build_CE + -DCMAKE_BUILD_TYPE=$ + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} + -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/test_install + -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM} + -DPTHREADS4W_BUILD_C=OFF + -DPTHREADS4W_BUILD_CE=${PTHREADS4W_BUILD_CE} + -DPTHREADS4W_BUILD_SE=OFF + -DPTHREADS4W_ROOT=${CMAKE_CURRENT_BINARY_DIR}/test_install + -G "${CMAKE_GENERATOR}" + -S${CMAKE_CURRENT_BINARY_DIR}/find_package_test_CE) + + add_test( + NAME pthreads4w_find_package_build_CE + COMMAND ${CMAKE_COMMAND} --build . --config $ + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/findpackage_test_build_CE) + + set_tests_properties(pthreads4w_find_package_configure_CE + PROPERTIES + FIXTURES_REQUIRED pthreads4w_install + FIXTURES_SETUP fp_config_ce) + + set_tests_properties(pthreads4w_find_package_build_CE + PROPERTIES + FIXTURES_REQUIRED fp_config_ce + FIXTURES_SETUP fp_build_ce) +endif() \ No newline at end of file diff --git a/tests/add_subdirectory_exclude_test.cmake.in b/tests/add_subdirectory_exclude_test.cmake.in new file mode 100644 index 0000000..eeebe3d --- /dev/null +++ b/tests/add_subdirectory_exclude_test.cmake.in @@ -0,0 +1,73 @@ +cmake_minimum_required(VERSION 3.11...3.31) + +if(PTHREADS4W_BUILD_CE) + project( + pt4w_add_subdirectory_exclude_test + LANGUAGES CXX + VERSION @PTHREADS4W_VERSION@) + + set(PTW32_TEST_SRC_FILE "${CMAKE_BINARY_DIR}/ptw32_test.cpp") +else() + project( + pt4w_add_subdirectory_exclude_test + LANGUAGES C + VERSION @PTHREADS4W_VERSION@) + + set(PTW32_TEST_SRC_FILE "${CMAKE_BINARY_DIR}/ptw32_test.c") +endif() + +option(PTHREADS4W_BUILD_TESTING "" OFF) +option(PTHREADS4W_BUILD_SHARED "" @PTHREADS4W_BUILD_SHARED@) +option(PTHREADS4W_BUILD_STATIC "" @PTHREADS4W_BUILD_STATIC@) + +file(WRITE "${PTW32_TEST_SRC_FILE}" " +#include + +int main(void) { + pthread_mutex_t m; + pthread_mutex_init(&m, 0); + pthread_mutex_destroy(&m); + return 0; +} +") + +add_subdirectory(@PTHREADS4W_SOURCE_DIR@ + ${CMAKE_CURRENT_BINARY_DIR}/pt4w + EXCLUDE_FROM_ALL) + +if(PTHREADS4W_BUILD_SHARED) + if(PTHREADS4W_BUILD_C) + add_executable(test_C ${PTW32_TEST_SRC_FILE}) + target_link_libraries(test_C Threads::Threads) + + add_executable(test_CS ${PTW32_TEST_SRC_FILE}) + target_link_libraries(test_CS Threads::Shared) + endif() + + if(PTHREADS4W_BUILD_CE) + add_executable(test_CE ${PTW32_TEST_SRC_FILE}) + target_link_libraries(test_CE Threads::CEShared) + endif() + + if(PTHREADS4W_BUILD_SE) + add_executable(test_SE ${PTW32_TEST_SRC_FILE}) + target_link_libraries(test_SE Threads::SEShared) + endif() +endif(PTHREADS4W_BUILD_SHARED) + +if(PTHREADS4W_BUILD_STATIC) + if(PTHREADS4W_BUILD_C) + add_executable(test_CStatic ${PTW32_TEST_SRC_FILE}) + target_link_libraries(test_CStatic Threads::Static) + endif() + + if(PTHREADS4W_BUILD_CE) + add_executable(test_CEStatic ${PTW32_TEST_SRC_FILE}) + target_link_libraries(test_CEStatic Threads::CEStatic) + endif() + + if(PTHREADS4W_BUILD_SE) + add_executable(test_SEStatic ${PTW32_TEST_SRC_FILE}) + target_link_libraries(test_SEStatic Threads::SEStatic) + endif() +endif(PTHREADS4W_BUILD_STATIC) \ No newline at end of file diff --git a/tests/add_subdirectory_test.cmake.in b/tests/add_subdirectory_test.cmake.in new file mode 100644 index 0000000..e39e040 --- /dev/null +++ b/tests/add_subdirectory_test.cmake.in @@ -0,0 +1,72 @@ +cmake_minimum_required(VERSION 3.11...3.31) + +if(PTHREADS4W_BUILD_CE) + project( + pt4w_add_subdirectory_test + LANGUAGES CXX + VERSION @PTHREADS4W_VERSION@) + + set(PTW32_TEST_SRC_FILE "${CMAKE_BINARY_DIR}/ptw32_test.cpp") +else() + project( + pt4w_add_subdirectory_test + LANGUAGES C + VERSION @PTHREADS4W_VERSION@) + + set(PTW32_TEST_SRC_FILE "${CMAKE_BINARY_DIR}/ptw32_test.c") +endif() + +option(PTHREADS4W_BUILD_TESTING "" OFF) +option(PTHREADS4W_BUILD_SHARED "" @PTHREADS4W_BUILD_SHARED@) +option(PTHREADS4W_BUILD_STATIC "" @PTHREADS4W_BUILD_STATIC@) + +file(WRITE "${PTW32_TEST_SRC_FILE}" " +#include + +int main(void) { + pthread_mutex_t m; + pthread_mutex_init(&m, 0); + pthread_mutex_destroy(&m); + return 0; +} +") + +add_subdirectory(@PTHREADS4W_SOURCE_DIR@ + ${CMAKE_CURRENT_BINARY_DIR}/pt4w) + +if(PTHREADS4W_BUILD_SHARED) + if(PTHREADS4W_BUILD_C) + add_executable(test_C ${PTW32_TEST_SRC_FILE}) + target_link_libraries(test_C Threads::Threads) + + add_executable(test_CS ${PTW32_TEST_SRC_FILE}) + target_link_libraries(test_CS Threads::Shared) + endif() + + if(PTHREADS4W_BUILD_CE) + add_executable(test_CE ${PTW32_TEST_SRC_FILE}) + target_link_libraries(test_CE Threads::CEShared) + endif() + + if(PTHREADS4W_BUILD_SE) + add_executable(test_SE ${PTW32_TEST_SRC_FILE}) + target_link_libraries(test_SE Threads::SEShared) + endif() +endif(PTHREADS4W_BUILD_SHARED) + +if(PTHREADS4W_BUILD_STATIC) + if(PTHREADS4W_BUILD_C) + add_executable(test_CStatic ${PTW32_TEST_SRC_FILE}) + target_link_libraries(test_CStatic Threads::Static) + endif() + + if(PTHREADS4W_BUILD_CE) + add_executable(test_CEStatic ${PTW32_TEST_SRC_FILE}) + target_link_libraries(test_CEStatic Threads::CEStatic) + endif() + + if(PTHREADS4W_BUILD_SE) + add_executable(test_SEStatic ${PTW32_TEST_SRC_FILE}) + target_link_libraries(test_SEStatic Threads::SEStatic) + endif() +endif(PTHREADS4W_BUILD_STATIC) \ No newline at end of file diff --git a/tests/benchtest1.c b/tests/benchtest1.c index 23e8d72..f392ef6 100644 --- a/tests/benchtest1.c +++ b/tests/benchtest1.c @@ -74,7 +74,7 @@ int iter; void -runTest (char * testNameString, int mType) +runTest (const char * testNameString, int mType) { #ifdef __PTW32_MUTEX_TYPES assert(pthread_mutexattr_settype(&ma, mType) == 0); diff --git a/tests/benchtest2.c b/tests/benchtest2.c index e28c10e..4666d0a 100644 --- a/tests/benchtest2.c +++ b/tests/benchtest2.c @@ -138,7 +138,7 @@ CSThread(void * arg) } void -runTest (char * testNameString, int mType) +runTest (const char * testNameString, int mType) { #ifdef __PTW32_MUTEX_TYPES assert(pthread_mutexattr_settype(&ma, mType) == 0); diff --git a/tests/benchtest3.c b/tests/benchtest3.c index 1bc5a04..3dd54e3 100644 --- a/tests/benchtest3.c +++ b/tests/benchtest3.c @@ -93,7 +93,7 @@ oldTrylockThread (void * arg) void -runTest (char * testNameString, int mType) +runTest (const char * testNameString, int mType) { pthread_t t; diff --git a/tests/benchtest4.c b/tests/benchtest4.c index 51cd256..7a2b82a 100644 --- a/tests/benchtest4.c +++ b/tests/benchtest4.c @@ -77,7 +77,7 @@ oldRunTest (char * testNameString, int mType) void -runTest (char * testNameString, int mType) +runTest (const char * testNameString, int mType) { #ifdef __PTW32_MUTEX_TYPES pthread_mutexattr_settype(&ma, mType); diff --git a/tests/benchtest5.c b/tests/benchtest5.c index d4fd515..ebadde6 100644 --- a/tests/benchtest5.c +++ b/tests/benchtest5.c @@ -72,7 +72,7 @@ int zero = 0; void -reportTest (char * testNameString) +reportTest (const char * testNameString) { durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; diff --git a/tests/c-se/CMakeLists.txt b/tests/c-se/CMakeLists.txt new file mode 100644 index 0000000..3739d0f --- /dev/null +++ b/tests/c-se/CMakeLists.txt @@ -0,0 +1,13 @@ +project (PTHREADS4W_C_SE-Tests + VERSION 3.0.3.0 + LANGUAGES C) + +if (PTHREADS4W_BUILD_C) + list (APPEND SUFFIXES "C") +endif() + +if (PTHREADS4W_BUILD_SE) + list (APPEND SUFFIXES "SE") +endif() + +PT4W_make_tests() \ No newline at end of file diff --git a/tests/ce/CMakeLists.txt b/tests/ce/CMakeLists.txt new file mode 100644 index 0000000..da1cb12 --- /dev/null +++ b/tests/ce/CMakeLists.txt @@ -0,0 +1,9 @@ +project (PTHREADS4W_C_SE-Tests + VERSION 3.0.3.0 + LANGUAGES CXX) + +string(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + +set(SUFFIXES "CE") + +PT4W_make_tests() \ No newline at end of file diff --git a/tests/exception3.c b/tests/exception3.c index f7ae311..b035d35 100644 --- a/tests/exception3.c +++ b/tests/exception3.c @@ -85,7 +85,7 @@ # if defined(__GNUC__) && __GNUC__ < 3 # include # else -# include +# include using std::set_terminate; # endif #endif diff --git a/tests/exception3_0.c b/tests/exception3_0.c index b331de7..da9e271 100644 --- a/tests/exception3_0.c +++ b/tests/exception3_0.c @@ -85,7 +85,7 @@ # if defined(__GNUC__) && __GNUC__ < 3 # include # else -# include +# include using std::set_terminate; # endif #endif diff --git a/tests/find_package_test.cmake.in b/tests/find_package_test.cmake.in new file mode 100644 index 0000000..9f80a25 --- /dev/null +++ b/tests/find_package_test.cmake.in @@ -0,0 +1,82 @@ +cmake_minimum_required(VERSION 3.11...3.31) + +if(PTHREADS4W_BUILD_CE) + project( + pt4w_find_package_test + LANGUAGES CXX + VERSION @PTHREADS4W_VERSION@) + + set(PTW32_TEST_SRC_FILE "${CMAKE_BINARY_DIR}/ptw32_test.cpp") +else() + project( + pt4w_find_package_test + LANGUAGES C + VERSION @PTHREADS4W_VERSION@) + + set(PTW32_TEST_SRC_FILE "${CMAKE_BINARY_DIR}/ptw32_test.c") +endif() + +option(PTHREADS4W_BUILD_SHARED "" @PTHREADS4W_BUILD_SHARED@) +option(PTHREADS4W_BUILD_STATIC "" @PTHREADS4W_BUILD_STATIC@) + +find_package(PTHREADS4W @PTHREADS4W_VERSION@ CONFIG REQUIRED) + +file(WRITE "${PTW32_TEST_SRC_FILE}" " +#include + +int main(void) { + pthread_mutex_t m; + pthread_mutex_init(&m, 0); + pthread_mutex_destroy(&m); + return 0; +} +") + +if(PTHREADS4W_BUILD_SHARED) + if(PTHREADS4W_BUILD_C) + add_executable(test_C ${PTW32_TEST_SRC_FILE}) + target_link_libraries(test_C Threads::Threads) + + target_compile_definitions (test_C + PRIVATE __PTW32_CLEANUP_C) + + add_executable(test_CS ${PTW32_TEST_SRC_FILE}) + target_link_libraries(test_CS Threads::Shared) + + target_compile_definitions (test_CS + PRIVATE __PTW32_CLEANUP_C) + endif() + + if(PTHREADS4W_BUILD_CE) + add_executable(test_CE ${PTW32_TEST_SRC_FILE}) + target_link_libraries(test_CE Threads::CEShared) + + target_compile_definitions (test_CE + PRIVATE __PTW32_CLEANUP_CXX>) + endif() + + if(PTHREADS4W_BUILD_SE) + add_executable(test_SE ${PTW32_TEST_SRC_FILE}) + target_link_libraries(test_SE Threads::SEShared) + + target_compile_definitions (test_SE + PRIVATE __PTW32_CLEANUP_SEH) + endif() +endif(PTHREADS4W_BUILD_SHARED) + +if(PTHREADS4W_BUILD_STATIC) + if(PTHREADS4W_BUILD_C) + add_executable(test_CStatic ${PTW32_TEST_SRC_FILE}) + target_link_libraries(test_CStatic Threads::Static) + endif() + + if(PTHREADS4W_BUILD_CE) + add_executable(test_CEStatic ${PTW32_TEST_SRC_FILE}) + target_link_libraries(test_CEStatic Threads::CEStatic) + endif() + + if(PTHREADS4W_BUILD_SE) + add_executable(test_SEStatic ${PTW32_TEST_SRC_FILE}) + target_link_libraries(test_SEStatic Threads::SEStatic) + endif() +endif(PTHREADS4W_BUILD_STATIC) \ No newline at end of file diff --git a/tests/openmp1.c b/tests/openmp1.c old mode 100755 new mode 100644 index b5791e2..0bcc907 --- a/tests/openmp1.c +++ b/tests/openmp1.c @@ -1,10 +1,25 @@ #include #include -#ifdef _OPENMP -# include -#endif +#include #include +#if defined(_MSC_VER) && !defined(__clang__) + +/* MSVC OpenMP is limited to 2.0 – no nested levels API */ + +#pragma message("Warning: using legacy OpenMP API (MSVC runtime lacks omp_get_max_active_levels)") + +static int ptw32_omp_get_max_active_levels(void) +{ + /* no nested parallelism info available → degrade gracefully */ + return 1; +} + +/* optional: map symbol */ +#define omp_get_max_active_levels ptw32_omp_get_max_active_levels + +#endif + enum { Size = 10000 }; @@ -20,17 +35,13 @@ void *_thread(void* Id) { int i; int x[Size]; -#ifdef _OPENMP -# pragma omp parallel for -#endif - for ( i = 0; i < Size; i++ ) { -#ifdef _OPENMP - if (Verbose && i%1000==0) { - int tid = omp_get_thread_num(); -# pragma omp critical - printf("thread %d : tid %d handles %d\n",(int)(size_t)Id,tid,i); - } -#endif +#pragma omp parallel for +for ( i = 0; i < Size; i++ ) { + if (Verbose && i%1000==0) { + int tid = omp_get_thread_num(); +#pragma omp critical + printf("thread %d : tid %d handles %d\n",(int)(size_t)Id,tid,i); + } x[i] = i; } @@ -40,9 +51,7 @@ void *_thread(void* Id) { Sum += x[i]; } if (Verbose) { -#ifdef _OPENMP -# pragma omp critical -#endif +#pragma omp critical printf("Id %d : %s : %d(should be %d)\n",(int)(size_t)Id, __FUNCTION__, Sum,ShouldSum); } if (Sum == ShouldSum) ThreadOK[(int)(size_t)Id] = 1; @@ -53,16 +62,12 @@ void *_thread(void* Id) { void MainThread() { int i; -#ifdef _OPENMP -# pragma omp parallel for -#endif +#pragma omp parallel for for ( i = 0; i < 4; i++ ) { -#ifdef _OPENMP - int tid = omp_get_thread_num(); -# pragma omp critical - printf("Main : tid %d\n",tid); - _thread((void *)(size_t)tid); -#endif + int tid = omp_get_thread_num(); +#pragma omp critical + printf("Main : tid %d\n",tid); + _thread((void *)(size_t)tid); } return; } @@ -75,10 +80,10 @@ int main(int argc, char *argv[]) { if (argc>1) Verbose = 1; -#ifdef _OPENMP - omp_set_nested(-1); - printf("%s%s%s\n", "Nested parallel blocks are ", omp_get_nested()?" ":"NOT ", "supported."); -#endif + printf("%s%s%s\n", + "Nested parallel blocks are ", + omp_get_max_active_levels() > 1 ? " " : "NOT ", + "supported."); MainThread(); @@ -88,9 +93,6 @@ int main(int argc, char *argv[]) { pthread_t b_thr; int status; - printf("%s:%d - %s - a_thr:%p - b_thr:%p\n", - __FILE__,__LINE__,__FUNCTION__,a_thr.p,b_thr.p); - status = pthread_create(&a_thr, NULL, _thread, (void*) 1 ); if ( status != 0 ) { printf("Failed to create thread 1\n"); @@ -103,6 +105,9 @@ int main(int argc, char *argv[]) { return (-1); } + printf("%s:%d - %s - a_thr:%p - b_thr:%p\n", + __FILE__,__LINE__,__FUNCTION__,a_thr.p,b_thr.p); + status = pthread_join(a_thr, NULL); if ( status != 0 ) { printf("Failed to join thread 1\n"); @@ -120,21 +125,16 @@ int main(int argc, char *argv[]) { #endif // SPAWN_THREADS short OK = 0; - // Check that we have OpenMP before declaring things OK formally. -#ifdef _OPENMP - OK = 1; - { - short i; - for (i=0;i<3;i++) OK &= ThreadOK[i]; - } - if (OK) printf("OMP : All looks good\n"); - else printf("OMP : Error\n"); -#else - printf("OpenMP seems not enabled ...\n"); -#endif + + OK = 1; + { + short i; + for (i=0;i<3;i++) OK &= ThreadOK[i]; + } + if (OK) printf("OMP : All looks good\n"); + else printf("OMP : Error\n"); return OK?0:1; } //g++ -fopenmp omp_test.c -o omp_test -lpthread - diff --git a/version.rc b/version.rc index aa0596c..accc8bf 100644 --- a/version.rc +++ b/version.rc @@ -43,26 +43,37 @@ #if defined (__PTW32_RC_MSC) # if defined (__PTW32_ARCHx64) || defined (__PTW32_ARCHX64) || defined (__PTW32_ARCHAMD64) # if defined(__PTW32_CLEANUP_C) -# define __PTW32_VERSIONINFO_NAME "pthreadVC2.DLL\0" +# define __PTW32_VERSIONINFO_NAME "pthreadC3.DLL\0" # define __PTW32_VERSIONINFO_DESCRIPTION "MS C x64\0" # elif defined(__PTW32_CLEANUP_CXX) -# define __PTW32_VERSIONINFO_NAME "pthreadVCE2.DLL\0" +# define __PTW32_VERSIONINFO_NAME "pthreadCE3.DLL\0" # define __PTW32_VERSIONINFO_DESCRIPTION "MS C++ x64\0" # elif defined(__PTW32_CLEANUP_SEH) -# define __PTW32_VERSIONINFO_NAME "pthreadVSE2.DLL\0" +# define __PTW32_VERSIONINFO_NAME "pthreadSE3.DLL\0" # define __PTW32_VERSIONINFO_DESCRIPTION "MS C SEH x64\0" # endif # elif defined (__PTW32_ARCHx86) || defined (__PTW32_ARCHX86) # if defined(__PTW32_CLEANUP_C) -# define __PTW32_VERSIONINFO_NAME "pthreadVC2.DLL\0" +# define __PTW32_VERSIONINFO_NAME "pthreadC3.DLL\0" # define __PTW32_VERSIONINFO_DESCRIPTION "MS C x86\0" # elif defined(__PTW32_CLEANUP_CXX) -# define __PTW32_VERSIONINFO_NAME "pthreadVCE2.DLL\0" +# define __PTW32_VERSIONINFO_NAME "pthreadCE3.DLL\0" # define __PTW32_VERSIONINFO_DESCRIPTION "MS C++ x86\0" # elif defined(__PTW32_CLEANUP_SEH) -# define __PTW32_VERSIONINFO_NAME "pthreadVSE2.DLL\0" +# define __PTW32_VERSIONINFO_NAME "pthreadSE3.DLL\0" # define __PTW32_VERSIONINFO_DESCRIPTION "MS C SEH x86\0" # endif +# elif defined(__PTW32_ARCHARM64) +# if defined(__PTW32_CLEANUP_C) +# define __PTW32_VERSIONINFO_NAME "pthreadC3.DLL\0" +# define __PTW32_VERSIONINFO_DESCRIPTION "MS C arm64\0" +# elif defined(__PTW32_CLEANUP_CXX) +# define __PTW32_VERSIONINFO_NAME "pthreadCE3.DLL\0" +# define __PTW32_VERSIONINFO_DESCRIPTION "MS C++ arm64\0" +# elif defined(__PTW32_CLEANUP_SEH) +# define __PTW32_VERSIONINFO_NAME "pthreadSE3.DLL\0" +# define __PTW32_VERSIONINFO_DESCRIPTION "MS C SEH arm64\0" +# endif # endif #elif defined(__GNUC__) # if defined(_M_X64) @@ -71,10 +82,10 @@ # define __PTW32_ARCH "x86 (mingw32)" # endif # if defined(__PTW32_CLEANUP_C) -# define __PTW32_VERSIONINFO_NAME "pthreadGC2.DLL\0" +# define __PTW32_VERSIONINFO_NAME "pthreadC3.DLL\0" # define __PTW32_VERSIONINFO_DESCRIPTION "GNU C " __PTW32_ARCH "\0" # elif defined(__PTW32_CLEANUP_CXX) -# define __PTW32_VERSIONINFO_NAME "pthreadGCE2.DLL\0" +# define __PTW32_VERSIONINFO_NAME "pthreadCE3.DLL\0" # define __PTW32_VERSIONINFO_DESCRIPTION "GNU C++ " __PTW32_ARCH "\0" # else # error Resource compiler doesn't know which cleanup style you're using - see version.rc