xref: /nrf52832-nimble/rt-thread/src/object.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2006-03-14     Bernard      the first version
9*10465441SEvalZero  * 2006-04-21     Bernard      change the scheduler lock to interrupt lock
10*10465441SEvalZero  * 2006-05-18     Bernard      fix the object init bug
11*10465441SEvalZero  * 2006-08-03     Bernard      add hook support
12*10465441SEvalZero  * 2007-01-28     Bernard      rename RT_OBJECT_Class_Static to RT_Object_Class_Static
13*10465441SEvalZero  * 2010-10-26     yi.qiu       add module support in rt_object_allocate and rt_object_free
14*10465441SEvalZero  * 2017-12-10     Bernard      Add object_info enum.
15*10465441SEvalZero  * 2018-01-25     Bernard      Fix the object find issue when enable MODULE.
16*10465441SEvalZero  */
17*10465441SEvalZero 
18*10465441SEvalZero #include <rtthread.h>
19*10465441SEvalZero #include <rthw.h>
20*10465441SEvalZero 
21*10465441SEvalZero #ifdef RT_USING_MODULE
22*10465441SEvalZero #include <dlmodule.h>
23*10465441SEvalZero #endif
24*10465441SEvalZero 
25*10465441SEvalZero /*
26*10465441SEvalZero  * define object_info for the number of rt_object_container items.
27*10465441SEvalZero  */
28*10465441SEvalZero enum rt_object_info_type
29*10465441SEvalZero {
30*10465441SEvalZero     RT_Object_Info_Thread = 0,                         /**< The object is a thread. */
31*10465441SEvalZero #ifdef RT_USING_SEMAPHORE
32*10465441SEvalZero     RT_Object_Info_Semaphore,                          /**< The object is a semaphore. */
33*10465441SEvalZero #endif
34*10465441SEvalZero #ifdef RT_USING_MUTEX
35*10465441SEvalZero     RT_Object_Info_Mutex,                              /**< The object is a mutex. */
36*10465441SEvalZero #endif
37*10465441SEvalZero #ifdef RT_USING_EVENT
38*10465441SEvalZero     RT_Object_Info_Event,                              /**< The object is a event. */
39*10465441SEvalZero #endif
40*10465441SEvalZero #ifdef RT_USING_MAILBOX
41*10465441SEvalZero     RT_Object_Info_MailBox,                            /**< The object is a mail box. */
42*10465441SEvalZero #endif
43*10465441SEvalZero #ifdef RT_USING_MESSAGEQUEUE
44*10465441SEvalZero     RT_Object_Info_MessageQueue,                       /**< The object is a message queue. */
45*10465441SEvalZero #endif
46*10465441SEvalZero #ifdef RT_USING_MEMHEAP
47*10465441SEvalZero     RT_Object_Info_MemHeap,                            /**< The object is a memory heap */
48*10465441SEvalZero #endif
49*10465441SEvalZero #ifdef RT_USING_MEMPOOL
50*10465441SEvalZero     RT_Object_Info_MemPool,                            /**< The object is a memory pool. */
51*10465441SEvalZero #endif
52*10465441SEvalZero #ifdef RT_USING_DEVICE
53*10465441SEvalZero     RT_Object_Info_Device,                             /**< The object is a device */
54*10465441SEvalZero #endif
55*10465441SEvalZero     RT_Object_Info_Timer,                              /**< The object is a timer. */
56*10465441SEvalZero #ifdef RT_USING_MODULE
57*10465441SEvalZero     RT_Object_Info_Module,                             /**< The object is a module. */
58*10465441SEvalZero #endif
59*10465441SEvalZero     RT_Object_Info_Unknown,                            /**< The object is unknown. */
60*10465441SEvalZero };
61*10465441SEvalZero 
62*10465441SEvalZero #define _OBJ_CONTAINER_LIST_INIT(c)     \
63*10465441SEvalZero     {&(rt_object_container[c].object_list), &(rt_object_container[c].object_list)}
64*10465441SEvalZero static struct rt_object_information rt_object_container[RT_Object_Info_Unknown] =
65*10465441SEvalZero {
66*10465441SEvalZero     /* initialize object container - thread */
67*10465441SEvalZero     {RT_Object_Class_Thread, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Thread), sizeof(struct rt_thread)},
68*10465441SEvalZero #ifdef RT_USING_SEMAPHORE
69*10465441SEvalZero     /* initialize object container - semaphore */
70*10465441SEvalZero     {RT_Object_Class_Semaphore, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Semaphore), sizeof(struct rt_semaphore)},
71*10465441SEvalZero #endif
72*10465441SEvalZero #ifdef RT_USING_MUTEX
73*10465441SEvalZero     /* initialize object container - mutex */
74*10465441SEvalZero     {RT_Object_Class_Mutex, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Mutex), sizeof(struct rt_mutex)},
75*10465441SEvalZero #endif
76*10465441SEvalZero #ifdef RT_USING_EVENT
77*10465441SEvalZero     /* initialize object container - event */
78*10465441SEvalZero     {RT_Object_Class_Event, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Event), sizeof(struct rt_event)},
79*10465441SEvalZero #endif
80*10465441SEvalZero #ifdef RT_USING_MAILBOX
81*10465441SEvalZero     /* initialize object container - mailbox */
82*10465441SEvalZero     {RT_Object_Class_MailBox, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_MailBox), sizeof(struct rt_mailbox)},
83*10465441SEvalZero #endif
84*10465441SEvalZero #ifdef RT_USING_MESSAGEQUEUE
85*10465441SEvalZero     /* initialize object container - message queue */
86*10465441SEvalZero     {RT_Object_Class_MessageQueue, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_MessageQueue), sizeof(struct rt_messagequeue)},
87*10465441SEvalZero #endif
88*10465441SEvalZero #ifdef RT_USING_MEMHEAP
89*10465441SEvalZero     /* initialize object container - memory heap */
90*10465441SEvalZero     {RT_Object_Class_MemHeap, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_MemHeap), sizeof(struct rt_memheap)},
91*10465441SEvalZero #endif
92*10465441SEvalZero #ifdef RT_USING_MEMPOOL
93*10465441SEvalZero     /* initialize object container - memory pool */
94*10465441SEvalZero     {RT_Object_Class_MemPool, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_MemPool), sizeof(struct rt_mempool)},
95*10465441SEvalZero #endif
96*10465441SEvalZero #ifdef RT_USING_DEVICE
97*10465441SEvalZero     /* initialize object container - device */
98*10465441SEvalZero     {RT_Object_Class_Device, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Device), sizeof(struct rt_device)},
99*10465441SEvalZero #endif
100*10465441SEvalZero     /* initialize object container - timer */
101*10465441SEvalZero     {RT_Object_Class_Timer, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Timer), sizeof(struct rt_timer)},
102*10465441SEvalZero #ifdef RT_USING_MODULE
103*10465441SEvalZero     /* initialize object container - module */
104*10465441SEvalZero     {RT_Object_Class_Module, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Module), sizeof(struct rt_dlmodule)},
105*10465441SEvalZero #endif
106*10465441SEvalZero };
107*10465441SEvalZero 
108*10465441SEvalZero #ifdef RT_USING_HOOK
109*10465441SEvalZero static void (*rt_object_attach_hook)(struct rt_object *object);
110*10465441SEvalZero static void (*rt_object_detach_hook)(struct rt_object *object);
111*10465441SEvalZero void (*rt_object_trytake_hook)(struct rt_object *object);
112*10465441SEvalZero void (*rt_object_take_hook)(struct rt_object *object);
113*10465441SEvalZero void (*rt_object_put_hook)(struct rt_object *object);
114*10465441SEvalZero 
115*10465441SEvalZero /**
116*10465441SEvalZero  * @addtogroup Hook
117*10465441SEvalZero  */
118*10465441SEvalZero 
119*10465441SEvalZero /**@{*/
120*10465441SEvalZero 
121*10465441SEvalZero /**
122*10465441SEvalZero  * This function will set a hook function, which will be invoked when object
123*10465441SEvalZero  * attaches to kernel object system.
124*10465441SEvalZero  *
125*10465441SEvalZero  * @param hook the hook function
126*10465441SEvalZero  */
rt_object_attach_sethook(void (* hook)(struct rt_object * object))127*10465441SEvalZero void rt_object_attach_sethook(void (*hook)(struct rt_object *object))
128*10465441SEvalZero {
129*10465441SEvalZero     rt_object_attach_hook = hook;
130*10465441SEvalZero }
131*10465441SEvalZero 
132*10465441SEvalZero /**
133*10465441SEvalZero  * This function will set a hook function, which will be invoked when object
134*10465441SEvalZero  * detaches from kernel object system.
135*10465441SEvalZero  *
136*10465441SEvalZero  * @param hook the hook function
137*10465441SEvalZero  */
rt_object_detach_sethook(void (* hook)(struct rt_object * object))138*10465441SEvalZero void rt_object_detach_sethook(void (*hook)(struct rt_object *object))
139*10465441SEvalZero {
140*10465441SEvalZero     rt_object_detach_hook = hook;
141*10465441SEvalZero }
142*10465441SEvalZero 
143*10465441SEvalZero /**
144*10465441SEvalZero  * This function will set a hook function, which will be invoked when object
145*10465441SEvalZero  * is taken from kernel object system.
146*10465441SEvalZero  *
147*10465441SEvalZero  * The object is taken means:
148*10465441SEvalZero  * semaphore - semaphore is taken by thread
149*10465441SEvalZero  * mutex - mutex is taken by thread
150*10465441SEvalZero  * event - event is received by thread
151*10465441SEvalZero  * mailbox - mail is received by thread
152*10465441SEvalZero  * message queue - message is received by thread
153*10465441SEvalZero  *
154*10465441SEvalZero  * @param hook the hook function
155*10465441SEvalZero  */
rt_object_trytake_sethook(void (* hook)(struct rt_object * object))156*10465441SEvalZero void rt_object_trytake_sethook(void (*hook)(struct rt_object *object))
157*10465441SEvalZero {
158*10465441SEvalZero     rt_object_trytake_hook = hook;
159*10465441SEvalZero }
160*10465441SEvalZero 
161*10465441SEvalZero /**
162*10465441SEvalZero  * This function will set a hook function, which will be invoked when object
163*10465441SEvalZero  * have been taken from kernel object system.
164*10465441SEvalZero  *
165*10465441SEvalZero  * The object have been taken means:
166*10465441SEvalZero  * semaphore - semaphore have been taken by thread
167*10465441SEvalZero  * mutex - mutex have been taken by thread
168*10465441SEvalZero  * event - event have been received by thread
169*10465441SEvalZero  * mailbox - mail have been received by thread
170*10465441SEvalZero  * message queue - message have been received by thread
171*10465441SEvalZero  * timer - timer is started
172*10465441SEvalZero  *
173*10465441SEvalZero  * @param hook the hook function
174*10465441SEvalZero  */
rt_object_take_sethook(void (* hook)(struct rt_object * object))175*10465441SEvalZero void rt_object_take_sethook(void (*hook)(struct rt_object *object))
176*10465441SEvalZero {
177*10465441SEvalZero     rt_object_take_hook = hook;
178*10465441SEvalZero }
179*10465441SEvalZero 
180*10465441SEvalZero /**
181*10465441SEvalZero  * This function will set a hook function, which will be invoked when object
182*10465441SEvalZero  * is put to kernel object system.
183*10465441SEvalZero  *
184*10465441SEvalZero  * @param hook the hook function
185*10465441SEvalZero  */
rt_object_put_sethook(void (* hook)(struct rt_object * object))186*10465441SEvalZero void rt_object_put_sethook(void (*hook)(struct rt_object *object))
187*10465441SEvalZero {
188*10465441SEvalZero     rt_object_put_hook = hook;
189*10465441SEvalZero }
190*10465441SEvalZero 
191*10465441SEvalZero /**@}*/
192*10465441SEvalZero #endif
193*10465441SEvalZero 
194*10465441SEvalZero /**
195*10465441SEvalZero  * @ingroup SystemInit
196*10465441SEvalZero  *
197*10465441SEvalZero  * This function will initialize system object management.
198*10465441SEvalZero  *
199*10465441SEvalZero  * @deprecated since 0.3.0, this function does not need to be invoked
200*10465441SEvalZero  * in the system initialization.
201*10465441SEvalZero  */
rt_system_object_init(void)202*10465441SEvalZero void rt_system_object_init(void)
203*10465441SEvalZero {
204*10465441SEvalZero }
205*10465441SEvalZero 
206*10465441SEvalZero /**
207*10465441SEvalZero  * @addtogroup KernelObject
208*10465441SEvalZero  */
209*10465441SEvalZero 
210*10465441SEvalZero /**@{*/
211*10465441SEvalZero 
212*10465441SEvalZero /**
213*10465441SEvalZero  * This function will return the specified type of object information.
214*10465441SEvalZero  *
215*10465441SEvalZero  * @param type the type of object
216*10465441SEvalZero  * @return the object type information or RT_NULL
217*10465441SEvalZero  */
218*10465441SEvalZero struct rt_object_information *
rt_object_get_information(enum rt_object_class_type type)219*10465441SEvalZero rt_object_get_information(enum rt_object_class_type type)
220*10465441SEvalZero {
221*10465441SEvalZero     int index;
222*10465441SEvalZero 
223*10465441SEvalZero     for (index = 0; index < RT_Object_Info_Unknown; index ++)
224*10465441SEvalZero         if (rt_object_container[index].type == type) return &rt_object_container[index];
225*10465441SEvalZero 
226*10465441SEvalZero     return RT_NULL;
227*10465441SEvalZero }
228*10465441SEvalZero RTM_EXPORT(rt_object_get_information);
229*10465441SEvalZero 
230*10465441SEvalZero /**
231*10465441SEvalZero  * This function will initialize an object and add it to object system
232*10465441SEvalZero  * management.
233*10465441SEvalZero  *
234*10465441SEvalZero  * @param object the specified object to be initialized.
235*10465441SEvalZero  * @param type the object type.
236*10465441SEvalZero  * @param name the object name. In system, the object's name must be unique.
237*10465441SEvalZero  */
rt_object_init(struct rt_object * object,enum rt_object_class_type type,const char * name)238*10465441SEvalZero void rt_object_init(struct rt_object         *object,
239*10465441SEvalZero                     enum rt_object_class_type type,
240*10465441SEvalZero                     const char               *name)
241*10465441SEvalZero {
242*10465441SEvalZero     register rt_base_t temp;
243*10465441SEvalZero     struct rt_object_information *information;
244*10465441SEvalZero #ifdef RT_USING_MODULE
245*10465441SEvalZero     struct rt_dlmodule *module = dlmodule_self();
246*10465441SEvalZero #endif
247*10465441SEvalZero 
248*10465441SEvalZero     /* get object information */
249*10465441SEvalZero     information = rt_object_get_information(type);
250*10465441SEvalZero     RT_ASSERT(information != RT_NULL);
251*10465441SEvalZero 
252*10465441SEvalZero     /* initialize object's parameters */
253*10465441SEvalZero 
254*10465441SEvalZero     /* set object type to static */
255*10465441SEvalZero     object->type = type | RT_Object_Class_Static;
256*10465441SEvalZero 
257*10465441SEvalZero     /* copy name */
258*10465441SEvalZero     rt_strncpy(object->name, name, RT_NAME_MAX);
259*10465441SEvalZero 
260*10465441SEvalZero     RT_OBJECT_HOOK_CALL(rt_object_attach_hook, (object));
261*10465441SEvalZero 
262*10465441SEvalZero     /* lock interrupt */
263*10465441SEvalZero     temp = rt_hw_interrupt_disable();
264*10465441SEvalZero 
265*10465441SEvalZero #ifdef RT_USING_MODULE
266*10465441SEvalZero     if (module)
267*10465441SEvalZero     {
268*10465441SEvalZero         rt_list_insert_after(&(module->object_list), &(object->list));
269*10465441SEvalZero         object->module_id = (void *)module;
270*10465441SEvalZero     }
271*10465441SEvalZero     else
272*10465441SEvalZero #endif
273*10465441SEvalZero     {
274*10465441SEvalZero         /* insert object into information object list */
275*10465441SEvalZero         rt_list_insert_after(&(information->object_list), &(object->list));
276*10465441SEvalZero     }
277*10465441SEvalZero 
278*10465441SEvalZero     /* unlock interrupt */
279*10465441SEvalZero     rt_hw_interrupt_enable(temp);
280*10465441SEvalZero }
281*10465441SEvalZero 
282*10465441SEvalZero /**
283*10465441SEvalZero  * This function will detach a static object from object system,
284*10465441SEvalZero  * and the memory of static object is not freed.
285*10465441SEvalZero  *
286*10465441SEvalZero  * @param object the specified object to be detached.
287*10465441SEvalZero  */
rt_object_detach(rt_object_t object)288*10465441SEvalZero void rt_object_detach(rt_object_t object)
289*10465441SEvalZero {
290*10465441SEvalZero     register rt_base_t temp;
291*10465441SEvalZero 
292*10465441SEvalZero     /* object check */
293*10465441SEvalZero     RT_ASSERT(object != RT_NULL);
294*10465441SEvalZero 
295*10465441SEvalZero     RT_OBJECT_HOOK_CALL(rt_object_detach_hook, (object));
296*10465441SEvalZero 
297*10465441SEvalZero     /* reset object type */
298*10465441SEvalZero     object->type = 0;
299*10465441SEvalZero 
300*10465441SEvalZero     /* lock interrupt */
301*10465441SEvalZero     temp = rt_hw_interrupt_disable();
302*10465441SEvalZero 
303*10465441SEvalZero     /* remove from old list */
304*10465441SEvalZero     rt_list_remove(&(object->list));
305*10465441SEvalZero 
306*10465441SEvalZero     /* unlock interrupt */
307*10465441SEvalZero     rt_hw_interrupt_enable(temp);
308*10465441SEvalZero }
309*10465441SEvalZero 
310*10465441SEvalZero #ifdef RT_USING_HEAP
311*10465441SEvalZero /**
312*10465441SEvalZero  * This function will allocate an object from object system
313*10465441SEvalZero  *
314*10465441SEvalZero  * @param type the type of object
315*10465441SEvalZero  * @param name the object name. In system, the object's name must be unique.
316*10465441SEvalZero  *
317*10465441SEvalZero  * @return object
318*10465441SEvalZero  */
rt_object_allocate(enum rt_object_class_type type,const char * name)319*10465441SEvalZero rt_object_t rt_object_allocate(enum rt_object_class_type type, const char *name)
320*10465441SEvalZero {
321*10465441SEvalZero     struct rt_object *object;
322*10465441SEvalZero     register rt_base_t temp;
323*10465441SEvalZero     struct rt_object_information *information;
324*10465441SEvalZero #ifdef RT_USING_MODULE
325*10465441SEvalZero     struct rt_dlmodule *module = dlmodule_self();
326*10465441SEvalZero #endif
327*10465441SEvalZero 
328*10465441SEvalZero     RT_DEBUG_NOT_IN_INTERRUPT;
329*10465441SEvalZero 
330*10465441SEvalZero     /* get object information */
331*10465441SEvalZero     information = rt_object_get_information(type);
332*10465441SEvalZero     RT_ASSERT(information != RT_NULL);
333*10465441SEvalZero 
334*10465441SEvalZero     object = (struct rt_object *)RT_KERNEL_MALLOC(information->object_size);
335*10465441SEvalZero     if (object == RT_NULL)
336*10465441SEvalZero     {
337*10465441SEvalZero         /* no memory can be allocated */
338*10465441SEvalZero         return RT_NULL;
339*10465441SEvalZero     }
340*10465441SEvalZero 
341*10465441SEvalZero     /* clean memory data of object */
342*10465441SEvalZero     rt_memset(object, 0x0, information->object_size);
343*10465441SEvalZero 
344*10465441SEvalZero     /* initialize object's parameters */
345*10465441SEvalZero 
346*10465441SEvalZero     /* set object type */
347*10465441SEvalZero     object->type = type;
348*10465441SEvalZero 
349*10465441SEvalZero     /* set object flag */
350*10465441SEvalZero     object->flag = 0;
351*10465441SEvalZero 
352*10465441SEvalZero     /* copy name */
353*10465441SEvalZero     rt_strncpy(object->name, name, RT_NAME_MAX);
354*10465441SEvalZero 
355*10465441SEvalZero     RT_OBJECT_HOOK_CALL(rt_object_attach_hook, (object));
356*10465441SEvalZero 
357*10465441SEvalZero     /* lock interrupt */
358*10465441SEvalZero     temp = rt_hw_interrupt_disable();
359*10465441SEvalZero 
360*10465441SEvalZero #ifdef RT_USING_MODULE
361*10465441SEvalZero     if (module)
362*10465441SEvalZero     {
363*10465441SEvalZero         rt_list_insert_after(&(module->object_list), &(object->list));
364*10465441SEvalZero         object->module_id = (void *)module;
365*10465441SEvalZero     }
366*10465441SEvalZero     else
367*10465441SEvalZero #endif
368*10465441SEvalZero     {
369*10465441SEvalZero         /* insert object into information object list */
370*10465441SEvalZero         rt_list_insert_after(&(information->object_list), &(object->list));
371*10465441SEvalZero     }
372*10465441SEvalZero 
373*10465441SEvalZero     /* unlock interrupt */
374*10465441SEvalZero     rt_hw_interrupt_enable(temp);
375*10465441SEvalZero 
376*10465441SEvalZero     /* return object */
377*10465441SEvalZero     return object;
378*10465441SEvalZero }
379*10465441SEvalZero 
380*10465441SEvalZero /**
381*10465441SEvalZero  * This function will delete an object and release object memory.
382*10465441SEvalZero  *
383*10465441SEvalZero  * @param object the specified object to be deleted.
384*10465441SEvalZero  */
rt_object_delete(rt_object_t object)385*10465441SEvalZero void rt_object_delete(rt_object_t object)
386*10465441SEvalZero {
387*10465441SEvalZero     register rt_base_t temp;
388*10465441SEvalZero 
389*10465441SEvalZero     /* object check */
390*10465441SEvalZero     RT_ASSERT(object != RT_NULL);
391*10465441SEvalZero     RT_ASSERT(!(object->type & RT_Object_Class_Static));
392*10465441SEvalZero 
393*10465441SEvalZero     RT_OBJECT_HOOK_CALL(rt_object_detach_hook, (object));
394*10465441SEvalZero 
395*10465441SEvalZero     /* reset object type */
396*10465441SEvalZero     object->type = 0;
397*10465441SEvalZero 
398*10465441SEvalZero     /* lock interrupt */
399*10465441SEvalZero     temp = rt_hw_interrupt_disable();
400*10465441SEvalZero 
401*10465441SEvalZero     /* remove from old list */
402*10465441SEvalZero     rt_list_remove(&(object->list));
403*10465441SEvalZero 
404*10465441SEvalZero     /* unlock interrupt */
405*10465441SEvalZero     rt_hw_interrupt_enable(temp);
406*10465441SEvalZero 
407*10465441SEvalZero     /* free the memory of object */
408*10465441SEvalZero     RT_KERNEL_FREE(object);
409*10465441SEvalZero }
410*10465441SEvalZero #endif
411*10465441SEvalZero 
412*10465441SEvalZero /**
413*10465441SEvalZero  * This function will judge the object is system object or not.
414*10465441SEvalZero  * Normally, the system object is a static object and the type
415*10465441SEvalZero  * of object set to RT_Object_Class_Static.
416*10465441SEvalZero  *
417*10465441SEvalZero  * @param object the specified object to be judged.
418*10465441SEvalZero  *
419*10465441SEvalZero  * @return RT_TRUE if a system object, RT_FALSE for others.
420*10465441SEvalZero  */
rt_object_is_systemobject(rt_object_t object)421*10465441SEvalZero rt_bool_t rt_object_is_systemobject(rt_object_t object)
422*10465441SEvalZero {
423*10465441SEvalZero     /* object check */
424*10465441SEvalZero     RT_ASSERT(object != RT_NULL);
425*10465441SEvalZero 
426*10465441SEvalZero     if (object->type & RT_Object_Class_Static)
427*10465441SEvalZero         return RT_TRUE;
428*10465441SEvalZero 
429*10465441SEvalZero     return RT_FALSE;
430*10465441SEvalZero }
431*10465441SEvalZero 
432*10465441SEvalZero /**
433*10465441SEvalZero  * This function will return the type of object without
434*10465441SEvalZero  * RT_Object_Class_Static flag.
435*10465441SEvalZero  *
436*10465441SEvalZero  * @param object the specified object to be get type.
437*10465441SEvalZero  *
438*10465441SEvalZero  * @return the type of object.
439*10465441SEvalZero  */
rt_object_get_type(rt_object_t object)440*10465441SEvalZero rt_uint8_t rt_object_get_type(rt_object_t object)
441*10465441SEvalZero {
442*10465441SEvalZero     /* object check */
443*10465441SEvalZero     RT_ASSERT(object != RT_NULL);
444*10465441SEvalZero 
445*10465441SEvalZero     return object->type & ~RT_Object_Class_Static;
446*10465441SEvalZero }
447*10465441SEvalZero 
448*10465441SEvalZero /**
449*10465441SEvalZero  * This function will find specified name object from object
450*10465441SEvalZero  * container.
451*10465441SEvalZero  *
452*10465441SEvalZero  * @param name the specified name of object.
453*10465441SEvalZero  * @param type the type of object
454*10465441SEvalZero  *
455*10465441SEvalZero  * @return the found object or RT_NULL if there is no this object
456*10465441SEvalZero  * in object container.
457*10465441SEvalZero  *
458*10465441SEvalZero  * @note this function shall not be invoked in interrupt status.
459*10465441SEvalZero  */
rt_object_find(const char * name,rt_uint8_t type)460*10465441SEvalZero rt_object_t rt_object_find(const char *name, rt_uint8_t type)
461*10465441SEvalZero {
462*10465441SEvalZero     struct rt_object *object = RT_NULL;
463*10465441SEvalZero     struct rt_list_node *node = RT_NULL;
464*10465441SEvalZero     struct rt_object_information *information = RT_NULL;
465*10465441SEvalZero 
466*10465441SEvalZero     /* parameter check */
467*10465441SEvalZero     if ((name == RT_NULL) || (type > RT_Object_Class_Unknown))
468*10465441SEvalZero         return RT_NULL;
469*10465441SEvalZero 
470*10465441SEvalZero     /* which is invoke in interrupt status */
471*10465441SEvalZero     RT_DEBUG_NOT_IN_INTERRUPT;
472*10465441SEvalZero 
473*10465441SEvalZero     /* enter critical */
474*10465441SEvalZero     rt_enter_critical();
475*10465441SEvalZero 
476*10465441SEvalZero     /* try to find object */
477*10465441SEvalZero     if (information == RT_NULL)
478*10465441SEvalZero     {
479*10465441SEvalZero         information = rt_object_get_information((enum rt_object_class_type)type);
480*10465441SEvalZero         RT_ASSERT(information != RT_NULL);
481*10465441SEvalZero     }
482*10465441SEvalZero     for (node  = information->object_list.next;
483*10465441SEvalZero             node != &(information->object_list);
484*10465441SEvalZero             node  = node->next)
485*10465441SEvalZero     {
486*10465441SEvalZero         object = rt_list_entry(node, struct rt_object, list);
487*10465441SEvalZero         if (rt_strncmp(object->name, name, RT_NAME_MAX) == 0)
488*10465441SEvalZero         {
489*10465441SEvalZero             /* leave critical */
490*10465441SEvalZero             rt_exit_critical();
491*10465441SEvalZero 
492*10465441SEvalZero             return object;
493*10465441SEvalZero         }
494*10465441SEvalZero     }
495*10465441SEvalZero 
496*10465441SEvalZero     /* leave critical */
497*10465441SEvalZero     rt_exit_critical();
498*10465441SEvalZero 
499*10465441SEvalZero     return RT_NULL;
500*10465441SEvalZero }
501*10465441SEvalZero 
502*10465441SEvalZero /**@}*/
503