diff --git a/.bzrignore b/.bzrignore index a73784625..df0e03ed6 100644 --- a/.bzrignore +++ b/.bzrignore @@ -6,3 +6,4 @@ ./include ./templates **/O.* +./QtC-* 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 155792a30..b20a3458a 100644 --- a/src/libCom/osi/os/WIN32/osdThread.c +++ b/src/libCom/osi/os/WIN32/osdThread.c @@ -1101,6 +1101,18 @@ epicsShareFunc void * epicsShareAPI epicsThreadPrivateGet ( epicsThreadPrivateId return ( void * ) TlsGetValue ( pPvt->key ); } +/* + * epicsThreadGetCPUs () + */ +epicsShareFunc int epicsThreadGetCPUs ( void ) +{ + SYSTEM_INFO sysinfo; + GetSystemInfo(&sysinfo); + if (sysinfo.dwNumberOfProcessors > 0) + return sysinfo.dwNumberOfProcessors; + return 1; +} + #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..18cc0b67b 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,18 @@ epicsShareFunc double epicsShareAPI epicsThreadSleepQuantum () return 1.0 / hz; } +epicsShareFunc int epicsThreadGetCPUs(void) +{ + 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/osi/os/vxWorks/osdThread.c b/src/libCom/osi/os/vxWorks/osdThread.c index b2998663f..9a6e8cb3b 100644 --- a/src/libCom/osi/os/vxWorks/osdThread.c +++ b/src/libCom/osi/os/vxWorks/osdThread.c @@ -447,3 +447,8 @@ double epicsThreadSleepQuantum () double HZ = sysClkRateGet (); return 1.0 / HZ; } + +epicsShareFunc int epicsThreadGetCPUs(void) +{ + 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];