[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").
This commit is contained in:
parent
9572d3e46a
commit
4e2a6cc361
65
src/object.c
65
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)
|
||||
|
|
Loading…
Reference in New Issue