Changeset 7493

Show
Ignore:
Timestamp:
09/27/07 12:36:41
Author:
robert
Message:

From Mathias Froelich, "the long promised patch to implement the sched_setaffinity in a way that
matches the system it is compiled on.
That is there is a cmake configure test to make sure we use the version
available on the system

There are also various improovements to other system specific methods for less
common architectures.

The attached files arebased on rev 7491. The CMakeLists.txt file is the one in
src/OpenThreads/pthreads/CMakeLists.txt
"

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • OpenThreads/trunk/src/OpenThreads/pthreads/CMakeLists.txt

    r7398 r7493  
    11# This file should only be included when using Pthreads 
     2 
     3INCLUDE (CheckFunctionExists) 
     4INCLUDE (CheckLibraryExists) 
     5INCLUDE (CheckSymbolExists) 
     6INCLUDE (CheckCXXSourceCompiles) 
    27 
    38SET(LIB_NAME OpenThreads) 
     
    1823) 
    1924 
    20 IF(${CMAKE_SYSTEM_NAME} MATCHES "Linux") 
    21     OPTION(TWO_PARAM_sched_setaffinity "Set to ON to use the two parameter sched_setaffinity (required on older rev's of RedHat)" OFF) 
    22     IF(TWO_PARAM_sched_setaffinity) 
    23       ADD_DEFINITIONS(-DCOMPILE_USING_TWO_PARAM_sched_setaffinity) 
    24     ENDIF(TWO_PARAM_sched_setaffinity) 
    25 ENDIF(${CMAKE_SYSTEM_NAME} MATCHES "Linux") 
    26  
    2725IF(OPENTHREADS_SONAMES) 
    2826  SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES VERSION ${OPENTHREADS_VERSION} SOVERSION ${OPENTHREADS_SOVERSION}) 
    2927ENDIF(OPENTHREADS_SONAMES) 
     28 
     29SET(CMAKE_REQUIRED_LIBRARIES_SAFE "${CMAKE_REQUIRED_LIBRARIES}") 
     30SET(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}") 
     31 
     32CHECK_FUNCTION_EXISTS(pthread_yield HAVE_PTHREAD_YIELD) 
     33IF(HAVE_PTHREAD_YIELD) 
     34  ADD_DEFINITIONS(-DHAVE_PTHREAD_YIELD) 
     35ELSE(HAVE_PTHREAD_YIELD) 
     36  # sched_yield appears not in libc, pthreads or whatever on some systems 
     37  CHECK_FUNCTION_EXISTS(sched_yield HAVE_SCHED_YIELD) 
     38  IF(NOT HAVE_SCHED_YIELD) 
     39    CHECK_LIBRARY_EXISTS(rt sched_yield "" HAVE_SCHED_YIELD) 
     40    IF(HAVE_SCHED_YIELD) 
     41      SET(CMAKE_THREAD_LIBS_INIT "${CMAKE_THREAD_LIBS_INIT} -lrt") 
     42    ENDIF(HAVE_SCHED_YIELD) 
     43  ENDIF(NOT HAVE_SCHED_YIELD) 
     44  IF(HAVE_SCHED_YIELD) 
     45    ADD_DEFINITIONS(-DHAVE_SCHED_YIELD) 
     46  ENDIF(HAVE_SCHED_YIELD) 
     47ENDIF(HAVE_PTHREAD_YIELD) 
     48 
     49IF(${CMAKE_SYSTEM_NAME} MATCHES "Linux") 
     50  # need to have that for pthread_setaffinity_np on linux 
     51  ADD_DEFINITIONS(-D_GNU_SOURCE) 
     52  SET(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_GNU_SOURCE") 
     53ENDIF(${CMAKE_SYSTEM_NAME} MATCHES "Linux") 
     54 
     55CHECK_FUNCTION_EXISTS(pthread_setconcurrency HAVE_PTHREAD_SETCONCURRENCY) 
     56IF(HAVE_PTHREAD_SETCONCURRENCY) 
     57  ADD_DEFINITIONS(-DHAVE_PTHREAD_SETCONCURRENCY) 
     58ENDIF(HAVE_PTHREAD_SETCONCURRENCY) 
     59 
     60CHECK_FUNCTION_EXISTS(pthread_getconcurrency HAVE_PTHREAD_GETCONCURRENCY) 
     61IF(HAVE_PTHREAD_GETCONCURRENCY) 
     62  ADD_DEFINITIONS(-DHAVE_PTHREAD_GETCONCURRENCY) 
     63ENDIF(HAVE_PTHREAD_GETCONCURRENCY) 
     64 
     65CHECK_FUNCTION_EXISTS(pthread_setaffinity_np HAVE_PTHREAD_SETAFFINITY_NP) 
     66IF(HAVE_PTHREAD_SETAFFINITY_NP) 
     67  ADD_DEFINITIONS(-DHAVE_PTHREAD_SETAFFINITY_NP) 
     68ELSE(HAVE_PTHREAD_SETAFFINITY_NP) 
     69  CHECK_CXX_SOURCE_COMPILES(" 
     70#include <sched.h> 
     71int main() { 
     72  cpu_set_t cpumask; 
     73  sched_setaffinity( 0, sizeof(cpumask), &cpumask ); 
     74  return 0; 
     75}" HAVE_THREE_PARAM_SCHED_SETAFFINITY) 
     76  IF(HAVE_THREE_PARAM_SCHED_SETAFFINITY) 
     77    ADD_DEFINITIONS(-DHAVE_THREE_PARAM_SCHED_SETAFFINITY) 
     78  ELSE(HAVE_THREE_PARAM_SCHED_SETAFFINITY) 
     79    CHECK_CXX_SOURCE_COMPILES(" 
     80#include <sched.h> 
     81int main() { 
     82  cpu_set_t cpumask; 
     83  sched_setaffinity( 0, &cpumask ); 
     84  return 0; 
     85}" HAVE_TWO_PARAM_SCHED_SETAFFINITY) 
     86    IF(HAVE_TWO_PARAM_SCHED_SETAFFINITY) 
     87      ADD_DEFINITIONS(-DHAVE_TWO_PARAM_SCHED_SETAFFINITY) 
     88    ENDIF(HAVE_TWO_PARAM_SCHED_SETAFFINITY) 
     89  ENDIF(HAVE_THREE_PARAM_SCHED_SETAFFINITY) 
     90ENDIF(HAVE_PTHREAD_SETAFFINITY_NP) 
     91 
     92SET(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES_SAFE}") 
    3093 
    3194TARGET_LINK_LIBRARIES(${LIB_NAME} 
  • OpenThreads/trunk/src/OpenThreads/pthreads/PThread.c++

    r7470 r7493  
    2929#include <sys/unistd.h> 
    3030#endif 
    31  
    32 #if defined (__linux__) 
    33     #include <sched.h> 
     31#if defined(__sgi) 
     32#include <unistd.h> 
     33#endif 
     34#if defined(__hpux) 
     35#include <sys/mpctl.h> 
     36#endif 
     37 
     38#if defined(HAVE_THREE_PARAM_SCHED_SETAFFINITY) || defined(HAVE_TWO_PARAM_SCHED_SETAFFINITY) 
     39#    include <sched.h> 
    3440#endif 
    3541#if defined (__FreeBSD__) || defined (__APPLE__) || defined (__MACH__) 
     
    117123        if (pd->cpunum>=0) 
    118124        { 
    119             #ifdef __sgi 
    120              
    121                 pthread_setrunon_np( pd->cpunum ); 
    122                  
    123             #elif defined (__linux__) && defined(CPU_SET) 
    124  
    125                 cpu_set_t cpumask; 
    126                 CPU_ZERO( &cpumask ); 
    127                 CPU_SET( pd->cpunum, &cpumask ); 
    128  
    129                 #if defined(COMPILE_USING_TWO_PARAM_sched_setaffinity) 
    130                     sched_setaffinity( 0, &cpumask ); 
    131                 #else 
    132                     sched_setaffinity( 0, sizeof(cpumask), &cpumask ); 
    133                 #endif 
    134                  
    135             #endif 
     125#if defined(__sgi) 
     126            pthread_setrunon_np( pd->cpunum ); 
     127#elif defined(HAVE_PTHREAD_SETAFFINITY_NP) || defined(HAVE_THREE_PARAM_SCHED_SETAFFINITY) || defined(HAVE_TWO_PARAM_SCHED_SETAFFINITY) 
     128            cpu_set_t cpumask; 
     129            CPU_ZERO( &cpumask ); 
     130            CPU_SET( pd->cpunum, &cpumask ); 
     131 
     132#if defined(HAVE_PTHREAD_SETAFFINITY_NP) 
     133            pthread_setaffinity_np( pthread_self(), sizeof(cpumask), &cpumask); 
     134#elif defined(HAVE_THREE_PARAM_SCHED_SETAFFINITY) 
     135            sched_setaffinity( 0, sizeof(cpumask), &cpumask ); 
     136#elif defined(HAVE_TWO_PARAM_SCHED_SETAFFINITY) 
     137            sched_setaffinity( 0, &cpumask ); 
     138#endif 
     139#endif 
    136140        } 
    137141         
     
    341345int Thread::SetConcurrency(int concurrencyLevel) { 
    342346 
    343 #if defined (__sgi) || defined (__sun
     347#if defined (HAVE_PTHREAD_SETCONCURRENCY
    344348    return pthread_setconcurrency(concurrencyLevel); 
    345349#else 
     
    357361int Thread::GetConcurrency() { 
    358362 
    359 #if defined (__sgi) || defined (__sun
     363#if defined (HAVE_PTHREAD_GETCONCURRENCY
    360364    return pthread_getconcurrency(); 
    361365#else 
     
    533537    return status; 
    534538 
    535 #elif defined (__linux__) && defined(CPU_SET) 
    536  
    537    
     539#elif defined(HAVE_PTHREAD_SETAFFINITY_NP) || defined(HAVE_THREE_PARAM_SCHED_SETAFFINITY) || defined(HAVE_TWO_PARAM_SCHED_SETAFFINITY) 
     540 
    538541    if (pd->isRunning && Thread::CurrentThread()==this) 
    539542    { 
     
    541544        CPU_ZERO( &cpumask ); 
    542545        CPU_SET( pd->cpunum, &cpumask ); 
    543  
    544         #if defined(COMPILE_USING_TWO_PARAM_sched_setaffinity) 
    545             return sched_setaffinity( 0, &cpumask ); 
    546         #else 
    547             return sched_setaffinity( 0, sizeof(cpumask), &cpumask ); 
    548         #endif 
     546#if defined(HAVE_PTHREAD_SETAFFINITY_NP) 
     547        pthread_setaffinity_np (pthread_self(), sizeof(cpumask), &cpumask); 
     548#elif defined(HAVE_THREE_PARAM_SCHED_SETAFFINITY) 
     549        sched_setaffinity( 0, sizeof(cpumask), &cpumask ); 
     550#elif defined(HAVE_TWO_PARAM_SCHED_SETAFFINITY) 
     551        sched_setaffinity( 0, &cpumask ); 
     552#endif 
    549553    } 
    550554 
     
    896900int Thread::YieldCurrentThread() 
    897901{ 
    898  
     902#if defined(HAVE_PTHREAD_YIELD) 
     903    return pthread_yield(); 
     904#elif defined(HAVE_SCHED_YIELD) 
    899905    return sched_yield(); 
    900  
     906#else 
     907    return -1; 
     908#endif 
    901909} 
    902910 
     
    919927{ 
    920928#if defined(__linux__) 
    921     return sysconf(_SC_NPROCESSORS_CONF); 
    922 #else 
    923         #if defined(__FreeBSD__) || defined(__APPLE__) || defined(__MACH__) 
    924                 uint64_t num_cpus = 0; 
    925                 size_t num_cpus_length = sizeof(num_cpus); 
    926                 #if defined(__FreeBSD__) 
    927                         sysctlbyname("hw.ncpu", &num_cpus, &num_cpus_length, NULL, 0);                   
    928                 #else 
    929                         sysctlbyname("hw.activecpu", &num_cpus, &num_cpus_length, NULL, 0); 
    930                 #endif 
    931                 return num_cpus; 
    932         #else 
    933                 return 1; 
    934         #endif 
     929   long ret = sysconf(_SC_NPROCESSORS_ONLN); 
     930   if (ret == -1) 
     931      return 0; 
     932   return ret; 
     933#elif defined(__sun__) 
     934   long ret = sysconf(_SC_NPROCESSORS_ONLN); 
     935   if (ret == -1) 
     936      return 0; 
     937   return ret; 
     938#elif defined(__sgi) 
     939   long ret = sysconf(_SC_NPROC_ONLN); 
     940   if (ret == -1) 
     941      return 0; 
     942   return ret; 
     943#elif defined(__hpux) 
     944   int ret = mpctl(MPC_GETNUMSPUS, 0, NULL); 
     945   if (ret == -1) 
     946      return 0; 
     947   return ret; 
     948#elif defined(__FreeBSD__) || defined(__APPLE__) || defined(__MACH__) 
     949   uint64_t num_cpus = 0; 
     950   size_t num_cpus_length = sizeof(num_cpus); 
     951#if defined(__FreeBSD__) 
     952   sysctlbyname("hw.ncpu", &num_cpus, &num_cpus_length, NULL, 0);                        
     953#else 
     954   sysctlbyname("hw.activecpu", &num_cpus, &num_cpus_length, NULL, 0); 
     955#endif 
     956   return num_cpus; 
     957#else 
     958   return 1; 
    935959#endif 
    936960} 
     
    949973    else 
    950974    { 
    951     #if defined (__linux__) && defined(CPU_SET) 
    952  
     975#if defined(HAVE_PTHREAD_SETAFFINITY_NP) || defined(HAVE_THREE_PARAM_SCHED_SETAFFINITY) || defined(HAVE_TWO_PARAM_SCHED_SETAFFINITY) 
    953976        cpu_set_t cpumask; 
    954977        CPU_ZERO( &cpumask ); 
    955978        CPU_SET( cpunum, &cpumask ); 
    956979 
    957         #if defined(COMPILE_USING_TWO_PARAM_sched_setaffinity) 
    958             return sched_setaffinity( 0, &cpumask ); 
    959         #else 
    960             return sched_setaffinity( 0, sizeof(cpumask), &cpumask ); 
    961         #endif 
    962  
    963     #endif 
     980#if defined(HAVE_PTHREAD_SETAFFINITY_NP) 
     981        pthread_setaffinity_np( pthread_self(), sizeof(cpumask), &cpumask); 
     982#elif defined(HAVE_THREE_PARAM_SCHED_SETAFFINITY) 
     983        sched_setaffinity( 0, sizeof(cpumask), &cpumask ); 
     984#elif defined(HAVE_TWO_PARAM_SCHED_SETAFFINITY) 
     985        sched_setaffinity( 0, &cpumask ); 
     986#endif 
     987#endif 
    964988    } 
    965989