From 4f234daac3504dbc5bcd7f88315cf7f5ad0626e7 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 5 Jul 2002 18:07:49 +0000 Subject: 2002-07-05 Joel Sherrill * psxcancel/Makefile.am, psxcancel/init.c, psxcancel/psxcancel.scn: Updated as part of PR164 which reported problems with the RTEMS implementation of pthread_cancel. --- testsuites/psxtests/ChangeLog | 6 ++ testsuites/psxtests/psxcancel/Makefile.am | 2 +- testsuites/psxtests/psxcancel/init.c | 119 +++++++++++++++++++++++++--- testsuites/psxtests/psxcancel/psxcancel.scn | 13 ++- 4 files changed, 128 insertions(+), 12 deletions(-) (limited to 'testsuites/psxtests') diff --git a/testsuites/psxtests/ChangeLog b/testsuites/psxtests/ChangeLog index ba856c1ea7..22d93e57ec 100644 --- a/testsuites/psxtests/ChangeLog +++ b/testsuites/psxtests/ChangeLog @@ -1,3 +1,9 @@ +2002-07-05 Joel Sherrill + + * psxcancel/Makefile.am, psxcancel/init.c, psxcancel/psxcancel.scn: + Updated as part of PR164 which reported problems with the RTEMS + implementation of pthread_cancel. + 2001-04-26 Joel Sherrill * psxmsgq01/init.c: Reflect changes made to address PR81 that diff --git a/testsuites/psxtests/psxcancel/Makefile.am b/testsuites/psxtests/psxcancel/Makefile.am index 054c6e6d6c..0991f3409e 100644 --- a/testsuites/psxtests/psxcancel/Makefile.am +++ b/testsuites/psxtests/psxcancel/Makefile.am @@ -10,7 +10,7 @@ MANAGERS = all C_FILES = init.c C_O_FILES = $(C_FILES:%.c=${ARCH}/%.o) -H_FILES = system.h +H_FILES = noinst_HEADERS = $(H_FILES) DOCTYPES = scn diff --git a/testsuites/psxtests/psxcancel/init.c b/testsuites/psxtests/psxcancel/init.c index 26536dad95..ada11bdd8d 100644 --- a/testsuites/psxtests/psxcancel/init.c +++ b/testsuites/psxtests/psxcancel/init.c @@ -1,6 +1,9 @@ -/* - * COPYRIGHT (c) 1989-1999. - * On-Line Applications Research Corporation (OAR). +/* + * Thread Test Program + * + * - test of POSIX's pthread_init() function from rtemstask Init() + * + * ott@linux.thai.net * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at @@ -9,19 +12,115 @@ * $Id$ */ + +#include +#include +#include +#include + +#ifdef __rtems__ +#include +/* configuration information */ + #define CONFIGURE_INIT -#include "system.h" + +#include +#include #include -void *POSIX_Init( - void *argument -) -{ +#include /* for device driver prototypes */ + +rtems_task Init( rtems_task_argument argument); + +/* configuration information */ + +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER + +#define CONFIGURE_MAXIMUM_TASKS 3 +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE +#define CONFIGURE_EXTRA_TASK_STACKS (3 * RTEMS_MINIMUM_STACK_SIZE) + +#define CONFIGURE_MAXIMUM_POSIX_THREADS 5 +#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 5 +#define CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES 5 + +#include +#include + +#endif /* __rtems__ */ + +void countTaskDeferred() { + int i=0; + int type,state; + + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &type); + pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &state); + while (1) { + printf("countTaskDeferred: elapsed time (second): %2d\n", i++ ); + sleep(1); + pthread_testcancel(); + } +} + +void countTaskAsync() { + int i=0; + int type,state; + + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &type); + pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &state); + while (1) { + printf("countTaskAsync: elapsed time (second): %2d\n", i++ ); + sleep(1); + } +} + +#ifdef __linux__ +int main(){ +#else + rtems_task Init( rtems_task_argument ignored ) { +#endif + + pthread_t count; + int taskparameter = 0; puts( "\n\n*** POSIX CANCEL TEST ***" ); + /* Start countTask deferred */ + { + int task_ret; + task_ret = pthread_create(&count, NULL, (void *) countTaskDeferred, (void *) &taskparameter); + if (task_ret) { + perror("pthread_create: countTask"); + exit(EXIT_FAILURE); + } + /* sleep for 5 seconds, then cancel it */ + sleep(5); + pthread_cancel(count); + pthread_join(count,NULL); + } + + /* Start countTask asynchronous */ + { + int task_ret; + task_ret = pthread_create(&count, NULL, (void *) countTaskAsync, (void *) &taskparameter); + if (task_ret) { + perror("pthread_create: countTask"); + exit(EXIT_FAILURE); + } + /* sleep for 5 seconds, then cancel it */ + sleep(5); + pthread_cancel(count); + pthread_join(count,NULL); + } + + puts( "*** END OF POSIX CANCEL TEST ***" ); - exit( 0 ); - return NULL; /* just so the compiler thinks we returned something */ +#ifdef __linux__ + return 0; +#else + exit(EXIT_SUCCESS); +#endif } + diff --git a/testsuites/psxtests/psxcancel/psxcancel.scn b/testsuites/psxtests/psxcancel/psxcancel.scn index f6ef3ac9d3..bb5c7d58e0 100644 --- a/testsuites/psxtests/psxcancel/psxcancel.scn +++ b/testsuites/psxtests/psxcancel/psxcancel.scn @@ -1,3 +1,14 @@ -*** POSIX CANCEL TEST *** + +*** POSIX CANCEL TEST *** +countTaskDeferred: elapsed time (second): 0 +countTaskDeferred: elapsed time (second): 1 +countTaskDeferred: elapsed time (second): 2 +countTaskDeferred: elapsed time (second): 3 +countTaskDeferred: elapsed time (second): 4 +countTaskAsync: elapsed time (second): 0 +countTaskAsync: elapsed time (second): 1 +countTaskAsync: elapsed time (second): 2 +countTaskAsync: elapsed time (second): 3 +countTaskAsync: elapsed time (second): 4 *** END OF POSIX CANCEL TEST *** -- cgit v1.2.3