Merge branch 'dev'
[libcds.git] / src / topology_linux.cpp
1 //$$CDS-header$$
2
3 #include <cds/os/topology.h>
4
5 #if CDS_OS_TYPE == CDS_OS_LINUX
6
7 #include <unistd.h>
8 #include <fstream>
9
10 namespace cds { namespace OS { CDS_CXX11_INLINE_NAMESPACE namespace Linux {
11
12     unsigned int topology::s_nProcessorCount = 0;
13
14     void topology::init()
15     {
16          long n = ::sysconf( _SC_NPROCESSORS_ONLN );
17          if ( n > 0 )
18             s_nProcessorCount = n;
19          else {
20             try {
21                 std::ifstream cpuinfo("/proc/cpuinfo");
22                 std::string line;
23
24                 unsigned int nProcCount = 0;
25                 while ( !cpuinfo.eof() ) {
26                     std::getline(cpuinfo,line);
27                     if (!line.size())
28                         continue;
29                     if ( line.find( "processor" ) !=0 )
30                         continue;
31                     ++nProcCount;
32                 }
33                 s_nProcessorCount = nProcCount;
34             }
35             catch ( std::exception& ex ) {
36                 s_nProcessorCount = 1;
37             }
38          }
39     }
40
41     void topology::fini()
42     {}
43 }}} // namespace cds::OS::Linux
44
45 #endif  // #if CDS_OS_TYPE == CDS_OS_LINUX