diff packages/compat/posix/current/tests/signal1.c @ 136:a9ac27ec7abc ecos-sw-2000-11-17

Merge from eCos master repository on 2000-11-17-18:24:25-GMT
author jlarmour
date Fri, 17 Nov 2000 23:16:43 +0000
parents 6ed91473a1cd
children 4c750ce71ae3
line wrap: on
line diff
--- a/packages/compat/posix/current/tests/signal1.c
+++ b/packages/compat/posix/current/tests/signal1.c
@@ -43,6 +43,7 @@
 #include <pthread.h>
 #include <signal.h>
 #include <semaphore.h>
+#include <errno.h>
 
 #include <cyg/infra/testcase.h>
 
@@ -91,10 +92,21 @@ void *pthread_entry1( void *arg)
     sigset_t mask;
     siginfo_t info;
     struct timespec timeout;
-    int sig;
+    int sig, sig2, err;
     
     CYG_TEST_INFO( "Thread 1 running" );
 
+    // Should have inherited parent's signal mask
+    pthread_sigmask( 0, NULL, &mask );
+    CYG_TEST_CHECK( sigismember( &mask, SIGALRM),
+                                 "SIGALRM mask inherited");
+    CYG_TEST_CHECK( sigismember( &mask, SIGUSR1),
+                                 "SIGUSR1 mask inherited");
+    CYG_TEST_CHECK( sigismember( &mask, SIGUSR2),
+                                 "SIGUSR2 mask inherited");
+    CYG_TEST_CHECK( sigismember( &mask, SIGSEGV),
+                                 "SIGSEGV mask inherited");
+
     // Make a full set
     sigfillset( &mask );
 
@@ -115,10 +127,11 @@ void *pthread_entry1( void *arg)
     CYG_TEST_INFO( "Thread1: calling sigtimedwait()");
     
     // Wait for a signal to be delivered
-    sigtimedwait( &mask, &info, &timeout );
+    sig = sigtimedwait( &mask, &info, &timeout );
 
-    sig = info.si_signo;
+    sig2 = info.si_signo;
     
+    CYG_TEST_CHECK( sig == sig2, "sigtimedwait return value not equal");
     CYG_TEST_CHECK( sig == SIGUSR1, "Signal not delivered");
 
     while( sigusr2_called != 2 )
@@ -127,12 +140,31 @@ void *pthread_entry1( void *arg)
         pause();
     }
 
+    errno = 0; // strictly correct to reset errno first
+
     // now wait for SIGALRM to be delivered
     CYG_TEST_INFO( "Thread1: calling pause()");            
-    pause();
+    err = pause();
+    CYG_TEST_CHECK( -1==err, "pause returned -1");
+    CYG_TEST_CHECK( EINTR==errno, "errno set to EINTR");
+
+    // generate another SIGALRM and wait for it to be delivered too
+    // we need to mask it first though
+
+    // Make a full set
+    sigfillset( &mask );
+
+    // Set signal mask
+    pthread_sigmask( SIG_SETMASK, &mask, NULL );
+    
+    alarm(1);
+    CYG_TEST_INFO( "Thread1: calling alarm()");            
+    err = sigwait( &mask, &sig);
+    CYG_TEST_CHECK( 0==err, "sigwait returned -1");
+    CYG_TEST_CHECK( sig==SIGALRM, "sigwait caught alarm");
 
     CYG_TEST_INFO( "Thread1: calling pthread_exit()");    
-    pthread_exit( (void *)((int)arg+sig) );
+    pthread_exit( (void *)((int)arg+sig2) );
 }
 
 //--------------------------------------------------------------------------