From 26d161fd261d66d65065b7259ebc5026bcb55a1c Mon Sep 17 00:00:00 2001 From: Relintai Date: Thu, 10 Feb 2022 16:47:18 +0100 Subject: [PATCH] Added the ability to request a write lock on the tree. --- core/nodes/node.h | 2 ++ core/nodes/node_tree.cpp | 20 ++++++++++++++++++-- core/nodes/node_tree.h | 5 ++++- web/http/web_server.cpp | 2 ++ 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/core/nodes/node.h b/core/nodes/node.h index bf4694c..7cf9a5b 100644 --- a/core/nodes/node.h +++ b/core/nodes/node.h @@ -18,6 +18,8 @@ public: NOTIFICATION_CHILD_ADDED = 4, NOTIFICATION_CHILD_REMOVED = 5, NOTIFICATION_CHILD_MOVED = 6, + NOTIFICATION_UPDATE = 7, + NOTIFICATION_TREE_WRITE_LOCKED = 8, }; bool is_in_tree() const; diff --git a/core/nodes/node_tree.cpp b/core/nodes/node_tree.cpp index f00c527..ceb2ecb 100644 --- a/core/nodes/node_tree.cpp +++ b/core/nodes/node_tree.cpp @@ -19,8 +19,24 @@ void NodeTree::set_root(Node *root) { } } -void NodeTree::send_update(float delta) { - // todo +void NodeTree::update() { + if (!_root_node) { + return; + } + + _root_node->notification(Node::NOTIFICATION_UPDATE); + + if (_write_lock_requested) { + _rw_lock.write_lock(); + _root_node->notification(Node::NOTIFICATION_TREE_WRITE_LOCKED); + _rw_lock.write_unlock(); + } +} + +void NodeTree::_send_update() { + if (_root_node) { + _root_node->notification(Node::NOTIFICATION_UPDATE); + } } NodeTree::NodeTree() : diff --git a/core/nodes/node_tree.h b/core/nodes/node_tree.h index 6845c1c..7b46a1c 100644 --- a/core/nodes/node_tree.h +++ b/core/nodes/node_tree.h @@ -13,7 +13,7 @@ public: Node *get_root(); virtual void set_root(Node *root); - virtual void send_update(float delta); + virtual void update(); void request_write_lock(); @@ -21,8 +21,11 @@ public: ~NodeTree(); protected: + virtual void _send_update(); + Node *_root_node; float _update_interval; + bool _write_lock_requested; RWLock _rw_lock; }; diff --git a/web/http/web_server.cpp b/web/http/web_server.cpp index cfc18fd..f28220a 100644 --- a/web/http/web_server.cpp +++ b/web/http/web_server.cpp @@ -20,7 +20,9 @@ void WebServer::set_root(Node *root) { void WebServer::handle_request(Request *request) { ERR_FAIL_COND(!_web_root); + _rw_lock.read_lock(); _web_root->handle_request_main(request); + _rw_lock.read_unlock(); }