1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
// $Id$
// ============================================================================
//
// = LIBRARY
// tests
//
// = FILENAME
// Sigset_Ops_Test.cpp
//
// = DESCRIPTION
// This program tests the correctness of following functions.
// sigfillset(), sigemptyset(), sigaddset(), sigdelset(),
// sigismember().
//
// = AUTHOR
// Nanbor Wang
//
// ============================================================================
#include "test_config.h"
#include "ace/OS.h"
void
siglistset(sigset_t x, int *sigset)
{
int empty = 1 ;
int retv = 0 ;
ACE_DEBUG ((LM_DEBUG, "Signal(s) in the set = %08x:\n ", x)) ;
for (int i = 1; i < NSIG; i++) {
if ((retv = ACE_OS::sigismember (&x, i)) > 0) {
ACE_DEBUG ((LM_DEBUG, " %d", i)) ;
empty = 0 ;
}
ACE_ASSERT ((sigset [i] ? retv > 0 : retv <= 0)) ;
}
if (empty) {
ACE_DEBUG ((LM_DEBUG, "Empty!!\n\n")) ;
}
else {
ACE_DEBUG ((LM_DEBUG, "\n\n")) ;
}
}
int
main (int, char *[])
{
ACE_START_TEST ("Sigset_Ops_Test");
#if defined (ACE_LACKS_SIGSET)
ACE_DEBUG ((LM_DEBUG, "%n uses ACE implementation of sigset*() functions.\n\n")) ;
#else
ACE_DEBUG ((LM_DEBUG, "%n uses platform's native sigset*() functions.\n\n")) ;
#endif
sigset_t x ; // examined sigset
int sigset [NSIG] ; // a comparison sigset
int i ;
int status = 0; // 0 is success, else fail code
// Two test signal numbers. I choose these low value signals to
// avoid exceeding the NSIG range.
const int tsig1 = 5 ;
const int tsig2 = 8 ;
// Testing sigfillset
ACE_OS::sigfillset (&x) ;
// fill the comparison set
for (i = 0 ; i < NSIG ; i++) {
sigset [i] = 1 ;
}
siglistset (x, sigset) ;
// testing sigemptyset
ACE_OS::sigemptyset (&x) ;
// empty the comparison set
for (i = 0 ; i < NSIG ; i++) {
sigset [i] = 0 ;
}
siglistset (x, sigset) ;
// add the first signal into set
ACE_OS::sigaddset (&x, tsig1) ;
sigset [tsig1] = 1 ;
siglistset (x, sigset) ;
// add the second signal into set
ACE_OS::sigaddset (&x, tsig2) ;
sigset [tsig2] = 1 ;
siglistset (x, sigset) ;
// then remove it
ACE_OS::sigdelset(&x, tsig1) ;
sigset [tsig1] = 0 ;
siglistset(x, sigset) ;
// remove the second one
ACE_OS::sigdelset(&x, tsig2) ;
sigset [tsig2] = 0 ;
siglistset(x, sigset) ;
// Now testing out of bound signal
if (ACE_OS::sigismember (&x, NSIG) > 0) {
ACE_ERROR((LM_ERROR, "Platform doesn't check for valid signal number.\n"));
status = 1;
}
else if (ACE_OS::last_error() != EINVAL) {
ACE_ERROR((LM_ERROR, "%p.\n", "Expected status EINVAL; got"));
status = 1;
}
/* Skip this test at this moment
// Test if platform can catch invalid sigset error
// Currently, I can only think of passing a NULL ptr
// If you know other situations that fall into this
// catagory, please let me know. Thanks.
ACE_DEBUG ((LM_ERROR, "Now testing invalid sigset. If your platform gets a \nsegmentation fault, then it doesn't check the error properly.\n")) ;
ACE_ASSERT (ACE_OS::sigfillset (NULL) < 0 && ACE_OS::last_error() == EFAULT) ;
*/
ACE_END_TEST;
return status;
}
|