summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2019-04-03 13:26:51 +0800
committerGitHub <[email protected]>2019-04-03 13:26:51 +0800
commit25186f3e193e3acf4ed818087b5ab637ba2f8523 (patch)
treea9068b7b4f83dd9a1348e3b97e71633d708b2a36 /src
parent3bdfa40f770bebf5cd797b1ac01fab0c4e0af518 (diff)
parent4d3b4abfebc0a4a98c814e66cee807918dcad53d (diff)
Merge pull request #2511 from BernardXiong/fix_object
[WIP][Kernel] Add object re-initialization check.
Diffstat (limited to 'src')
-rw-r--r--src/object.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/object.c b/src/object.c
index 70b9a5c04e..e85737ce8f 100644
--- a/src/object.c
+++ b/src/object.c
@@ -240,6 +240,7 @@ void rt_object_init(struct rt_object *object,
const char *name)
{
register rt_base_t temp;
+ struct rt_list_node *node = RT_NULL;
struct rt_object_information *information;
#ifdef RT_USING_MODULE
struct rt_dlmodule *module = dlmodule_self();
@@ -249,11 +250,26 @@ void rt_object_init(struct rt_object *object,
information = rt_object_get_information(type);
RT_ASSERT(information != RT_NULL);
- /* initialize object's parameters */
+ /* check object type to avoid re-initialization */
+
+ /* enter critical */
+ rt_enter_critical();
+ /* try to find object */
+ for (node = information->object_list.next;
+ node != &(information->object_list);
+ node = node->next)
+ {
+ struct rt_object *obj;
+
+ obj = rt_list_entry(node, struct rt_object, list);
+ RT_ASSERT(obj != object);
+ }
+ /* leave critical */
+ rt_exit_critical();
+ /* initialize object's parameters */
/* set object type to static */
object->type = type | RT_Object_Class_Static;
-
/* copy name */
rt_strncpy(object->name, name, RT_NAME_MAX);