summaryrefslogtreecommitdiff
path: root/src/object.c
diff options
context:
space:
mode:
author[email protected] <[email protected]>2011-06-12 10:01:48 +0000
committer[email protected] <[email protected]>2011-06-12 10:01:48 +0000
commit864bd1180237c952beefda21266c3f76f288b99a (patch)
tree0d437761b4efee23c50b0a6e88e6a664fd55b2cf /src/object.c
parent8c3d1e5eaec88d77a2fe623e9d478b9542bad040 (diff)
Add reentrance check. Put kernel debug switch together.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1494 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'src/object.c')
-rw-r--r--src/object.c53
1 files changed, 46 insertions, 7 deletions
diff --git a/src/object.c b/src/object.c
index 65551ca6a7..75c59e33cb 100644
--- a/src/object.c
+++ b/src/object.c
@@ -84,7 +84,15 @@ void (*rt_object_put_hook)(struct rt_object* object);
*/
void rt_object_attach_sethook(void (*hook)(struct rt_object* object))
{
+ register rt_base_t temp;
+
+ /* disable interrupt */
+ temp = rt_hw_interrupt_disable();
+
rt_object_attach_hook = hook;
+
+ /* enable interrupt */
+ rt_hw_interrupt_enable(temp);
}
/**
@@ -95,7 +103,15 @@ void rt_object_attach_sethook(void (*hook)(struct rt_object* object))
*/
void rt_object_detach_sethook(void (*hook)(struct rt_object* object))
{
+ register rt_base_t temp;
+
+ /* disable interrupt */
+ temp = rt_hw_interrupt_disable();
+
rt_object_detach_hook = hook;
+
+ /* enable interrupt */
+ rt_hw_interrupt_enable(temp);
}
/**
@@ -113,7 +129,15 @@ void rt_object_detach_sethook(void (*hook)(struct rt_object* object))
*/
void rt_object_trytake_sethook(void (*hook)(struct rt_object* object))
{
+ register rt_base_t temp;
+
+ /* disable interrupt */
+ temp = rt_hw_interrupt_disable();
+
rt_object_trytake_hook = hook;
+
+ /* enable interrupt */
+ rt_hw_interrupt_enable(temp);
}
/**
@@ -132,7 +156,15 @@ void rt_object_trytake_sethook(void (*hook)(struct rt_object* object))
*/
void rt_object_take_sethook(void (*hook)(struct rt_object* object))
{
+ register rt_base_t temp;
+
+ /* disable interrupt */
+ temp = rt_hw_interrupt_disable();
+
rt_object_take_hook = hook;
+
+ /* enable interrupt */
+ rt_hw_interrupt_enable(temp);
}
/**
@@ -143,7 +175,15 @@ void rt_object_take_sethook(void (*hook)(struct rt_object* object))
*/
void rt_object_put_sethook(void (*hook)(struct rt_object* object))
{
+ register rt_base_t temp;
+
+ /* disable interrupt */
+ temp = rt_hw_interrupt_disable();
+
rt_object_put_hook = hook;
+
+ /* enable interrupt */
+ rt_hw_interrupt_enable(temp);
}
/*@}*/
@@ -199,10 +239,7 @@ void rt_object_init(struct rt_object* object, enum rt_object_class_type type, co
}
#ifdef RT_USING_HOOK
- if (rt_object_attach_hook != RT_NULL)
- {
- rt_object_attach_hook(object);
- }
+ RT_OBJECT_HOOK_CALL2(rt_object_attach_hook,object);
#endif
/* lock interrupt */
@@ -229,7 +266,7 @@ void rt_object_detach(rt_object_t object)
RT_ASSERT(object != RT_NULL);
#ifdef RT_USING_HOOK
- if (rt_object_detach_hook != RT_NULL) rt_object_detach_hook(object);
+ RT_OBJECT_HOOK_CALL2(rt_object_detach_hook,object);
#endif
/* lock interrupt */
@@ -257,6 +294,8 @@ rt_object_t rt_object_allocate(enum rt_object_class_type type, const char* name)
register rt_base_t temp;
struct rt_object_information* information;
+ RT_DEBUG_NOT_REENT
+
#ifdef RT_USING_MODULE
/* get module object information, module object should be managed by kernel object container */
information = (rt_module_self() != RT_NULL && (type != RT_Object_Class_Module)) ?
@@ -296,7 +335,7 @@ rt_object_t rt_object_allocate(enum rt_object_class_type type, const char* name)
}
#ifdef RT_USING_HOOK
- if (rt_object_attach_hook != RT_NULL) rt_object_attach_hook(object);
+ RT_OBJECT_HOOK_CALL2(rt_object_attach_hook,object);
#endif
/* lock interrupt */
@@ -326,7 +365,7 @@ void rt_object_delete(rt_object_t object)
RT_ASSERT(!(object->type & RT_Object_Class_Static));
#ifdef RT_USING_HOOK
- if (rt_object_detach_hook != RT_NULL) rt_object_detach_hook(object);
+ RT_OBJECT_HOOK_CALL2(rt_object_detach_hook,object);
#endif
/* lock interrupt */