45# ifndef _RWSTD_REENTRANT
49# define MAX_THREADS 32
65static void handle_alarm (
int)
74static const char what_buf [] = {
75 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
76 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
77 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
78 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
79 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
80 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
81 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
82 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
83 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
84 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
85 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
86 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
87 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
88 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
89 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
90 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
91 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
92 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
93 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
94 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
95 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
96 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
97 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
98 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
99 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
100 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
101 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
102 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
125 :
std::invalid_argument (
str) { }
130throw_exception (
unsigned which,
const char *what)
156 std::printf (
"thread procedure %ld starting...\n", tid->
threadno);
163 const std::size_t what_len = std::size_t (
i % 1024);
165 const char*
const what = what_buf +
sizeof what_buf - what_len - 1;
167 const unsigned thrown =
i % 11;
169 unsigned caught = _RWSTD_UINT_MAX;
175 throw_exception (thrown, what);
185 catch (std::domain_error ex) {
189 catch (std::invalid_argument ex) {
193 catch (std::length_error ex) {
197 catch (std::out_of_range ex) {
201 catch (std::range_error ex) {
205 catch (std::overflow_error ex) {
209 catch (std::underflow_error ex) {
213 catch (std::logic_error ex) {
217 catch (std::runtime_error ex) {
236test_multi (
unsigned i,
unsigned nactive)
238 const std::size_t what_len = (
i + nactive) %
sizeof what_buf;
240 const char*
const what = what_buf +
sizeof what_buf - what_len - 1;
242 const unsigned thrown = (
i + nactive) % 10 + 1;
247 throw_exception (thrown, what);
254 test_multi (
i, nactive - 1);
267 std::printf (
"thread procedure %ld starting...\n", tid->
threadno);
275 test_multi (
i,
i % 4);
291 const unsigned nsec = 3 < max_sec ? max_sec / 2 : 0;
294 "single active exception per thread"
295 "%{?}; timeout in %u seconds%{;}",
296 0 != max_sec, nsec ? nsec : max_sec);
309 0, __LINE__,
"rw_thread_pool() failed");
320 "multiple active exceptions per thread"
321 "%{?}; timeout in %u seconds%{;}",
322 0 != max_sec, nsec ? nsec : max_sec);
333 0, __LINE__,
"rw_thread_pool() failed");
352int main (
int argc,
char *argv[])
354 return rw_test (argc, argv, __FILE__,
355 "lib.std.exceptions",
volatile int alarm_expired
void * test_multi_exceptions(void *arg)
void * test_single_exception(void *arg)
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
#define _RWSTD_ASSERT(ignore)
_TEST_EXPORT rw_signal_handler_t *const rw_sig_hold
_TEST_EXPORT unsigned rw_alarm(unsigned int, rw_signal_handler_t *=0)
_TEST_EXPORT rw_signal_handler_t *const rw_sig_restore
_TEST_EXPORT int rw_test(int argc, char *argv[], const char *filename, const char *clause, const char *comment, int(*testfun)(int, char **), const char *optspec,...)
_TEST_EXPORT int rw_info(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_fatal(int expr, const char *filename, int line, const char *fmtspec,...)
_TEST_EXPORT int rw_thread_pool(rw_thread_t *, _RWSTD_SIZE_T, rw_thread_attr_t *, rw_thread_proc *, void **, _RWSTD_SIZE_T=0)
_TEST_EXPORT int rw_strncmp(const char *, const char *, _RWSTD_SIZE_T=_RWSTD_SIZE_MAX, int=CMP_NULTERM)
DerivedException(const char *str)