3 #include <cds/os/topology.h>
5 #if CDS_OS_TYPE == CDS_OS_HPUX
7 #include <cds/cxx11_atomic.h>
10 namespace cds { namespace OS { CDS_CXX11_INLINE_NAMESPACE namespace Hpux {
12 size_t topology::s_nProcMapSize = 0;
13 topology::processor_map * topology::s_procMap = nullptr;
15 void topology::make_processor_map()
20 // Processor numbers are not sequential in HP-UX.
22 // Calculate max processor number
23 nProc = nMaxProcNo = ::mpctl( MPC_GETFIRSTSPU, 0, 0 );
25 while ( (nProc = ::mpctl( MPC_GETNEXTSPU, nProc, 0 )) != -1 ) {
26 if ( nMaxProcNo < nProc )
30 // Allocate processor map array
31 s_nProcMapSize = nMaxProcNo + 1;
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;
40 for ( processor_map * p = s_procMap; p != pEnd; ++p ) {
42 p->nNativeProcNo = -1;
43 p->nProcNo = std::numeric_limits<unsigned int>::max();
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 );
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 );
63 assert( s_procMap == nullptr );
77 }}} // namespace cds::OS::Hpux
79 #endif // #if CDS_OS_TYPE == CDS_OS_HPUX