1 // Copyright (C) 2012-2018 Hartmut Kaiser
2 //
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6 #include <hpx/hpx_main.hpp>
7 #include <hpx/include/actions.hpp>
8 #include <hpx/include/runtime.hpp>
9 #include <hpx/runtime/threads/thread_data.hpp>
10 #include <hpx/util/lightweight_test.hpp>
11
12 #include <cstring>
13 #include <vector>
14
15 ///////////////////////////////////////////////////////////////////////////////
test_small_stacksize()16 void test_small_stacksize()
17 {
18 // allocate HPX_SMALL_STACK_SIZE - HPX_THREADS_STACK_OVERHEAD memory on
19 // the stack
20 char array[HPX_SMALL_STACK_SIZE-HPX_THREADS_STACK_OVERHEAD];
21
22 // do something to that array
23 std::memset(array, '\0', sizeof(array));
24
25 HPX_TEST(hpx::threads::get_self_ptr());
26
27 // verify that sufficient stack has been allocated
28 HPX_TEST(hpx::threads::get_ctx_ptr()->get_stacksize() >=
29 hpx::get_runtime().get_config().get_stack_size(
30 hpx::threads::thread_stacksize_small));
31 }
HPX_DECLARE_ACTION(test_small_stacksize,test_small_stacksize_action)32 HPX_DECLARE_ACTION(test_small_stacksize, test_small_stacksize_action)
33 HPX_ACTION_USES_SMALL_STACK(test_small_stacksize_action)
34 HPX_PLAIN_ACTION(test_small_stacksize, test_small_stacksize_action)
35
36 ///////////////////////////////////////////////////////////////////////////////
37 void test_medium_stacksize()
38 {
39 // allocate HPX_MEDIUM_STACK_SIZE - HPX_THREADS_STACK_OVERHEAD memory on
40 // the stack
41 char array[HPX_MEDIUM_STACK_SIZE-HPX_THREADS_STACK_OVERHEAD];
42 // do something to that array
43 std::memset(array, '\0', sizeof(array));
44
45 HPX_TEST(hpx::threads::get_self_ptr());
46
47 // verify that sufficient stack has been allocated
48 HPX_TEST(hpx::threads::get_ctx_ptr()->get_stacksize() >=
49 hpx::get_runtime().get_config().get_stack_size(
50 hpx::threads::thread_stacksize_medium));
51 }
HPX_DECLARE_ACTION(test_medium_stacksize,test_medium_stacksize_action)52 HPX_DECLARE_ACTION(test_medium_stacksize, test_medium_stacksize_action)
53 HPX_ACTION_USES_MEDIUM_STACK(test_medium_stacksize_action)
54 HPX_PLAIN_ACTION(test_medium_stacksize, test_medium_stacksize_action)
55
56 ///////////////////////////////////////////////////////////////////////////////
57 void test_large_stacksize()
58 {
59 // allocate HPX_LARGE_STACK_SIZE - HPX_THREADS_STACK_OVERHEAD memory on
60 // the stack
61 char array[HPX_LARGE_STACK_SIZE-HPX_THREADS_STACK_OVERHEAD];
62 // do something to that array
63 std::memset(array, '\0', sizeof(array));
64
65 HPX_TEST(hpx::threads::get_self_ptr());
66
67 // verify that sufficient stack has been allocated
68 HPX_TEST(hpx::threads::get_ctx_ptr()->get_stacksize() >=
69 hpx::get_runtime().get_config().get_stack_size(
70 hpx::threads::thread_stacksize_large));
71 }
HPX_DECLARE_ACTION(test_large_stacksize,test_large_stacksize_action)72 HPX_DECLARE_ACTION(test_large_stacksize, test_large_stacksize_action)
73 HPX_ACTION_USES_LARGE_STACK(test_large_stacksize_action)
74 HPX_PLAIN_ACTION(test_large_stacksize, test_large_stacksize_action)
75
76 ///////////////////////////////////////////////////////////////////////////////
77 void test_huge_stacksize()
78 {
79 // allocate HPX_LARGE_STACK_SIZE - HPX_THREADS_STACK_OVERHEAD memory on
80 // the stack
81 char array[HPX_HUGE_STACK_SIZE-HPX_THREADS_STACK_OVERHEAD];
82
83 // do something to that array
84 std::memset(array, '\0', sizeof(array));
85
86 HPX_TEST(hpx::threads::get_self_ptr());
87
88 // verify that sufficient stack has been allocated
89 HPX_TEST(hpx::threads::get_ctx_ptr()->get_stacksize() >=
90 hpx::get_runtime().get_config().get_stack_size(
91 hpx::threads::thread_stacksize_huge));
92 }
HPX_DECLARE_ACTION(test_huge_stacksize,test_huge_stacksize_action)93 HPX_DECLARE_ACTION(test_huge_stacksize, test_huge_stacksize_action)
94 HPX_ACTION_USES_HUGE_STACK(test_huge_stacksize_action)
95 HPX_PLAIN_ACTION(test_huge_stacksize, test_huge_stacksize_action)
96
97 ///////////////////////////////////////////////////////////////////////////////
98 int main()
99 {
100 std::vector<hpx::id_type> localities = hpx::find_all_localities();
101
102 for (hpx::id_type const& id : localities)
103 {
104 {
105 test_small_stacksize_action test_action;
106 test_action(id);
107 }
108
109 {
110 test_medium_stacksize_action test_action;
111 test_action(id);
112 }
113
114 {
115 test_large_stacksize_action test_action;
116 test_action(id);
117 }
118
119 {
120 test_huge_stacksize_action test_action;
121 test_action(id);
122 }
123 }
124
125 return hpx::util::report_errors();
126 }
127
128