Changeset 7493
- Timestamp:
- 09/27/07 12:36:41
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
OpenThreads/trunk/src/OpenThreads/pthreads/CMakeLists.txt
r7398 r7493 1 1 # This file should only be included when using Pthreads 2 3 INCLUDE (CheckFunctionExists) 4 INCLUDE (CheckLibraryExists) 5 INCLUDE (CheckSymbolExists) 6 INCLUDE (CheckCXXSourceCompiles) 2 7 3 8 SET(LIB_NAME OpenThreads) … … 18 23 ) 19 24 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 27 25 IF(OPENTHREADS_SONAMES) 28 26 SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES VERSION ${OPENTHREADS_VERSION} SOVERSION ${OPENTHREADS_SOVERSION}) 29 27 ENDIF(OPENTHREADS_SONAMES) 28 29 SET(CMAKE_REQUIRED_LIBRARIES_SAFE "${CMAKE_REQUIRED_LIBRARIES}") 30 SET(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}") 31 32 CHECK_FUNCTION_EXISTS(pthread_yield HAVE_PTHREAD_YIELD) 33 IF(HAVE_PTHREAD_YIELD) 34 ADD_DEFINITIONS(-DHAVE_PTHREAD_YIELD) 35 ELSE(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) 47 ENDIF(HAVE_PTHREAD_YIELD) 48 49 IF(${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") 53 ENDIF(${CMAKE_SYSTEM_NAME} MATCHES "Linux") 54 55 CHECK_FUNCTION_EXISTS(pthread_setconcurrency HAVE_PTHREAD_SETCONCURRENCY) 56 IF(HAVE_PTHREAD_SETCONCURRENCY) 57 ADD_DEFINITIONS(-DHAVE_PTHREAD_SETCONCURRENCY) 58 ENDIF(HAVE_PTHREAD_SETCONCURRENCY) 59 60 CHECK_FUNCTION_EXISTS(pthread_getconcurrency HAVE_PTHREAD_GETCONCURRENCY) 61 IF(HAVE_PTHREAD_GETCONCURRENCY) 62 ADD_DEFINITIONS(-DHAVE_PTHREAD_GETCONCURRENCY) 63 ENDIF(HAVE_PTHREAD_GETCONCURRENCY) 64 65 CHECK_FUNCTION_EXISTS(pthread_setaffinity_np HAVE_PTHREAD_SETAFFINITY_NP) 66 IF(HAVE_PTHREAD_SETAFFINITY_NP) 67 ADD_DEFINITIONS(-DHAVE_PTHREAD_SETAFFINITY_NP) 68 ELSE(HAVE_PTHREAD_SETAFFINITY_NP) 69 CHECK_CXX_SOURCE_COMPILES(" 70 #include <sched.h> 71 int 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> 81 int 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) 90 ENDIF(HAVE_PTHREAD_SETAFFINITY_NP) 91 92 SET(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES_SAFE}") 30 93 31 94 TARGET_LINK_LIBRARIES(${LIB_NAME} OpenThreads/trunk/src/OpenThreads/pthreads/PThread.c++
r7470 r7493 29 29 #include <sys/unistd.h> 30 30 #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> 34 40 #endif 35 41 #if defined (__FreeBSD__) || defined (__APPLE__) || defined (__MACH__) … … 117 123 if (pd->cpunum>=0) 118 124 { 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 136 140 } 137 141 … … 341 345 int Thread::SetConcurrency(int concurrencyLevel) { 342 346 343 #if defined ( __sgi) || defined (__sun)347 #if defined (HAVE_PTHREAD_SETCONCURRENCY) 344 348 return pthread_setconcurrency(concurrencyLevel); 345 349 #else … … 357 361 int Thread::GetConcurrency() { 358 362 359 #if defined ( __sgi) || defined (__sun)363 #if defined (HAVE_PTHREAD_GETCONCURRENCY) 360 364 return pthread_getconcurrency(); 361 365 #else … … 533 537 return status; 534 538 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 538 541 if (pd->isRunning && Thread::CurrentThread()==this) 539 542 { … … 541 544 CPU_ZERO( &cpumask ); 542 545 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 549 553 } 550 554 … … 896 900 int Thread::YieldCurrentThread() 897 901 { 898 902 #if defined(HAVE_PTHREAD_YIELD) 903 return pthread_yield(); 904 #elif defined(HAVE_SCHED_YIELD) 899 905 return sched_yield(); 900 906 #else 907 return -1; 908 #endif 901 909 } 902 910 … … 919 927 { 920 928 #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; 935 959 #endif 936 960 } … … 949 973 else 950 974 { 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) 953 976 cpu_set_t cpumask; 954 977 CPU_ZERO( &cpumask ); 955 978 CPU_SET( cpunum, &cpumask ); 956 979 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 964 988 } 965 989
