From e9e8e3f3cafbbd1287e4226b93b9ad5d40f211e3 Mon Sep 17 00:00:00 2001 From: Grissiom Date: Wed, 18 Dec 2013 20:52:55 +0800 Subject: [PATCH 1/7] TC: do not use rt_sem_trytake to clean the sem There can be a race condition that the sem has alread been detached after we did the cleanup. Besides, there is a RT_IPC_CMD_RESET command in rt_sem_control which is more clear in setting the sem values. --- examples/kernel/tc_comm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/kernel/tc_comm.c b/examples/kernel/tc_comm.c index 60d843171f..bf23d80550 100644 --- a/examples/kernel/tc_comm.c +++ b/examples/kernel/tc_comm.c @@ -40,6 +40,8 @@ void tc_thread_entry(void* parameter) tick = index->func(); if (tick > 0) { + /* Make sure we are going to be blocked. */ + rt_sem_control(&_tc_sem, RT_IPC_CMD_RESET, 0); rt_sem_take(&_tc_sem, tick * _tc_scale); if (_tc_cleanup != RT_NULL) @@ -49,8 +51,6 @@ void tc_thread_entry(void* parameter) _tc_cleanup = RT_NULL; } - rt_sem_trytake(&_tc_sem);/* by nl1031 */ - if (_tc_stat & TC_STAT_FAILED) rt_kprintf("TestCase[%s] failed\n", _tc_current); else From 4434c87a7138f796cefd03a90f7625caaeb08f9a Mon Sep 17 00:00:00 2001 From: Grissiom Date: Wed, 18 Dec 2013 21:36:29 +0800 Subject: [PATCH 2/7] TC: release the sem in cleanup The sem that has been created should be deleted. The sem that has been inited should be detached. --- examples/kernel/semaphore_priority.c | 6 ++++++ examples/kernel/semaphore_producer_consumer.c | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/examples/kernel/semaphore_priority.c b/examples/kernel/semaphore_priority.c index c106a25d5e..2bbeb80389 100644 --- a/examples/kernel/semaphore_priority.c +++ b/examples/kernel/semaphore_priority.c @@ -100,6 +100,12 @@ static void _tc_cleanup() rt_thread_delete(t2); rt_thread_delete(worker); + if (sem) + { + rt_sem_delete(sem); + sem = RT_NULL; + } + if (t1_count > t2_count) tc_done(TC_STAT_FAILED); else diff --git a/examples/kernel/semaphore_producer_consumer.c b/examples/kernel/semaphore_producer_consumer.c index ec0bf2234c..e7c0522223 100644 --- a/examples/kernel/semaphore_producer_consumer.c +++ b/examples/kernel/semaphore_producer_consumer.c @@ -119,6 +119,10 @@ static void _tc_cleanup() /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ rt_enter_critical(); + rt_sem_detach(&sem_lock); + rt_sem_detach(&sem_empty); + rt_sem_detach(&sem_full); + /* 删除线程 */ if (producer_tid != RT_NULL && producer_tid->stat != RT_THREAD_CLOSE) rt_thread_delete(producer_tid); From c6c6b5ef74fa3af437c5a3df7ff16ee4f0f41093 Mon Sep 17 00:00:00 2001 From: Grissiom Date: Wed, 18 Dec 2013 21:39:03 +0800 Subject: [PATCH 3/7] TC: semaphore_dynamic: code cleanup --- examples/kernel/semaphore_dynamic.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/kernel/semaphore_dynamic.c b/examples/kernel/semaphore_dynamic.c index 7f2c2ffd42..579d9daa9a 100644 --- a/examples/kernel/semaphore_dynamic.c +++ b/examples/kernel/semaphore_dynamic.c @@ -90,13 +90,16 @@ static void _tc_cleanup() /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ rt_enter_critical(); + if (sem) + { + rt_sem_delete(sem); + sem = RT_NULL; + } + /* 删除线程 */ if (tid != RT_NULL && tid->stat != RT_THREAD_CLOSE) { rt_thread_delete(tid); - - /* 删除信号量 */ - rt_sem_delete(sem); } /* 调度器解锁 */ From a7c4d07fb7d55f348dba8acf8dff5ca243cd090d Mon Sep 17 00:00:00 2001 From: Grissiom Date: Wed, 18 Dec 2013 22:03:55 +0800 Subject: [PATCH 4/7] TC: heap_realloc: check for realloc(ptr, 0) --- examples/kernel/heap_realloc.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/examples/kernel/heap_realloc.c b/examples/kernel/heap_realloc.c index a4974d5bf3..0f3ec95916 100644 --- a/examples/kernel/heap_realloc.c +++ b/examples/kernel/heap_realloc.c @@ -20,6 +20,7 @@ static rt_bool_t mem_check(rt_uint8_t *ptr, rt_uint8_t value, rt_uint32_t len) static void heap_realloc_init() { + rt_uint8_t res = TC_STAT_PASSED; rt_uint8_t *ptr1, *ptr2, *ptr3, *ptr4, *ptr5; ptr1 = rt_malloc(1); @@ -43,6 +44,11 @@ static void heap_realloc_init() ptr3 = rt_realloc(ptr3, 127); ptr4 = rt_realloc(ptr4, 1); ptr5 = rt_realloc(ptr5, 0); + if (ptr5) + { + rt_kprintf("realloc(ptr, 0) should return NULL\n"); + res = TC_STAT_FAILED; + } if (mem_check(ptr1, 1, 1) != RT_FALSE) goto _failed; if (mem_check(ptr2, 2, 13) != RT_FALSE) goto _failed; @@ -54,15 +60,7 @@ static void heap_realloc_init() rt_free(ptr3); rt_free(ptr1); - if (ptr5 != RT_NULL) - { - rt_free(ptr5); - } - - tc_done(TC_STAT_PASSED); - -_failed: - tc_done(TC_STAT_FAILED); + tc_done(res); } #ifdef RT_USING_TC From b66c5ee0744ecf0c37785f8aa96c3d7c9cc78e89 Mon Sep 17 00:00:00 2001 From: Grissiom Date: Wed, 18 Dec 2013 22:20:10 +0800 Subject: [PATCH 5/7] TC: always print the test result despite the wait time --- examples/kernel/tc_comm.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/kernel/tc_comm.c b/examples/kernel/tc_comm.c index bf23d80550..1a62de6263 100644 --- a/examples/kernel/tc_comm.c +++ b/examples/kernel/tc_comm.c @@ -50,11 +50,6 @@ void tc_thread_entry(void* parameter) _tc_cleanup(); _tc_cleanup = RT_NULL; } - - if (_tc_stat & TC_STAT_FAILED) - rt_kprintf("TestCase[%s] failed\n", _tc_current); - else - rt_kprintf("TestCase[%s] passed\n", _tc_current); } else { @@ -65,6 +60,11 @@ void tc_thread_entry(void* parameter) _tc_cleanup = RT_NULL; } } + + if (_tc_stat & TC_STAT_FAILED) + rt_kprintf("TestCase[%s] failed\n", _tc_current); + else + rt_kprintf("TestCase[%s] passed\n", _tc_current); } } } From 752fe135cd695ef93a630dbd1c361470c95de724 Mon Sep 17 00:00:00 2001 From: Grissiom Date: Wed, 18 Dec 2013 22:21:31 +0800 Subject: [PATCH 6/7] TC: code cleanup --- examples/kernel/tc_comm.c | 35 +++++++++++++---------------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/examples/kernel/tc_comm.c b/examples/kernel/tc_comm.c index 1a62de6263..7804701284 100644 --- a/examples/kernel/tc_comm.c +++ b/examples/kernel/tc_comm.c @@ -37,29 +37,20 @@ void tc_thread_entry(void* parameter) _tc_current = index->name + 4; rt_kprintf("Run TestCase: %s\n", _tc_current); _tc_stat = TC_STAT_PASSED | TC_STAT_RUNNING; - tick = index->func(); - if (tick > 0) - { - /* Make sure we are going to be blocked. */ - rt_sem_control(&_tc_sem, RT_IPC_CMD_RESET, 0); - rt_sem_take(&_tc_sem, tick * _tc_scale); + tick = index->func(); + if (tick > 0) + { + /* Make sure we are going to be blocked. */ + rt_sem_control(&_tc_sem, RT_IPC_CMD_RESET, 0); + rt_sem_take(&_tc_sem, tick * _tc_scale); + } - if (_tc_cleanup != RT_NULL) - { - /* perform testcase cleanup */ - _tc_cleanup(); - _tc_cleanup = RT_NULL; - } - } - else - { - if (_tc_cleanup != RT_NULL) - { - /* perform testcase cleanup */ - _tc_cleanup(); - _tc_cleanup = RT_NULL; - } - } + if (_tc_cleanup != RT_NULL) + { + /* perform testcase cleanup */ + _tc_cleanup(); + _tc_cleanup = RT_NULL; + } if (_tc_stat & TC_STAT_FAILED) rt_kprintf("TestCase[%s] failed\n", _tc_current); From a51b5799f73c7fb6df3d53d540b94fa85fb283c1 Mon Sep 17 00:00:00 2001 From: Grissiom Date: Wed, 18 Dec 2013 23:04:18 +0800 Subject: [PATCH 7/7] TC: fix the heap tests --- examples/kernel/heap_malloc.c | 24 +++++++++++---------- examples/kernel/heap_realloc.c | 39 ++++++++++++++++++++++++++-------- 2 files changed, 43 insertions(+), 20 deletions(-) diff --git a/examples/kernel/heap_malloc.c b/examples/kernel/heap_malloc.c index 0a6b46cc95..558c5403a9 100644 --- a/examples/kernel/heap_malloc.c +++ b/examples/kernel/heap_malloc.c @@ -9,8 +9,8 @@ static rt_bool_t mem_check(rt_uint8_t *ptr, rt_uint8_t value, rt_uint32_t len) { while (len) { - if (*ptr != value) return RT_FALSE; - + if (*ptr != value) + return RT_FALSE; ptr ++; len --; } @@ -20,6 +20,7 @@ static rt_bool_t mem_check(rt_uint8_t *ptr, rt_uint8_t value, rt_uint32_t len) static void heap_malloc_init() { + rt_uint8_t res = TC_STAT_PASSED; rt_uint8_t *ptr1, *ptr2, *ptr3, *ptr4, *ptr5; ptr1 = rt_malloc(1); @@ -33,14 +34,18 @@ static void heap_malloc_init() memset(ptr3, 3, 31); memset(ptr4, 4, 127); - if (mem_check(ptr1, 1, 1) != RT_FALSE) goto _failed; - if (mem_check(ptr2, 2, 13) != RT_FALSE) goto _failed; - if (mem_check(ptr3, 3, 31) != RT_FALSE) goto _failed; - if (mem_check(ptr4, 4, 127) != RT_FALSE) goto _failed; + if (mem_check(ptr1, 1, 1) == RT_FALSE) + res = TC_STAT_FAILED; + if (mem_check(ptr2, 2, 13) == RT_FALSE) + res = TC_STAT_FAILED; + if (mem_check(ptr3, 3, 31) == RT_FALSE) + res = TC_STAT_FAILED; + if (mem_check(ptr4, 4, 127) == RT_FALSE) + res = TC_STAT_FAILED; rt_free(ptr4); rt_free(ptr3); - rt_free(ptr3); + rt_free(ptr2); rt_free(ptr1); if (ptr5 != RT_NULL) @@ -48,10 +53,7 @@ static void heap_malloc_init() rt_free(ptr5); } - tc_done(TC_STAT_PASSED); - -_failed: - tc_done(TC_STAT_FAILED); + tc_done(res); } #ifdef RT_USING_TC diff --git a/examples/kernel/heap_realloc.c b/examples/kernel/heap_realloc.c index 0f3ec95916..c77a60f7d9 100644 --- a/examples/kernel/heap_realloc.c +++ b/examples/kernel/heap_realloc.c @@ -34,10 +34,26 @@ static void heap_realloc_init() memset(ptr3, 3, 31); memset(ptr4, 4, 127); - if (mem_check(ptr1, 1, 1) != RT_FALSE) goto _failed; - if (mem_check(ptr2, 2, 13) != RT_FALSE) goto _failed; - if (mem_check(ptr3, 3, 31) != RT_FALSE) goto _failed; - if (mem_check(ptr4, 4, 127) != RT_FALSE) goto _failed; + if (mem_check(ptr1, 1, 1) == RT_FALSE) + { + res = TC_STAT_FAILED; + goto _free; + } + if (mem_check(ptr2, 2, 13) == RT_FALSE) + { + res = TC_STAT_FAILED; + goto _free; + } + if (mem_check(ptr3, 3, 31) == RT_FALSE) + { + res = TC_STAT_FAILED; + goto _free; + } + if (mem_check(ptr4, 4, 127) == RT_FALSE) + { + res = TC_STAT_FAILED; + goto _free; + } ptr1 = rt_realloc(ptr1, 13); ptr2 = rt_realloc(ptr2, 31); @@ -50,14 +66,19 @@ static void heap_realloc_init() res = TC_STAT_FAILED; } - if (mem_check(ptr1, 1, 1) != RT_FALSE) goto _failed; - if (mem_check(ptr2, 2, 13) != RT_FALSE) goto _failed; - if (mem_check(ptr3, 3, 31) != RT_FALSE) goto _failed; - if (mem_check(ptr4, 4, 1) != RT_FALSE) goto _failed; + if (mem_check(ptr1, 1, 1) == RT_FALSE) + res = TC_STAT_FAILED; + if (mem_check(ptr2, 2, 13) == RT_FALSE) + res = TC_STAT_FAILED; + if (mem_check(ptr3, 3, 31) == RT_FALSE) + res = TC_STAT_FAILED; + if (mem_check(ptr4, 4, 1) == RT_FALSE) + res = TC_STAT_FAILED; +_free: rt_free(ptr4); rt_free(ptr3); - rt_free(ptr3); + rt_free(ptr2); rt_free(ptr1); tc_done(res);