summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2011-07-31 22:41:17 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2011-07-31 22:41:17 +0000
commit34484311b0151aa8768efed58ac6bdd337597fe8 (patch)
tree208f0857cad61391ca8102a91f882ce05078bb61
parent2011-07-31 Joel Sherrill <joel.sherrilL@OARcorp.com> (diff)
downloadrtems-34484311b0151aa8768efed58ac6bdd337597fe8.tar.bz2
2011-07-31 Joel Sherrill <joel.sherrilL@OARcorp.com>
PR 1855/cpukit * Makefile.am, configure.ac, psx16/Makefile.am: Correct signal processing during pthread_join. We are supposed to unblock the thread waiting on a pthread_join(), dispatch the signal handler, account for it potentially overwriting errno, and then have the thread return to blocking within pthread_join(). * psxeintr_join/.cvsignore, psxeintr_join/Makefile.am, psxeintr_join/init.c, psxeintr_join/psxeintr_join.doc, psxeintr_join/psxeintr_join.scn: New files.
-rw-r--r--testsuites/psxtests/ChangeLog12
-rw-r--r--testsuites/psxtests/Makefile.am6
-rw-r--r--testsuites/psxtests/configure.ac1
-rw-r--r--testsuites/psxtests/psx16/Makefile.am17
-rw-r--r--testsuites/psxtests/psxeintr_join/.cvsignore2
-rw-r--r--testsuites/psxtests/psxeintr_join/Makefile.am28
-rw-r--r--testsuites/psxtests/psxeintr_join/init.c125
-rw-r--r--testsuites/psxtests/psxeintr_join/psxeintr_join.doc24
-rw-r--r--testsuites/psxtests/psxeintr_join/psxeintr_join.scn9
9 files changed, 214 insertions, 10 deletions
diff --git a/testsuites/psxtests/ChangeLog b/testsuites/psxtests/ChangeLog
index f241463258..675adf608c 100644
--- a/testsuites/psxtests/ChangeLog
+++ b/testsuites/psxtests/ChangeLog
@@ -1,5 +1,17 @@
2011-07-31 Joel Sherrill <joel.sherrilL@OARcorp.com>
+ PR 1855/cpukit
+ * Makefile.am, configure.ac, psx16/Makefile.am: Correct signal
+ processing during pthread_join. We are supposed to unblock the thread
+ waiting on a pthread_join(), dispatch the signal handler, account for
+ it potentially overwriting errno, and then have the thread return to
+ blocking within pthread_join().
+ * psxeintr_join/.cvsignore, psxeintr_join/Makefile.am,
+ psxeintr_join/init.c, psxeintr_join/psxeintr_join.doc,
+ psxeintr_join/psxeintr_join.scn: New files.
+
+2011-07-31 Joel Sherrill <joel.sherrilL@OARcorp.com>
+
PR 1867/cpukit
* Makefile.am, configure.ac, psx12/task.c, psxrwlock01/test.c: Correct
implementation of pthread_exit() and pthread_join() to support the
diff --git a/testsuites/psxtests/Makefile.am b/testsuites/psxtests/Makefile.am
index 70d9734663..7da2375421 100644
--- a/testsuites/psxtests/Makefile.am
+++ b/testsuites/psxtests/Makefile.am
@@ -6,9 +6,9 @@ ACLOCAL_AMFLAGS = -I ../aclocal
SUBDIRS = psxhdrs psx01 psx02 psx03 psx04 psx05 psx06 psx07 psx08 psx09 \
psx10 psx11 psx12 psx13 psx14 psx16 psxcleanup psxtime psxtimer01 \
- psxtimer02 psxcancel psxbarrier01 psxmsgq01 psxmsgq02 psxrwlock01
- psxsem01 psxspin01 psxenosys psxsignal01 psxsysconf psxualarm psxkey01 \
- psxfatal01 psxfatal02
+ psxtimer02 psxcancel psxbarrier01 psxmsgq01 psxmsgq02 psxrwlock01 \
+ psxsem01 psxspin01 psxeintr_join psxenosys psxsignal01 psxsysconf \
+ psxualarm psxkey01 psxfatal01 psxfatal02
## File IO tests
SUBDIRS += psxfile01 psxreaddir psxstat psxmount psx13 psxchroot01
diff --git a/testsuites/psxtests/configure.ac b/testsuites/psxtests/configure.ac
index d7f1c7d0d6..8840d9b7ef 100644
--- a/testsuites/psxtests/configure.ac
+++ b/testsuites/psxtests/configure.ac
@@ -46,6 +46,7 @@ psxbarrier01/Makefile
psxcancel/Makefile
psxchroot01/Makefile
psxcleanup/Makefile
+psxeintr_join/Makefile
psxenosys/Makefile
psxfatal01/Makefile
psxfatal02/Makefile
diff --git a/testsuites/psxtests/psx16/Makefile.am b/testsuites/psxtests/psx16/Makefile.am
index 048d896440..3085bdd4ce 100644
--- a/testsuites/psxtests/psx16/Makefile.am
+++ b/testsuites/psxtests/psx16/Makefile.am
@@ -2,24 +2,27 @@
## $Id$
##
-rtems_tests_PROGRAMS = psx16
-psx16_SOURCES = init.c
+MANAGERS = all
+
+rtems_tests_PROGRAMS = psx16.exe
+psx16_exe_SOURCES = init.c
dist_rtems_tests_DATA = psx16.scn
-dist_rtems_tests_DATA += psx16.doc
include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
include $(top_srcdir)/../automake/compile.am
include $(top_srcdir)/../automake/leaf.am
+psx16_exe_LDADD = $(MANAGERS_NOT_WANTED:%=$(PROJECT_LIB)/no-%.rel)
+
AM_CPPFLAGS += -I$(top_srcdir)/include
AM_CPPFLAGS += -I$(top_srcdir)/../support/include
-LINK_OBJS = $(psx16_OBJECTS) $(psx16_LDADD)
-LINK_LIBS = $(psx16_LDLIBS)
+LINK_OBJS = $(psx16_exe_OBJECTS) $(psx16_exe_LDADD)
+LINK_LIBS = $(psx16_exe_LDLIBS)
-psx16$(EXEEXT): $(psx16_OBJECTS) $(psx16_DEPENDENCIES)
- @rm -f psx16$(EXEEXT)
+psx16.exe$(EXEEXT): $(psx16_exe_OBJECTS) $(psx16_exe_DEPENDENCIES)
+ @rm -f psx16.exe$(EXEEXT)
$(make-exe)
include $(top_srcdir)/../automake/local.am
diff --git a/testsuites/psxtests/psxeintr_join/.cvsignore b/testsuites/psxtests/psxeintr_join/.cvsignore
new file mode 100644
index 0000000000..282522db03
--- /dev/null
+++ b/testsuites/psxtests/psxeintr_join/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
diff --git a/testsuites/psxtests/psxeintr_join/Makefile.am b/testsuites/psxtests/psxeintr_join/Makefile.am
new file mode 100644
index 0000000000..6320bd0174
--- /dev/null
+++ b/testsuites/psxtests/psxeintr_join/Makefile.am
@@ -0,0 +1,28 @@
+##
+## $Id$
+##
+
+MANAGERS = all
+
+rtems_tests_PROGRAMS = psxeintr_join.exe
+psxeintr_join_exe_SOURCES = init.c
+
+dist_rtems_tests_DATA = psxeintr_join.scn
+
+include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
+include $(top_srcdir)/../automake/compile.am
+include $(top_srcdir)/../automake/leaf.am
+
+psxeintr_join_exe_LDADD = $(MANAGERS_NOT_WANTED:%=$(PROJECT_LIB)/no-%.rel)
+
+AM_CPPFLAGS += -I$(top_srcdir)/include
+AM_CPPFLAGS += -I$(top_srcdir)/../support/include
+
+LINK_OBJS = $(psxeintr_join_exe_OBJECTS) $(psxeintr_join_exe_LDADD)
+LINK_LIBS = $(psxeintr_join_exe_LDLIBS)
+
+psxeintr_join.exe$(EXEEXT): $(psxeintr_join_exe_OBJECTS) $(psxeintr_join_exe_DEPENDENCIES)
+ @rm -f psxeintr_join.exe$(EXEEXT)
+ $(make-exe)
+
+include $(top_srcdir)/../automake/local.am
diff --git a/testsuites/psxtests/psxeintr_join/init.c b/testsuites/psxtests/psxeintr_join/init.c
new file mode 100644
index 0000000000..9bf3c2a882
--- /dev/null
+++ b/testsuites/psxtests/psxeintr_join/init.c
@@ -0,0 +1,125 @@
+/*
+ * COPYRIGHT (c) 1989-2011.
+ * 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 <stdio.h>
+#include <signal.h>
+#include <semaphore.h>
+#include <pthread.h>
+
+#include <rtems.h>
+#include <tmacros.h>
+#include "test_support.h"
+
+#define SIG_SUSPEND SIGUSR1
+#define SIG_THR_RESTART SIGUSR2
+
+sem_t GC_suspend_ack_sem;
+
+static void print_sig_mask( const char * str )
+{
+ sigset_t blocked;
+ int i;
+ int status;
+
+ status = pthread_sigmask( SIG_BLOCK, NULL, &blocked );
+ rtems_test_assert( status == 0 );
+
+ printf( "%s blocked:\n", str );
+ for ( i = 1; i < NSIG; i++) {
+ if ( sigismember( &blocked, i ) )
+ printf( "%d ", i );
+ }
+ printf( "\n" );
+}
+
+void GC_suspend_handler( int sig )
+{
+ puts( "run in GC_suspend_handler" );
+ sem_post( &GC_suspend_ack_sem );
+}
+
+void GC_restart_handler( int sig )
+{
+ puts( "run in GC_restart_handler" );
+}
+
+void* run( void *arg )
+{
+ int status;
+ pthread_t id = *(pthread_t *)arg;
+
+ print_sig_mask( "New Thread" );
+
+ status = pthread_kill( id, SIG_SUSPEND );
+ rtems_test_assert( status == 0 );
+
+ puts( "New Thread: after pthread_kill" );
+ status = sem_wait( &GC_suspend_ack_sem );
+ rtems_test_assert( status == 0 );
+
+ puts( "New Thread over!" );
+ return NULL;
+}
+
+void *POSIX_Init( void *arg )
+{
+ struct sigaction act;
+ pthread_t newThread;
+ pthread_t mainThread;
+ int status;
+
+ puts( "*** POSIX TEST PSXEINTR_JOIN ***" );
+ status = sem_init( &GC_suspend_ack_sem, 0, 0);
+ rtems_test_assert( status == 0 );
+
+ status = sigemptyset( &act.sa_mask );
+ rtems_test_assert( status == 0 );
+
+ status = sigaddset( &act.sa_mask, SIG_SUSPEND );
+ rtems_test_assert( status == 0 );
+
+ status = pthread_sigmask( SIG_UNBLOCK, &act.sa_mask, NULL );
+ rtems_test_assert( status == 0 );
+
+ act.sa_handler = GC_suspend_handler;
+
+ status = sigaction( SIG_SUSPEND, &act, NULL );
+ rtems_test_assert( status == 0 );
+
+ act.sa_handler = GC_restart_handler;
+
+ print_sig_mask( "Main Thread" );
+
+ mainThread = pthread_self();
+ status = pthread_create( &newThread, NULL, run, &mainThread );
+ rtems_test_assert( status == 0 );
+
+ pthread_join( newThread, NULL );
+ puts( "Back from pthread_join" );
+
+ puts( "*** END OF POSIX TEST PSXEINTR_JOIN ***" );
+ rtems_test_exit( 0 );
+
+ return NULL;
+}
+
+/* configuration information */
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+#define CONFIGURE_MAXIMUM_POSIX_THREADS 2
+#define CONFIGURE_MAXIMUM_POSIX_SEMAPHORES 1
+
+#define CONFIGURE_INIT
+#include <rtems/confdefs.h>
+/* end of file */
+
diff --git a/testsuites/psxtests/psxeintr_join/psxeintr_join.doc b/testsuites/psxtests/psxeintr_join/psxeintr_join.doc
new file mode 100644
index 0000000000..92702eada3
--- /dev/null
+++ b/testsuites/psxtests/psxeintr_join/psxeintr_join.doc
@@ -0,0 +1,24 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-2011.
+# 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.
+#
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: psxeintr_join
+
+directives:
+
+ + pthread_join
+ + pthread_kill
+
+concepts:
+
++ Verify that a signal sent during a blocking pthread_join() call is properly
+ processed.
diff --git a/testsuites/psxtests/psxeintr_join/psxeintr_join.scn b/testsuites/psxtests/psxeintr_join/psxeintr_join.scn
new file mode 100644
index 0000000000..d6e182054e
--- /dev/null
+++ b/testsuites/psxtests/psxeintr_join/psxeintr_join.scn
@@ -0,0 +1,9 @@
+*** POSIX TEST PSXEINTR_JOIN ***
+Main Thread blocked: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 27 28 29 30 31
+New Thread blocked: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 27 28 29 30 31
+New Thread: after pthread_kill
+run in GC_suspend_handler
+New Thread over!
+Back from pthread_join
+*** END OF POSIX TEST PSXEINTR_JOIN ***
+