Hopefully thread safe shared ptr

This commit is contained in:
2024-04-05 22:54:41 +02:00
parent 649b9334b9
commit b9aa97f863

View File

@@ -1,6 +1,7 @@
#ifndef POINTERS_H
#define POINTERS_H
#include <atomic>
#include <utility>
#include "kmem.hpp"
@@ -61,12 +62,11 @@ class SharedPtr {
public:
SharedPtr() = default;
explicit SharedPtr(T *data) : ptr(data), uses(new int(1)) {}
explicit SharedPtr(T *data) : ptr(data), uses(new std::atomic<int>(1)) {}
~SharedPtr() {
if (ptr == nullptr || uses == nullptr) return;
--(*uses);
if (*uses == 0) {
if (uses->fetch_sub(1) == 1) {
delete ptr;
delete uses;
}
@@ -77,6 +77,11 @@ public:
}
SharedPtr(SharedPtr &&other) {
if (ptr != nullptr && uses != nullptr)
if (uses->fetch_sub(1) == 1) {
delete ptr;
delete uses;
}
uses = other.uses;
ptr = other.ptr;
other.uses = nullptr;
@@ -98,8 +103,8 @@ public:
[[nodiscard]] int useCount() const { return *uses; }
private:
T *ptr = nullptr;
int *uses = nullptr;
T *ptr = nullptr;
std::atomic<int> *uses = nullptr;
};
class COWTester;