From 90b9965caf67429f353b11d6a025070963ae4bcf Mon Sep 17 00:00:00 2001 From: Ralph Lange Date: Thu, 28 Mar 2013 15:03:29 +0100 Subject: [PATCH 1/3] libCom/osi: add epicsThreadGetCPUs() * Implementation for posix and WIN32 tries to get the CPUs available for this process, rather than the complete number of CPUs in the system. * For the time being, vxWorks returns 1. (This will have to change for vxWorks SMP.) --- src/libCom/osi/epicsThread.h | 3 ++- src/libCom/osi/os/RTEMS/osdThread.c | 9 +++++++++ src/libCom/osi/os/WIN32/osdThread.c | 8 ++++++++ src/libCom/osi/os/posix/osdThread.c | 6 +++++- src/libCom/osi/os/vxWorks/osdThread.c | 5 +++++ 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/libCom/osi/epicsThread.h b/src/libCom/osi/epicsThread.h index d7be5d197..fa28215d3 100644 --- a/src/libCom/osi/epicsThread.h +++ b/src/libCom/osi/epicsThread.h @@ -3,7 +3,7 @@ * National Laboratory. * Copyright (c) 2002 The Regents of the University of California, as * Operator of Los Alamos National Laboratory. -* Copyright (c) 2012 ITER Organization +* Copyright (c) 2013 ITER Organization. * EPICS BASE is distributed subject to a Software License Agreement found * in file LICENSE that is included with this distribution. \*************************************************************************/ @@ -85,6 +85,7 @@ epicsShareFunc void epicsShareAPI epicsThreadSleep(double seconds); epicsShareFunc double epicsShareAPI epicsThreadSleepQuantum(void); epicsShareFunc epicsThreadId epicsShareAPI epicsThreadGetIdSelf(void); epicsShareFunc epicsThreadId epicsShareAPI epicsThreadGetId(const char *name); +epicsShareFunc int epicsThreadGetCPUs(void); epicsShareFunc const char * epicsShareAPI epicsThreadGetNameSelf(void); diff --git a/src/libCom/osi/os/RTEMS/osdThread.c b/src/libCom/osi/os/RTEMS/osdThread.c index 81169ae75..0102157d6 100644 --- a/src/libCom/osi/os/RTEMS/osdThread.c +++ b/src/libCom/osi/os/RTEMS/osdThread.c @@ -718,3 +718,12 @@ double epicsThreadSleepQuantum ( void ) return 1.0 / rtemsTicksPerSecond_double; } + +epicsShareFunc int epicsThreadGetCPUs(void) +{ +#if defined(RTEMS_SMP) + return rtems_smp_get_number_of_processors(); +#else + return 1; +#endif +} diff --git a/src/libCom/osi/os/WIN32/osdThread.c b/src/libCom/osi/os/WIN32/osdThread.c index 6588b2e3f..70b9b53d2 100644 --- a/src/libCom/osi/os/WIN32/osdThread.c +++ b/src/libCom/osi/os/WIN32/osdThread.c @@ -1105,6 +1105,14 @@ epicsShareFunc void * epicsShareAPI epicsThreadPrivateGet ( epicsThreadPrivateId return ( void * ) TlsGetValue ( pPvt->key ); } +/* + * epicsThreadGetCPUs () + */ +epicsShareFunc int epicsThreadGetCPUs ( void ) +{ + return atoi(getenv("NUMBER_OF_PROCESSORS")); +} + #ifdef TEST_CODES void testPriorityMapping () { diff --git a/src/libCom/osi/os/posix/osdThread.c b/src/libCom/osi/os/posix/osdThread.c index 523877b99..00fbdc936 100644 --- a/src/libCom/osi/os/posix/osdThread.c +++ b/src/libCom/osi/os/posix/osdThread.c @@ -3,7 +3,7 @@ * National Laboratory. * Copyright (c) 2002 The Regents of the University of California, as * Operator of Los Alamos National Laboratory. -* Copyright (c) 2012 ITER Organization +* Copyright (c) 2013 ITER Organization. * EPICS BASE is distributed subject to a Software License Agreement found * in file LICENSE that is included with this distribution. \*************************************************************************/ @@ -873,3 +873,7 @@ epicsShareFunc double epicsShareAPI epicsThreadSleepQuantum () return 1.0 / hz; } +epicsShareFunc int epicsThreadGetCPUs(void) +{ + return sysconf(_SC_NPROCESSORS_ONLN); +} diff --git a/src/libCom/osi/os/vxWorks/osdThread.c b/src/libCom/osi/os/vxWorks/osdThread.c index c38918d8d..67c6bc8d7 100644 --- a/src/libCom/osi/os/vxWorks/osdThread.c +++ b/src/libCom/osi/os/vxWorks/osdThread.c @@ -449,3 +449,8 @@ double epicsThreadSleepQuantum () double HZ = sysClkRateGet (); return 1.0 / HZ; } + +epicsShareFunc int epicsThreadGetCPUs(void) +{ + return 1; +} From 286bfc52153338d401d4a5da5436d3511168ddf4 Mon Sep 17 00:00:00 2001 From: Ralph Lange Date: Sun, 18 May 2014 14:28:39 +0200 Subject: [PATCH 2/3] .bzrignore: add QtCreator project files --- .bzrignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.bzrignore b/.bzrignore index a73784625..df0e03ed6 100644 --- a/.bzrignore +++ b/.bzrignore @@ -6,3 +6,4 @@ ./include ./templates **/O.* +./QtC-* From 722d5eeba77a1f26cfcbdf1e81cc681fa926bd3d Mon Sep 17 00:00:00 2001 From: Ralph Lange Date: Sun, 18 May 2014 17:24:38 +0200 Subject: [PATCH 3/3] libCom/osi: use epicsThreadGetCPUs implementation from thread-pool branch (posix, WIN32) --- src/libCom/osi/os/WIN32/osdThread.c | 6 +++++- src/libCom/osi/os/posix/osdThread.c | 13 ++++++++++++- src/libCom/test/epicsThreadTest.cpp | 6 +++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/libCom/osi/os/WIN32/osdThread.c b/src/libCom/osi/os/WIN32/osdThread.c index 70b9b53d2..c88b0e689 100644 --- a/src/libCom/osi/os/WIN32/osdThread.c +++ b/src/libCom/osi/os/WIN32/osdThread.c @@ -1110,7 +1110,11 @@ epicsShareFunc void * epicsShareAPI epicsThreadPrivateGet ( epicsThreadPrivateId */ epicsShareFunc int epicsThreadGetCPUs ( void ) { - return atoi(getenv("NUMBER_OF_PROCESSORS")); + SYSTEM_INFO sysinfo; + GetSystemInfo(&sysinfo); + if (sysinfo.dwNumberOfProcessors > 0) + return sysinfo.dwNumberOfProcessors; + return 1; } #ifdef TEST_CODES diff --git a/src/libCom/osi/os/posix/osdThread.c b/src/libCom/osi/os/posix/osdThread.c index 00fbdc936..18cc0b67b 100644 --- a/src/libCom/osi/os/posix/osdThread.c +++ b/src/libCom/osi/os/posix/osdThread.c @@ -875,5 +875,16 @@ epicsShareFunc double epicsShareAPI epicsThreadSleepQuantum () epicsShareFunc int epicsThreadGetCPUs(void) { - return sysconf(_SC_NPROCESSORS_ONLN); + long ret; +#ifdef _SC_NPROCESSORS_ONLN + ret = sysconf(_SC_NPROCESSORS_ONLN); + if (ret > 0) + return ret; +#endif +#ifdef _SC_NPROCESSORS_CONF + ret = sysconf(_SC_NPROCESSORS_CONF); + if (ret > 0) + return ret; +#endif + return 1; } diff --git a/src/libCom/test/epicsThreadTest.cpp b/src/libCom/test/epicsThreadTest.cpp index b1e28bb8c..f80d3da7e 100644 --- a/src/libCom/test/epicsThreadTest.cpp +++ b/src/libCom/test/epicsThreadTest.cpp @@ -81,7 +81,11 @@ static void thread(void *arg) MAIN(epicsThreadTest) { - testPlan(8); + testPlan(9); + + unsigned int ncpus = epicsThreadGetCPUs(); + testDiag("System has %u CPUs", ncpus); + testOk1(ncpus > 0); const int ntasks = 3; myThread *myThreads[ntasks];