From 64bad68bc811039e246e0565ca7ddfc4ed5a9528 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Thu, 30 Jul 2009 20:21:41 +0000 Subject: 2009-07-30 Joel Sherrill * Makefile.am, configure.ac: Add new test to account for properly handling keys when a thread has non-NULL key value and key has NULL destructor and when a thread has NULL key value and key has destructor. * psxkey03/.cvsignore, psxkey03/Makefile.am, psxkey03/init.c, psxkey03/psxkey03.doc, psxkey03/psxkey03.scn: New files. --- testsuites/psxtests/psxkey03/init.c | 106 ++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 testsuites/psxtests/psxkey03/init.c (limited to 'testsuites/psxtests/psxkey03/init.c') diff --git a/testsuites/psxtests/psxkey03/init.c b/testsuites/psxtests/psxkey03/init.c new file mode 100644 index 0000000000..4de2bb353f --- /dev/null +++ b/testsuites/psxtests/psxkey03/init.c @@ -0,0 +1,106 @@ +/* + * COPYRIGHT (c) 1989-2009. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#include +#include +#include "tmacros.h" +#include "pmacros.h" + +pthread_key_t Key; +volatile bool destructor_ran; + +void destructor(void *value) +{ + destructor_ran = true; +} + +void *Test_Thread( + void *key_value +) +{ + int sc; + + puts( "Test_Thread - pthread_setspecific - OK" ); + sc = pthread_setspecific( Key, key_value ); + assert( !sc ); + + puts( "Test_Thread - pthread_exit to run key destructors - OK" ); + return NULL; +} + +void *POSIX_Init( + void *ignored +) +{ + pthread_t thread; + int sc; + bool sb; + + puts( "\n\n*** TEST KEY 03 ***" ); + + /* + * Key with NULL destructor + */ + puts( "Init - pthread_key_create with NULL destructor - OK" ); + sc = pthread_key_create( &Key, NULL ); + assert( !sc ); + + puts( "Init - pthread_create - OK" ); + sc = pthread_create( &thread, NULL, Test_Thread, &sc ); + assert( !sc ); + + puts( "Init - sleep - let thread run - OK" ); + usleep(500000); + + puts( "Init - pthread_key_delete - OK" ); + sc = pthread_key_delete( Key ); + assert( sc == 0 ); + + /* + * Key with non-NULL destructor + */ + destructor_ran = false; + puts( "Init - pthread_key_create with non-NULL destructor - OK" ); + sc = pthread_key_create( &Key, destructor ); + assert( !sc ); + + puts( "Init - pthread_create - OK" ); + sc = pthread_create( &thread, NULL, Test_Thread, NULL ); + assert( !sc ); + + puts( "Init - sleep - let thread run - OK" ); + usleep(500000); + + puts( "Init - verify destructor did NOT ran" ); + assert( destructor_ran == false ); + + puts( "Init - pthread_key_delete - OK" ); + sc = pthread_key_delete( Key ); + assert( sc == 0 ); + + puts( "*** END OF TEST KEY 03 ***" ); + rtems_test_exit(0); +} + +/* configuration information */ + +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER + +#define CONFIGURE_MAXIMUM_POSIX_THREADS 2 +#define CONFIGURE_MAXIMUM_POSIX_KEYS 1 + +#define CONFIGURE_POSIX_INIT_THREAD_TABLE + +#define CONFIGURE_INIT +#include + +/* global variables */ -- cgit v1.2.3