summaryrefslogtreecommitdiff
path: root/rtgui/common/rtgui_system.c
diff options
context:
space:
mode:
authorbernard.xiong <[email protected]>2010-01-13 23:41:15 +0000
committerbernard.xiong <[email protected]>2010-01-13 23:41:15 +0000
commit0ce439673d649eae01fb972be053651296dffc96 (patch)
tree7a82ca03ed489426fda7a497ecb22f9e9a477ec1 /rtgui/common/rtgui_system.c
parenta27f7c67bd51c93dfed233adc371d6f178ff7b73 (diff)
add draw_round_rect, update radiobox widget implementation.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@298 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'rtgui/common/rtgui_system.c')
-rw-r--r--rtgui/common/rtgui_system.c165
1 files changed, 165 insertions, 0 deletions
diff --git a/rtgui/common/rtgui_system.c b/rtgui/common/rtgui_system.c
index 824d298abc..e07ba74e9c 100644
--- a/rtgui/common/rtgui_system.c
+++ b/rtgui/common/rtgui_system.c
@@ -658,3 +658,168 @@ void rtgui_free(void* ptr)
rt_free(ptr);
}
+
+#if 0
+/*
+ * read/write lock implementation
+ */
+struct rtgui_rwlock* rtgui_rwlock_create()
+{
+ struct rtgui_rwlock* rwlock;
+
+ rwlock = rtgui_malloc(sizeof(struct rtgui_rwlock));
+ if (rwlock != RT_NULL)
+ {
+ rwlock->stat = RTGUI_RWLOCK_UNLOCK;
+ rwlock->reader_count = 0;
+
+ rt_sem_init(&(rwlock->rd_lock), "rwr", 0, RT_IPC_FLAG_FIFO);
+ rt_sem_init(&(rwlock->wr_lock), "rww", 0, RT_IPC_FLAG_FIFO);
+ }
+
+ return rwlock;
+}
+
+rt_err_t rtgui_rwlock_delete(struct rtgui_rwlock* rwlock)
+{
+ RT_ASSERT(rwlock != RT_NULL);
+
+ rt_sem_detach(&(rwlock->rd_lock));
+ rt_sem_detach(&(rwlock->wr_lock));
+
+ rtgui_free(rwlock);
+
+ return RT_EOK;
+}
+
+rt_err_t rtgui_rwlock_read_take(struct rtgui_rwlock* rwlock, rt_int32_t timeout)
+{
+ rt_err_t result;
+ rt_ubase_t level;
+
+ RT_ASSERT(rwlock != RT_NULL);
+ level = rt_hw_interrupt_disable();
+ switch (rwlock->stat)
+ {
+ case RTGUI_RWLOCK_UNLOCK:
+ break;
+
+ case RTGUI_RWLOCK_READING:
+ if (rwlock->wr_lock.parent.suspend_thread_count > 0)
+ {
+ /* suspend read thread */
+ result = rt_sem_take(&rwlock->rd_lock, timeout);
+ if (result != RT_EOK)
+ {
+ rt_hw_interrupt_enable(level);
+ return result;
+ }
+ }
+ break;
+
+ case RTGUI_RWLOCK_WRITTING:
+ /* suspend read thread */
+ result = rt_sem_take(&(rwlock->rd_lock), timeout);
+ if (result != RT_EOK)
+ {
+ rt_hw_interrupt_enable(level);
+ return result;
+ }
+ break;
+ }
+
+ /* get rwlock */
+ rwlock->reader_count ++;
+ rwlock->stat = RTGUI_RWLOCK_READING;
+
+ rt_hw_interrupt_enable(level);
+}
+
+rt_err_t rtgui_rwlock_write_take(struct rtgui_rwlock* rwlock, rt_int32_t timeout)
+{
+ rt_err_t result;
+ rt_ubase_t level;
+
+ RT_ASSERT(rwlock != RT_NULL);
+
+ level = rt_hw_interrupt_disable();
+ rwlock->stat = RTGUI_RWLOCK_WRITTING;
+ result = rt_sem_take(&(rwlock->wr_lock), timeout);
+
+ if (result != RT_EOK)
+ {
+ if (rwlock->wr_lock.parent.suspend_thread_count == 0)
+ {
+ if (rwlock->reader_count > 0)
+ rwlock->stat = RTGUI_RWLOCK_READING;
+ }
+ }
+ rt_hw_interrupt_enable(level);
+
+ return result;
+}
+
+rt_err_t rtgui_rwlock_read_release(struct rtgui_rwlock* rwlock)
+{
+ rt_ubase_t level;
+
+ RT_ASSERT(rwlock != RT_NULL);
+
+ level = rt_hw_interrupt_disable();
+ switch (rwlock->stat)
+ {
+ case RTGUI_RWLOCK_UNLOCK:
+ ASSERT(0);
+ break;
+
+ case RTGUI_RWLOCK_READING:
+ rwlock->reader_count --;
+ if (rwlock->reader_count == 0)
+ rwlock->stat = RTGUI_RWLOCK_UNLOCK;
+ break;
+
+ case RTGUI_RWLOCK_WRITTING:
+ rwlock->reader_count --;
+
+ if (rwlock->reader_count == 0)
+ {
+ /* resume write */
+ rt_sem_release(&(rwlock->wr_lock));
+ }
+ break;
+ }
+ rt_hw_interrupt_enable(level);
+}
+
+rt_err_t rtgui_rwlock_write_release(struct rtgui_rwlock* rwlock)
+{
+ rt_err_t result;
+ rt_ubase_t level;
+
+ RT_ASSERT(rwlock != RT_NULL);
+
+ level = rt_hw_interrupt_disable();
+ result = rt_sem_release(&(rwlock->wr_lock));
+
+ if ((result == RT_EOK) && (rwlock->wr_lock.parent.suspend_thread_count == 0))
+ {
+ rt_uint32_t index, reader_thread_count;
+
+ reader_thread_count = rwlock->rd_lock.parent.suspend_thread_count;
+ if (reader_thread_count > 0)
+ {
+ rwlock->stat = RTGUI_RWLOCK_READING;
+
+ /* resume all reader thread */
+ for (index = 0; index < reader_thread_count; index ++)
+ {
+ rt_sem_release(&(rwlock->rd_lock));
+ }
+ }
+ else rwlock->stat = RTGUI_RWLOCK_UNLOCK;
+ }
+ rt_hw_interrupt_enable(level);
+
+ return result;
+}
+#endif