提交 ff705032 编写于 作者: B bernard.xiong

change semaphore and mutex value to unsigned value

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@84 bbd45198-f89e-11dd-88c7-29a3b14d5316
上级 df1d469c
...@@ -397,7 +397,7 @@ struct rt_semaphore ...@@ -397,7 +397,7 @@ struct rt_semaphore
{ {
struct rt_ipc_object parent; struct rt_ipc_object parent;
rt_base_t value; /* value of semaphore. */ rt_ubase_t value; /* value of semaphore. */
}; };
typedef struct rt_semaphore* rt_sem_t; typedef struct rt_semaphore* rt_sem_t;
#endif #endif
...@@ -410,12 +410,12 @@ struct rt_mutex ...@@ -410,12 +410,12 @@ struct rt_mutex
{ {
struct rt_ipc_object parent; struct rt_ipc_object parent;
rt_base_t value; /* value of mutex. */ rt_ubase_t value; /* value of mutex. */
struct rt_thread* owner; /* current owner of mutex. */ struct rt_thread* owner; /* current owner of mutex. */
rt_uint8_t original_priority; /* priority of last thread hold the mutex. */ rt_uint8_t original_priority; /* priority of last thread hold the mutex. */
rt_base_t hold; /* numbers of thread hold the mutex. Only 0 or 1 is legal. */ rt_ubase_t hold; /* numbers of thread hold the mutex. */
}; };
typedef struct rt_mutex* rt_mutex_t; typedef struct rt_mutex* rt_mutex_t;
#endif #endif
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
* 2009-05-21 Yi.qiu fix the sem release bug * 2009-05-21 Yi.qiu fix the sem release bug
* 2009-07-18 Bernard fix the event clear bug * 2009-07-18 Bernard fix the event clear bug
* 2009-09-09 Bernard remove fast event and fix ipc release bug * 2009-09-09 Bernard remove fast event and fix ipc release bug
* 2009-10-10 Bernard change semaphore and mutex value to unsigned value
*/ */
#include <rtthread.h> #include <rtthread.h>
...@@ -344,8 +345,6 @@ rt_err_t rt_sem_take (rt_sem_t sem, rt_int32_t time) ...@@ -344,8 +345,6 @@ rt_err_t rt_sem_take (rt_sem_t sem, rt_int32_t time)
else else
{ {
/* semaphore is unavailable, push to suspend list */ /* semaphore is unavailable, push to suspend list */
sem->value --;
/* get current thread */ /* get current thread */
thread = rt_thread_self(); thread = rt_thread_self();
...@@ -415,11 +414,14 @@ rt_err_t rt_sem_trytake(rt_sem_t sem) ...@@ -415,11 +414,14 @@ rt_err_t rt_sem_trytake(rt_sem_t sem)
rt_err_t rt_sem_release(rt_sem_t sem) rt_err_t rt_sem_release(rt_sem_t sem)
{ {
register rt_base_t temp; register rt_base_t temp;
register rt_bool_t need_schedule;
#ifdef RT_USING_HOOK #ifdef RT_USING_HOOK
if (rt_object_put_hook != RT_NULL) rt_object_put_hook(&(sem->parent.parent)); if (rt_object_put_hook != RT_NULL) rt_object_put_hook(&(sem->parent.parent));
#endif #endif
need_schedule = RT_FALSE;
/* disable interrupt */ /* disable interrupt */
temp = rt_hw_interrupt_disable(); temp = rt_hw_interrupt_disable();
...@@ -428,25 +430,20 @@ rt_err_t rt_sem_release(rt_sem_t sem) ...@@ -428,25 +430,20 @@ rt_err_t rt_sem_release(rt_sem_t sem)
((struct rt_object*)sem)->name, sem->value); ((struct rt_object*)sem)->name, sem->value);
#endif #endif
/* increase value */ if (sem->parent.suspend_thread_count > 0)
sem->value ++;
if (sem->value <= 0 && sem->parent.suspend_thread_count > 0)
{ {
/* resume the suspended thread */ /* resume the suspended thread */
rt_ipc_object_resume(&(sem->parent)); rt_ipc_object_resume(&(sem->parent));
need_schedule = RT_TRUE;
/* enable interrupt */
rt_hw_interrupt_enable(temp);
/* resume a thread, re-schedule */
rt_schedule();
return RT_EOK;
} }
else sem->value ++; /* increase value */
/* enable interrupt */ /* enable interrupt */
rt_hw_interrupt_enable(temp); rt_hw_interrupt_enable(temp);
/* resume a thread, re-schedule */
if (need_schedule == RT_TRUE) rt_schedule();
return RT_EOK; return RT_EOK;
} }
...@@ -647,8 +644,6 @@ rt_err_t rt_mutex_take (rt_mutex_t mutex, rt_int32_t time) ...@@ -647,8 +644,6 @@ rt_err_t rt_mutex_take (rt_mutex_t mutex, rt_int32_t time)
else else
{ {
/* mutex is unavailable, push to suspend list */ /* mutex is unavailable, push to suspend list */
mutex->value --;
#ifdef RT_IPC_DEBUG #ifdef RT_IPC_DEBUG
rt_kprintf("mutex_take: suspend thread: %s\n", thread->name); rt_kprintf("mutex_take: suspend thread: %s\n", thread->name);
#endif #endif
...@@ -691,12 +686,8 @@ rt_err_t rt_mutex_take (rt_mutex_t mutex, rt_int32_t time) ...@@ -691,12 +686,8 @@ rt_err_t rt_mutex_take (rt_mutex_t mutex, rt_int32_t time)
else else
{ {
/* the mutex is taken successfully. */ /* the mutex is taken successfully. */
/* disable interrupt */ /* disable interrupt */
temp = rt_hw_interrupt_disable(); temp = rt_hw_interrupt_disable();
/* set thread error */
thread->error = RT_EOK;
} }
} }
} }
...@@ -724,13 +715,16 @@ rt_err_t rt_mutex_release(rt_mutex_t mutex) ...@@ -724,13 +715,16 @@ rt_err_t rt_mutex_release(rt_mutex_t mutex)
{ {
register rt_base_t temp; register rt_base_t temp;
struct rt_thread* thread; struct rt_thread* thread;
rt_bool_t need_schedule;
/* disable interrupt */ need_schedule = RT_FALSE;
temp = rt_hw_interrupt_disable();
/* get current thread */ /* get current thread */
thread = rt_thread_self(); thread = rt_thread_self();
/* disable interrupt */
temp = rt_hw_interrupt_disable();
#ifdef RT_IPC_DEBUG #ifdef RT_IPC_DEBUG
rt_kprintf("mutex_release:current thread %s, mutex value: %d, hold: %d\n", rt_kprintf("mutex_release:current thread %s, mutex value: %d, hold: %d\n",
thread->name, mutex->value, mutex->hold); thread->name, mutex->value, mutex->hold);
...@@ -753,7 +747,6 @@ rt_err_t rt_mutex_release(rt_mutex_t mutex) ...@@ -753,7 +747,6 @@ rt_err_t rt_mutex_release(rt_mutex_t mutex)
/* decrease hold */ /* decrease hold */
mutex->hold --; mutex->hold --;
/* if no hold */ /* if no hold */
if (mutex->hold == 0) if (mutex->hold == 0)
{ {
...@@ -764,11 +757,8 @@ rt_err_t rt_mutex_release(rt_mutex_t mutex) ...@@ -764,11 +757,8 @@ rt_err_t rt_mutex_release(rt_mutex_t mutex)
&(mutex->owner->init_priority)); &(mutex->owner->init_priority));
} }
/* increase value */
mutex->value ++;
/* wakeup suspended thread */ /* wakeup suspended thread */
if (mutex->value <= 0 && mutex->parent.suspend_thread_count > 0) if (mutex->parent.suspend_thread_count > 0)
{ {
/* get thread entry */ /* get thread entry */
thread = rt_list_entry(mutex->parent.suspend_thread.next, struct rt_thread, tlist); thread = rt_list_entry(mutex->parent.suspend_thread.next, struct rt_thread, tlist);
...@@ -783,24 +773,26 @@ rt_err_t rt_mutex_release(rt_mutex_t mutex) ...@@ -783,24 +773,26 @@ rt_err_t rt_mutex_release(rt_mutex_t mutex)
/* resume thread */ /* resume thread */
rt_ipc_object_resume(&(mutex->parent)); rt_ipc_object_resume(&(mutex->parent));
need_schedule = RT_TRUE;
} }
else else
{ {
/* increase value */
mutex->value ++;
/* clear owner */ /* clear owner */
mutex->owner = RT_NULL; mutex->owner = RT_NULL;
mutex->original_priority = 0; mutex->original_priority = 0;
} }
/* enable interrupt */
rt_hw_interrupt_enable(temp);
rt_schedule();
return RT_EOK;
} }
/* enable interrupt */ /* enable interrupt */
rt_hw_interrupt_enable(temp); rt_hw_interrupt_enable(temp);
/* perform a schedule */
if (need_schedule == RT_TRUE) rt_schedule();
return RT_EOK; return RT_EOK;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册