25 using numaid_t = USHORT;
36 mutable std::mutex m_mutex;
37 std::map<numaid_t, numaentry_t> m_available;
40 static inline numaid_t numa_node()
43 PROCESSOR_NUMBER Processor;
44 GetCurrentProcessorNumberEx(&Processor);
45 USHORT NodeNumber = 0;
46 return GetNumaProcessorNodeEx(&Processor, &NodeNumber) ? NodeNumber : 0;
48 return numa_node_of_cpu(sched_getcpu());
52 inline numaentry_t& numa_entry(numaid_t numa = numa_node())
54 const std::lock_guard<std::mutex> guard(m_mutex);
55 return m_available[numa];
66 T
pop(_In_ numaid_t numa = numa_node())
68 auto& ne = numa_entry(numa);
69 const std::lock_guard<spinlock> guard(ne.lock);
70 if (!ne.list.empty()) {
71 auto r = std::move(ne.list.front());
84 void push(_Inout_ T&& r, _In_ numaid_t numa = numa_node())
86 auto& ne = numa_entry(numa);
87 const std::lock_guard<spinlock> guard(ne.lock);
88 ne.list.push_front(std::move(r));