Create a RefCounted type and use it for Thread.

This should prevent me from actually creating 2 shared ptrs of
a single kernel object with their separate ref counts.
This commit is contained in:
Drew Galbraith 2023-06-06 19:05:03 -07:00
parent d9b17d96d7
commit 2e1357255c
8 changed files with 146 additions and 22 deletions

41
zion/lib/ref_counted.h Normal file
View file

@ -0,0 +1,41 @@
#pragma once
#include <stdint.h>
#include "debug/debug.h"
template <typename T>
class RefCounted {
public:
RefCounted() {}
~RefCounted() { dbgln("RefCounted object destroyed"); }
void Adopt() {
if (ref_count_ != -1) {
panic("Adopting owned ptr");
} else {
ref_count_ = 1;
}
}
void Acquire() {
if (ref_count_ == -1) {
panic("Acquiring unowned ptr");
}
ref_count_++;
}
bool Release() {
if (ref_count_ == -1 || ref_count_ == 0) {
panic("Releasing unowned ptr");
}
return (--ref_count_) == 0;
}
private:
// FIXME: This should be an atomic type.
uint64_t ref_count_ = -1;
// Disallow copy and move.
RefCounted(RefCounted&) = delete;
RefCounted(RefCounted&&) = delete;
RefCounted& operator=(RefCounted&) = delete;
RefCounted& operator=(RefCounted&&) = delete;
};