diff foosdk/sdk/pfc/syncd_storage.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/foosdk/sdk/pfc/syncd_storage.h	Mon Jan 05 02:15:46 2026 -0500
@@ -0,0 +1,109 @@
+#pragma once
+#include "synchro.h"
+
+namespace pfc {
+// Read/write lock guarded object store for safe concurrent access
+template<typename t_object>
+class syncd_storage {
+private:
+	typedef syncd_storage<t_object> t_self;
+public:
+	syncd_storage() {}
+	template<typename t_source>
+	syncd_storage(const t_source & p_source) : m_object(p_source) {}
+	template<typename t_source>
+	void set(t_source && p_in) {
+		inWriteSync(m_sync);
+		m_object = std::forward<t_source>( p_in );
+	}
+	template<typename t_destination>
+	void get(t_destination & p_out) const {
+		inReadSync(m_sync);
+		p_out = m_object;
+	}
+	t_object get() const {
+		inReadSync(m_sync);
+		return m_object;
+	}
+	template<typename t_source>
+	const t_self & operator=(t_source && p_source) {set(std::forward<t_source>(p_source)); return *this;}
+private:
+	mutable ::pfc::readWriteLock m_sync;
+	t_object m_object;
+};
+
+// Read/write lock guarded object store for safe concurrent access
+// With 'has changed since last read' flag
+template<typename t_object>
+class syncd_storage_flagged {
+private:
+	typedef syncd_storage_flagged<t_object> t_self;
+public:
+	syncd_storage_flagged() : m_changed_flag(false) {}
+	template<typename t_source>
+	syncd_storage_flagged(const t_source & p_source, bool initChanged = false) : m_changed_flag(initChanged), m_object(p_source) {}
+	void set_changed(bool p_flag = true) {
+		inWriteSync(m_sync);
+		m_changed_flag = p_flag;
+	}
+	template<typename t_source>
+	void set(t_source && p_in) {
+		inWriteSync(m_sync);
+		m_object = std::forward<t_source>(p_in);
+		m_changed_flag = true;
+	}
+	bool has_changed() const {
+		// No point in locking here
+		// inReadSync(m_sync);
+		return m_changed_flag;
+	}
+	t_object peek() const {inReadSync(m_sync); return m_object;}
+	template<typename t_destination>
+	bool get_if_changed(t_destination & p_out) {
+		inReadSync(m_sync);
+		if (m_changed_flag) {
+			p_out = m_object;
+			m_changed_flag = false;
+			return true;
+		} else {
+			return false;
+		}
+	}
+	t_object get() {
+		inReadSync(m_sync);
+		m_changed_flag = false;
+		return m_object;
+	}
+	t_object get( bool & bHasChanged ) {
+		inReadSync(m_sync);
+		bHasChanged = m_changed_flag;
+		m_changed_flag = false;
+		return m_object;
+	}
+	template<typename t_destination>
+	void get(t_destination & p_out) {
+		inReadSync(m_sync);
+		p_out = m_object;
+		m_changed_flag = false;
+	}
+	template<typename t_source>
+	const t_self & operator=(t_source && p_source) {set(std::forward<t_source>(p_source)); return *this;}
+
+	template<typename arg_t>
+	bool compare_and_set(arg_t&& arg) {
+		inWriteSync(m_sync);
+		bool ret = false;
+		if (arg != m_object) {
+			m_object = std::forward<arg_t>(arg);
+			m_changed_flag = true;
+			ret = true;
+		}
+		return ret;
+	}
+private:
+	mutable volatile bool m_changed_flag;
+	mutable ::pfc::readWriteLock m_sync;
+	t_object m_object;
+};
+
+}
\ No newline at end of file