From Jérôme Duval <jerome.duval@xxxxxxxxx>:
Jérôme Duval has uploaded this change for review. (
https://review.haiku-os.org/c/haiku/+/2419 ;)
Change subject: device_manager: add find_child_node
......................................................................
device_manager: add find_child_node
to find a node in the hierarchy.
---
M headers/os/drivers/device_manager.h
M src/system/kernel/device_manager/device_manager.cpp
2 files changed, 51 insertions(+), 0 deletions(-)
git pull ssh://git.haiku-os.org:22/haiku refs/changes/19/2419/1
diff --git a/headers/os/drivers/device_manager.h
b/headers/os/drivers/device_manager.h
index 58b21af..f1cf609 100644
--- a/headers/os/drivers/device_manager.h
+++ b/headers/os/drivers/device_manager.h
@@ -115,6 +115,9 @@
status_t (*set_attr_raw)(device_node *node, const char *name,
const void *data, size_t size);
+ status_t (*find_child_node)(device_node *parent,
+ const device_attr *attrs, device_node
**node);
+
} device_manager_info;
diff --git a/src/system/kernel/device_manager/device_manager.cpp
b/src/system/kernel/device_manager/device_manager.cpp
index f16819c..ea088a7 100644
--- a/src/system/kernel/device_manager/device_manager.cpp
+++ b/src/system/kernel/device_manager/device_manager.cpp
@@ -1049,6 +1049,53 @@
}
+static status_t
+find_child_node(device_node* parent, const device_attr* attributes,
+ device_node** _node, bool *_lastFound)
+{
+ RecursiveLocker _(sLock);
+
+ NodeList::ConstIterator iterator = parent->Children().GetIterator();
+ device_node* last = *_node;
+
+ // find the next one that fits
+ while (iterator.HasNext()) {
+ device_node* node = iterator.Next();
+
+ if (!node->IsRegistered())
+ continue;
+
+ if (node == last)
+ *_lastFound = true;
+ else if (!node->CompareTo(attributes) && *_lastFound) {
+ if (last != NULL)
+ last->Release();
+
+ node->Acquire();
+ *_node = node;
+ return B_OK;
+ }
+ if (find_child_node(node, attributes, _node, _lastFound) ==
B_OK)
+ return B_OK;
+ }
+
+ return B_ENTRY_NOT_FOUND;
+}
+
+
+static status_t
+find_child_node(device_node* parent, const device_attr* attributes,
+ device_node** _node)
+{
+ device_node* last = *_node;
+ bool lastFound = last == NULL;
+ status_t status = find_child_node(parent, attributes, _node,
&lastFound);
+ if (status == B_ENTRY_NOT_FOUND && last != NULL && lastFound)
+ last->Release();
+ return status;
+}
+
+
struct device_manager_info gDeviceManagerModule = {
{
B_DEVICE_MANAGER_MODULE_NAME,
@@ -1090,6 +1137,7 @@
set_attr_uint64,
set_attr_string,
set_attr_raw,
+ find_child_node
};
--
To view, visit https://review.haiku-os.org/c/haiku/+/2419
To unsubscribe, or for help writing mail filters, visit
https://review.haiku-os.org/settings
Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: Iee858f21ce134569bf25fccbef9fe18ea8787e9d
Gerrit-Change-Number: 2419
Gerrit-PatchSet: 1
Gerrit-Owner: Jérôme Duval <jerome.duval@xxxxxxxxx>
Gerrit-MessageType: newchange