core: Make reference counting thread-safe

This commit is contained in:
F5
2022-10-25 17:02:37 +08:00
parent 7004d1a66e
commit ba81313570
3 changed files with 59 additions and 2 deletions

View File

@@ -229,6 +229,7 @@ set(header_files
model/ascii-file.h
model/ascii-test.h
model/assert.h
model/atomic-counter.h
model/attribute-accessor-helper.h
model/attribute-construction-list.h
model/attribute-container-accessor-helper.h

View File

@@ -0,0 +1,49 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
#ifndef ATOMIC_COUNTER_H
#define ATOMIC_COUNTER_H
#include <atomic>
namespace ns3 {
class AtomicCounter
{
public:
inline AtomicCounter ()
{
m_count.store (0, std::memory_order_release);
}
inline AtomicCounter (uint32_t count)
{
m_count.store (count, std::memory_order_release);
}
inline operator uint32_t () const
{
return m_count.load (std::memory_order_acquire);
}
inline uint32_t operator = (const uint32_t count)
{
m_count.store (count, std::memory_order_release);
return count;
}
inline uint32_t operator++ (int)
{
return m_count.fetch_add (1, std::memory_order_relaxed);
}
inline uint32_t operator-- (int)
{
return m_count.fetch_sub (1, std::memory_order_release);
}
private:
std::atomic<uint32_t> m_count;
};
} // namespace ns3
#endif /* ATOMIC_COUNTER_H */

View File

@@ -22,6 +22,7 @@
#ifndef SIMPLE_REF_COUNT_H
#define SIMPLE_REF_COUNT_H
#include "atomic-counter.h"
#include "empty.h"
#include "default-deleter.h"
#include "assert.h"
@@ -112,9 +113,11 @@ public:
*/
inline void Unref (void) const
{
m_count--;
if (m_count == 0)
if (m_count-- == 1)
{
#ifdef NS3_MTP
std::atomic_thread_fence (std::memory_order_acquire);
#endif
DELETER::Delete (static_cast<T*> (const_cast<SimpleRefCount *> (this)));
}
}
@@ -138,7 +141,11 @@ private:
* Note we make this mutable so that the const methods can still
* change it.
*/
#ifdef NS3_MTP
mutable AtomicCounter m_count;
#else
mutable uint32_t m_count;
#endif
};
} // namespace ns3