[haiku-commits] Change in haiku[master]: device_manager: add find_child_node

  • From: Gerrit <review@xxxxxxxxxxxxxxxxxxx>
  • To: waddlesplash <waddlesplash@xxxxxxxxx>, haiku-commits@xxxxxxxxxxxxx
  • Date: Wed, 25 Mar 2020 15:14:21 +0000

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

Other related posts:

  • » [haiku-commits] Change in haiku[master]: device_manager: add find_child_node - Gerrit