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