[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:
bernard 2014-07-21 06:28:43 +08:00
parent 9572d3e46a
commit 4e2a6cc361
1 changed files with 60 additions and 5 deletions

View File

@ -403,22 +403,77 @@ rt_object_t rt_object_find(const char *name, rt_uint8_t type)
{ {
struct rt_object *object; struct rt_object *object;
struct rt_list_node *node; struct rt_list_node *node;
struct rt_object_information *information; struct rt_object_information *information = RT_NULL;
extern volatile rt_uint8_t rt_interrupt_nest;
/* parameter check */ /* parameter check */
if ((name == RT_NULL) || (type > RT_Object_Class_Unknown)) if ((name == RT_NULL) || (type > RT_Object_Class_Unknown))
return RT_NULL; return RT_NULL;
/* which is invoke in interrupt status */ /* which is invoke in interrupt status */
if (rt_interrupt_nest != 0) RT_DEBUG_NOT_IN_INTERRUPT;
RT_ASSERT(0);
#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 */ /* enter critical */
rt_enter_critical(); rt_enter_critical();
/* try to find object */ /* try to find object */
information = &rt_object_container[type]; if (information == RT_NULL) information = &rt_object_container[type];
for (node = information->object_list.next; for (node = information->object_list.next;
node != &(information->object_list); node != &(information->object_list);
node = node->next) node = node->next)