Browse Source

[Kernel] The rt_object_find routine can support to find an object inside a module. The usage is: rt_object_find("module_name/object_name").

bernard 10 years ago
parent
commit
4e2a6cc361
1 changed files with 60 additions and 5 deletions
  1. 60 5
      src/object.c

+ 60 - 5
src/object.c

@@ -403,22 +403,77 @@ rt_object_t rt_object_find(const char *name, rt_uint8_t type)
 {
     struct rt_object *object;
     struct rt_list_node *node;
-    struct rt_object_information *information;
-    extern volatile rt_uint8_t rt_interrupt_nest;
+    struct rt_object_information *information = RT_NULL;
 
     /* parameter check */
     if ((name == RT_NULL) || (type > RT_Object_Class_Unknown))
         return RT_NULL;
 
     /* which is invoke in interrupt status */
-    if (rt_interrupt_nest != 0)
-        RT_ASSERT(0);
+    RT_DEBUG_NOT_IN_INTERRUPT;
+
+#ifdef RT_USING_MODULE
+    /* check whether to find a object inside a module. */
+    {
+        const char *name_ptr;
+        int module_name_length;
+        
+        name_ptr = name;
+        while ((*name_ptr != '\0') && (*name_ptr != '/'))
+            name_ptr ++;
+
+        if (*name_ptr == '/')
+        {
+            struct rt_module* module = RT_NULL;
+
+            /* get the name length of module */
+            module_name_length = name_ptr - name;
+
+            /* enter critical */
+            rt_enter_critical();
+
+            /* find module */
+            information = &rt_object_container[RT_Object_Class_Module];
+            for (node = information->object_list.next; 
+                node != &(information->object_list);
+                node  = node->next)
+            {
+                object = rt_list_entry(node, struct rt_object, list);
+                if ((rt_strncmp(object->name, name, module_name_length) == 0) &&
+                    module_name_length == RT_NAME_MAX || object->name[module_name_length] == '\0')
+                {
+                    /* get module */
+                    module = (struct rt_module*)object;
+                    break;
+                }
+            }
+            rt_exit_critical();
+
+            /* there is no this module inside the system */
+            if (module == RT_NULL) return RT_NULL; 
+
+            /* get the object pool of module */
+            information = &(module->module_object[type]);
+
+            /* get object name */
+            while ((*name_ptr == '/') && (*name_ptr != '\0')) name_ptr ++;
+            if (*name_ptr == '\0')
+            {
+                if (type == RT_Object_Class_Module) return object;
+                return RT_NULL;
+            }
+
+            /* point to the object name */
+            name = name_ptr;
+        }
+    }
+#endif
 
     /* enter critical */
     rt_enter_critical();
 
     /* try to find object */
-    information = &rt_object_container[type];
+    if (information == RT_NULL) information = &rt_object_container[type];
     for (node  = information->object_list.next;
          node != &(information->object_list);
          node  = node->next)