Replace NULL with nullptr
[libcds.git] / src / topology_hpux.cpp
1 //$$CDS-header$$
2
3 #include <cds/os/topology.h>
4
5 #if CDS_OS_TYPE == CDS_OS_HPUX
6
7 #include <cds/cxx11_atomic.h>
8 #include <limits>
9
10 namespace cds { namespace OS { CDS_CXX11_INLINE_NAMESPACE namespace Hpux {
11
12     size_t topology::s_nProcMapSize = 0;
13     topology::processor_map * topology::s_procMap = nullptr;
14
15     void topology::make_processor_map()
16     {
17         spu_t nProc;
18         spu_t nMaxProcNo;
19
20         // Processor numbers are not sequential in HP-UX.
21
22         // Calculate max processor number
23         nProc = nMaxProcNo = ::mpctl( MPC_GETFIRSTSPU, 0, 0 );
24
25         while ( (nProc = ::mpctl( MPC_GETNEXTSPU, nProc, 0 )) != -1 ) {
26             if ( nMaxProcNo < nProc )
27                 nMaxProcNo = nProc;
28         }
29
30         // Allocate processor map array
31         s_nProcMapSize = nMaxProcNo + 1;
32
33         // We cannot use operator new or std::allocator in this code
34         // since the initialization phase may be called from
35         // our overloaded operator new that based on cds::mihcael::Heap
36         // As a result, a deadlock may be occured
37         s_procMap = reinterpret_cast<processor_map *>(::malloc( sizeof(s_procMap[0]) * s_nProcMapSize ));
38         processor_map * pEnd = s_procMap + s_nProcMapSize;
39
40         for ( processor_map * p = s_procMap; p != pEnd; ++p ) {
41             p->nCell = 0;
42             p->nNativeProcNo = -1;
43             p->nProcNo = std::numeric_limits<unsigned int>::max();
44         }
45
46         // Fill processor map array
47         unsigned int nProcNo = 0;
48         nProc = ::mpctl( MPC_GETFIRSTSPU, 0, 0 );
49         s_procMap[ nProc ].nNativeProcNo = nProc;
50         s_procMap[ nProc ].nProcNo = nProcNo++;
51         s_procMap[ nProc ].nCell = ::mpctl( MPC_SPUTOLDOM, nProc, 0 );
52
53         while ( (nProc = ::mpctl( MPC_GETNEXTSPU, nProc, 0 )) != -1 ) {
54             processor_map * p = s_procMap + nProc;
55             p->nNativeProcNo = nProc;
56             p->nProcNo = nProcNo++;
57             p->nCell = ::mpctl( MPC_SPUTOLDOM, nProc, 0 );
58         }
59     }
60
61     void topology::init()
62     {
63         assert( s_procMap == nullptr );
64         make_processor_map();
65     }
66
67     void topology::fini()
68     {
69         assert( s_procMap );
70         if ( s_procMap ) {
71             ::free( s_procMap );
72
73             s_procMap = nullptr;
74         }
75     }
76
77 }}} // namespace cds::OS::Hpux
78
79 #endif  // #if CDS_OS_TYPE == CDS_OS_HPUX