1*d5bc748eSskrll# $NetBSD: t_call_once2.sh,v 1.8 2022/09/29 07:22:49 skrll Exp $ 277dc83faSkamil# 377dc83faSkamil# Copyright (c) 2018 The NetBSD Foundation, Inc. 477dc83faSkamil# All rights reserved. 577dc83faSkamil# 677dc83faSkamil# Redistribution and use in source and binary forms, with or without 777dc83faSkamil# modification, are permitted provided that the following conditions 877dc83faSkamil# are met: 977dc83faSkamil# 1. Redistributions of source code must retain the above copyright 1077dc83faSkamil# notice, this list of conditions and the following disclaimer. 1177dc83faSkamil# 2. Redistributions in binary form must reproduce the above copyright 1277dc83faSkamil# notice, this list of conditions and the following disclaimer in the 1377dc83faSkamil# documentation and/or other materials provided with the distribution. 1477dc83faSkamil# 1577dc83faSkamil# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 1677dc83faSkamil# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 1777dc83faSkamil# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1877dc83faSkamil# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 1977dc83faSkamil# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2077dc83faSkamil# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2177dc83faSkamil# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2277dc83faSkamil# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2377dc83faSkamil# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2477dc83faSkamil# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2577dc83faSkamil# POSSIBILITY OF SUCH DAMAGE. 2677dc83faSkamil# 2777dc83faSkamil 2877dc83faSkamilatf_test_case call_once2 2977dc83faSkamilcall_once2_head() { 3077dc83faSkamil atf_set "descr" "compile and run std::call_once" 3177dc83faSkamil atf_set "require.progs" "c++" 32b73d7fb6Srin atf_set "timeout" "600" 3377dc83faSkamil} 3477dc83faSkamil 3577dc83faSkamilatf_test_case call_once2_profile 3677dc83faSkamilcall_once2_profile_head() { 3777dc83faSkamil atf_set "descr" "compile and run std::call_once with profiling option" 3877dc83faSkamil atf_set "require.progs" "c++" 39b73d7fb6Srin atf_set "timeout" "600" 4077dc83faSkamil} 4177dc83faSkamil 4277dc83faSkamilatf_test_case call_once2_pic 4377dc83faSkamilcall_once2_pic_head() { 4477dc83faSkamil atf_set "descr" "compile and run PIC std::call_once" 4577dc83faSkamil atf_set "require.progs" "c++" 46b73d7fb6Srin atf_set "timeout" "600" 4777dc83faSkamil} 4877dc83faSkamil 4977dc83faSkamilatf_test_case call_once2_pic_32 5077dc83faSkamilcall_once2_pic_32_head() { 5177dc83faSkamil atf_set "descr" "compile and run 32-bit PIC std::call_once" 5277dc83faSkamil atf_set "require.progs" "c++" 53b73d7fb6Srin atf_set "timeout" "600" 5477dc83faSkamil} 5577dc83faSkamil 5677dc83faSkamilatf_test_case call_once2_pic_profile 577a28717eSrincall_once2_pic_profile_head() { 5877dc83faSkamil atf_set "descr" "compile and run PIC std::call_once with profiling flag" 5977dc83faSkamil atf_set "require.progs" "c++" 60b73d7fb6Srin atf_set "timeout" "600" 6177dc83faSkamil} 6277dc83faSkamil 6377dc83faSkamilatf_test_case call_once2_pic_profile_32 6477dc83faSkamilcall_once2_pic_profile_32_head() { 6577dc83faSkamil atf_set "descr" "compile and run 32-bit PIC std::call_once with profiling flag" 6677dc83faSkamil atf_set "require.progs" "c++" 67b73d7fb6Srin atf_set "timeout" "600" 6877dc83faSkamil} 6977dc83faSkamil 7077dc83faSkamilatf_test_case call_once2_profile_32 7177dc83faSkamilcall_once2_profile_32_head() { 7277dc83faSkamil atf_set "descr" "compile and run 32-bit std::call_once with profiling flag" 7377dc83faSkamil atf_set "require.progs" "c++" 74b73d7fb6Srin atf_set "timeout" "600" 7577dc83faSkamil} 7677dc83faSkamil 7777dc83faSkamilatf_test_case call_once2_pie 7877dc83faSkamilcall_once2_pie_head() { 7977dc83faSkamil atf_set "descr" "compile and run position independent (PIE) std::call_once" 8077dc83faSkamil atf_set "require.progs" "c++" 81b73d7fb6Srin atf_set "timeout" "600" 8277dc83faSkamil} 8377dc83faSkamil 8477dc83faSkamilatf_test_case call_once2_32 8577dc83faSkamilcall_once2_32_head() { 8677dc83faSkamil atf_set "descr" "compile and run std::call_once for/in netbsd32 emulation" 8777dc83faSkamil atf_set "require.progs" "c++ file diff cat" 88b73d7fb6Srin atf_set "timeout" "600" 8977dc83faSkamil} 9077dc83faSkamil 9177dc83faSkamilatf_test_case call_once2_static 9277dc83faSkamilcall_once2_static_head() { 9377dc83faSkamil atf_set "descr" "compile and run std::call_once with static flag" 9477dc83faSkamil atf_set "require.progs" "c++" 95b73d7fb6Srin atf_set "timeout" "600" 9677dc83faSkamil} 9777dc83faSkamil 9877dc83faSkamilcall_once2_body() { 9977dc83faSkamil cat > test.cpp << EOF 10077dc83faSkamil#include <mutex> 10177dc83faSkamil#include <thread> 10277dc83faSkamil#include <iostream> 10377dc83faSkamilstd::once_flag flag, flag_throw; 10477dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); } 10577dc83faSkamilvoid throw_once(void) { throw std::exception(); } 10677dc83faSkamilint main(void) { 10777dc83faSkamil static const int nr_threads(4); 10877dc83faSkamil std::thread threads[nr_threads]; 10977dc83faSkamil 11077dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 11177dc83faSkamil threads[i] = std::thread(print_once); 11277dc83faSkamil } 11377dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 11477dc83faSkamil threads[i].join(); 11577dc83faSkamil } 11677dc83faSkamil 11777dc83faSkamil try { 11877dc83faSkamil std::call_once(flag_throw, throw_once); 11977dc83faSkamil } catch (...) { 12077dc83faSkamil std::cout << "world!" << std::endl; 12177dc83faSkamil } 12277dc83faSkamil return 0; 12377dc83faSkamil} 12477dc83faSkamilEOF 12577dc83faSkamil atf_check -s exit:0 -o ignore -e ignore c++ -o call_once2 test.cpp -pthread 12677dc83faSkamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2 12777dc83faSkamil} 12877dc83faSkamil 12977dc83faSkamilcall_once2_profile_body() { 130af540225Schristos atf_expect_fail "profiling option doesn't work with shared libraries" 13177dc83faSkamil cat > test.cpp << EOF 13277dc83faSkamil#include <mutex> 13377dc83faSkamil#include <thread> 13477dc83faSkamil#include <iostream> 13577dc83faSkamilstd::once_flag flag, flag_throw; 13677dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); } 13777dc83faSkamilvoid throw_once(void) { throw std::exception(); } 13877dc83faSkamilint main(void) { 13977dc83faSkamil static const int nr_threads(4); 14077dc83faSkamil std::thread threads[nr_threads]; 14177dc83faSkamil 14277dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 14377dc83faSkamil threads[i] = std::thread(print_once); 14477dc83faSkamil } 14577dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 14677dc83faSkamil threads[i].join(); 14777dc83faSkamil } 14877dc83faSkamil 14977dc83faSkamil try { 15077dc83faSkamil std::call_once(flag_throw, throw_once); 15177dc83faSkamil } catch (...) { 15277dc83faSkamil std::cout << "world!" << std::endl; 15377dc83faSkamil } 15477dc83faSkamil return 0; 15577dc83faSkamil} 15677dc83faSkamilEOF 157*d5bc748eSskrll atf_check -s exit:0 -o ignore -e ignore c++ -pg -o call_once2 test.cpp -pthread 15877dc83faSkamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2 15977dc83faSkamil} 16077dc83faSkamil 16177dc83faSkamilcall_once2_profile_32_body() { 16277dc83faSkamil atf_expect_fail "profiling option doesn't work now" 16377dc83faSkamil # check whether this arch is 64bit 16477dc83faSkamil if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 16577dc83faSkamil atf_skip "this is not a 64 bit architecture" 16677dc83faSkamil fi 16777dc83faSkamil if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 16877dc83faSkamil atf_skip "c++ -m32 not supported on this architecture" 16977dc83faSkamil else 17077dc83faSkamil if fgrep -q _LP64 ./def32; then 17177dc83faSkamil atf_fail "c++ -m32 does not generate netbsd32 binaries" 17277dc83faSkamil fi 17377dc83faSkamil fi 17477dc83faSkamil 17577dc83faSkamil cat > test.cpp << EOF 17677dc83faSkamil#include <mutex> 17777dc83faSkamil#include <thread> 17877dc83faSkamil#include <iostream> 17977dc83faSkamilstd::once_flag flag, flag_throw; 18077dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); } 18177dc83faSkamilvoid throw_once(void) { throw std::exception(); } 18277dc83faSkamilint main(void) { 18377dc83faSkamil static const int nr_threads(4); 18477dc83faSkamil std::thread threads[nr_threads]; 18577dc83faSkamil 18677dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 18777dc83faSkamil threads[i] = std::thread(print_once); 18877dc83faSkamil } 18977dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 19077dc83faSkamil threads[i].join(); 19177dc83faSkamil } 19277dc83faSkamil 19377dc83faSkamil try { 19477dc83faSkamil std::call_once(flag_throw, throw_once); 19577dc83faSkamil } catch (...) { 19677dc83faSkamil std::cout << "world!" << std::endl; 19777dc83faSkamil } 19877dc83faSkamil return 0; 19977dc83faSkamil} 20077dc83faSkamilEOF 201*d5bc748eSskrll atf_check -s exit:0 -o ignore -e ignore c++ -m32 -pg -o call_once2 test.cpp -pthread 20277dc83faSkamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2 20377dc83faSkamil atf_expect_fail "The combination of 32-bit and profiling should be fail" 20477dc83faSkamil} 20577dc83faSkamil 20677dc83faSkamilcall_once2_pic_body() { 20777dc83faSkamil cat > test.cpp << EOF 20877dc83faSkamil#include <stdlib.h> 20977dc83faSkamilint callpic(void); 21077dc83faSkamilint main(void) {callpic();exit(0);} 21177dc83faSkamilEOF 21277dc83faSkamil cat > pic.cpp << EOF 21377dc83faSkamil#include <mutex> 21477dc83faSkamil#include <thread> 21577dc83faSkamil#include <iostream> 21677dc83faSkamilstd::once_flag flag, flag_throw; 21777dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); } 21877dc83faSkamilvoid throw_once(void) { throw std::exception(); } 21977dc83faSkamilint callpic(void) { 22077dc83faSkamil static const int nr_threads(4); 22177dc83faSkamil std::thread threads[nr_threads]; 22277dc83faSkamil 22377dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 22477dc83faSkamil threads[i] = std::thread(print_once); 22577dc83faSkamil } 22677dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 22777dc83faSkamil threads[i].join(); 22877dc83faSkamil } 22977dc83faSkamil 23077dc83faSkamil try { 23177dc83faSkamil std::call_once(flag_throw, throw_once); 23277dc83faSkamil } catch (...) { 23377dc83faSkamil std::cout << "world!" << std::endl; 23477dc83faSkamil } 23577dc83faSkamil return 0; 23677dc83faSkamil} 23777dc83faSkamilEOF 23877dc83faSkamil 23977dc83faSkamil atf_check -s exit:0 -o ignore -e ignore \ 24077dc83faSkamil c++ -fPIC -shared -o libtest.so pic.cpp 24177dc83faSkamil atf_check -s exit:0 -o ignore -e ignore \ 24277dc83faSkamil c++ -o call_once2 test.cpp -L. -ltest -pthread 24377dc83faSkamil 24477dc83faSkamil export LD_LIBRARY_PATH=. 24577dc83faSkamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2 24677dc83faSkamil} 24777dc83faSkamil 24877dc83faSkamilcall_once2_pic_32_body() { 24977dc83faSkamil # check whether this arch is 64bit 25077dc83faSkamil if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 25177dc83faSkamil atf_skip "this is not a 64 bit architecture" 25277dc83faSkamil fi 25377dc83faSkamil if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 25477dc83faSkamil atf_skip "c++ -m32 not supported on this architecture" 25577dc83faSkamil else 25677dc83faSkamil if fgrep -q _LP64 ./def32; then 25777dc83faSkamil atf_fail "c++ -m32 does not generate netbsd32 binaries" 25877dc83faSkamil fi 25977dc83faSkamil fi 26077dc83faSkamil 26177dc83faSkamil cat > test.cpp << EOF 26277dc83faSkamil#include <stdlib.h> 26377dc83faSkamilint callpic(void); 26477dc83faSkamilint main(void) {callpic();exit(0);} 26577dc83faSkamilEOF 26677dc83faSkamil cat > pic.cpp << EOF 26777dc83faSkamil#include <mutex> 26877dc83faSkamil#include <thread> 26977dc83faSkamil#include <iostream> 27077dc83faSkamilstd::once_flag flag, flag_throw; 27177dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); } 27277dc83faSkamilvoid throw_once(void) { throw std::exception(); } 27377dc83faSkamilint callpic(void) { 27477dc83faSkamil static const int nr_threads(4); 27577dc83faSkamil std::thread threads[nr_threads]; 27677dc83faSkamil 27777dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 27877dc83faSkamil threads[i] = std::thread(print_once); 27977dc83faSkamil } 28077dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 28177dc83faSkamil threads[i].join(); 28277dc83faSkamil } 28377dc83faSkamil 28477dc83faSkamil try { 28577dc83faSkamil std::call_once(flag_throw, throw_once); 28677dc83faSkamil } catch (...) { 28777dc83faSkamil std::cout << "world!" << std::endl; 28877dc83faSkamil } 28977dc83faSkamil return 0; 29077dc83faSkamil} 29177dc83faSkamilEOF 29277dc83faSkamil 29377dc83faSkamil atf_check -s exit:0 -o ignore -e ignore \ 29477dc83faSkamil c++ -m32 -fPIC -shared -o libtest.so pic.cpp 29577dc83faSkamil atf_check -s exit:0 -o ignore -e ignore \ 29677dc83faSkamil c++ -m32 -o call_once2 test.cpp -L. -ltest -pthread 29777dc83faSkamil 29877dc83faSkamil export LD_LIBRARY_PATH=. 29977dc83faSkamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2 30077dc83faSkamil} 30177dc83faSkamil 30277dc83faSkamilcall_once2_pic_profile_body() { 303af540225Schristos atf_expect_fail "profiling option doesn't work with pic" 30477dc83faSkamil cat > test.cpp << EOF 30577dc83faSkamil#include <stdlib.h> 30677dc83faSkamilint callpic(void); 30777dc83faSkamilint main(void) {callpic();exit(0);} 30877dc83faSkamilEOF 30977dc83faSkamil cat > pic.cpp << EOF 31077dc83faSkamil#include <mutex> 31177dc83faSkamil#include <thread> 31277dc83faSkamil#include <iostream> 31377dc83faSkamilstd::once_flag flag, flag_throw; 31477dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); } 31577dc83faSkamilvoid throw_once(void) { throw std::exception(); } 31677dc83faSkamilint callpic(void) { 31777dc83faSkamil static const int nr_threads(4); 31877dc83faSkamil std::thread threads[nr_threads]; 31977dc83faSkamil 32077dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 32177dc83faSkamil threads[i] = std::thread(print_once); 32277dc83faSkamil } 32377dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 32477dc83faSkamil threads[i].join(); 32577dc83faSkamil } 32677dc83faSkamil 32777dc83faSkamil try { 32877dc83faSkamil std::call_once(flag_throw, throw_once); 32977dc83faSkamil } catch (...) { 33077dc83faSkamil std::cout << "world!" << std::endl; 33177dc83faSkamil } 33277dc83faSkamil return 0; 33377dc83faSkamil} 33477dc83faSkamilEOF 33577dc83faSkamil 33677dc83faSkamil atf_check -s exit:0 -o ignore -e ignore \ 33777dc83faSkamil c++ -pg -fPIC -shared -o libtest.so pic.cpp 33877dc83faSkamil atf_check -s exit:0 -o ignore -e ignore \ 33977dc83faSkamil c++ -pg -o call_once2 test.cpp -L. -ltest -pthread 34077dc83faSkamil 34177dc83faSkamil export LD_LIBRARY_PATH=. 34277dc83faSkamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2 34377dc83faSkamil} 34477dc83faSkamil 34577dc83faSkamilcall_once2_pic_profile_32_body() { 346af540225Schristos atf_expect_fail "profiling option doesn't work with shared libraries" 34777dc83faSkamil # check whether this arch is 64bit 34877dc83faSkamil if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 34977dc83faSkamil atf_skip "this is not a 64 bit architecture" 35077dc83faSkamil fi 35177dc83faSkamil if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 35277dc83faSkamil atf_skip "c++ -m32 not supported on this architecture" 35377dc83faSkamil else 35477dc83faSkamil if fgrep -q _LP64 ./def32; then 35577dc83faSkamil atf_fail "c++ -m32 does not generate netbsd32 binaries" 35677dc83faSkamil fi 35777dc83faSkamil fi 35877dc83faSkamil 35977dc83faSkamil cat > test.cpp << EOF 36077dc83faSkamil#include <stdlib.h> 36177dc83faSkamilint callpic(void); 36277dc83faSkamilint main(void) {callpic();exit(0);} 36377dc83faSkamilEOF 36477dc83faSkamil cat > pic.cpp << EOF 36577dc83faSkamil#include <mutex> 36677dc83faSkamil#include <thread> 36777dc83faSkamil#include <iostream> 36877dc83faSkamilstd::once_flag flag, flag_throw; 36977dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); } 37077dc83faSkamilvoid throw_once(void) { throw std::exception(); } 37177dc83faSkamilint callpic(void) { 37277dc83faSkamil static const int nr_threads(4); 37377dc83faSkamil std::thread threads[nr_threads]; 37477dc83faSkamil 37577dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 37677dc83faSkamil threads[i] = std::thread(print_once); 37777dc83faSkamil } 37877dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 37977dc83faSkamil threads[i].join(); 38077dc83faSkamil } 38177dc83faSkamil 38277dc83faSkamil try { 38377dc83faSkamil std::call_once(flag_throw, throw_once); 38477dc83faSkamil } catch (...) { 38577dc83faSkamil std::cout << "world!" << std::endl; 38677dc83faSkamil } 38777dc83faSkamil return 0; 38877dc83faSkamil} 38977dc83faSkamilEOF 39077dc83faSkamil 39177dc83faSkamil atf_check -s exit:0 -o ignore -e ignore \ 39277dc83faSkamil c++ -m32 -pg -fPIC -shared -o libtest.so pic.cpp 39377dc83faSkamil atf_check -s exit:0 -o ignore -e ignore \ 39477dc83faSkamil c++ -m32 -pg -o call_once2 test.cpp -L. -ltest -pthread 39577dc83faSkamil 39677dc83faSkamil export LD_LIBRARY_PATH=. 39777dc83faSkamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2 39877dc83faSkamil} 39977dc83faSkamil 40077dc83faSkamilcall_once2_pie_body() { 40177dc83faSkamil # check whether this arch supports -pie 40277dc83faSkamil if ! c++ -pie -dM -E - < /dev/null 2>/dev/null >/dev/null; then 40377dc83faSkamil atf_skip "c++ -pie not supported on this architecture" 40477dc83faSkamil fi 40577dc83faSkamil cat > test.cpp << EOF 40677dc83faSkamil#include <mutex> 40777dc83faSkamil#include <thread> 40877dc83faSkamil#include <iostream> 40977dc83faSkamilstd::once_flag flag, flag_throw; 41077dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); } 41177dc83faSkamilvoid throw_once(void) { throw std::exception(); } 41277dc83faSkamilint main(void) { 41377dc83faSkamil static const int nr_threads(4); 41477dc83faSkamil std::thread threads[nr_threads]; 41577dc83faSkamil 41677dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 41777dc83faSkamil threads[i] = std::thread(print_once); 41877dc83faSkamil } 41977dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 42077dc83faSkamil threads[i].join(); 42177dc83faSkamil } 42277dc83faSkamil 42377dc83faSkamil try { 42477dc83faSkamil std::call_once(flag_throw, throw_once); 42577dc83faSkamil } catch (...) { 42677dc83faSkamil std::cout << "world!" << std::endl; 42777dc83faSkamil } 42877dc83faSkamil return 0; 42977dc83faSkamil} 43077dc83faSkamilEOF 43177dc83faSkamil atf_check -s exit:0 -o ignore -e ignore c++ -fpie -pie -o call_once2 test.cpp -pthread 43277dc83faSkamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2 43377dc83faSkamil} 43477dc83faSkamil 43577dc83faSkamilcall_once2_32_body() { 43677dc83faSkamil # check whether this arch is 64bit 43777dc83faSkamil if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 43877dc83faSkamil atf_skip "this is not a 64 bit architecture" 43977dc83faSkamil fi 44077dc83faSkamil if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 44177dc83faSkamil atf_skip "c++ -m32 not supported on this architecture" 44277dc83faSkamil else 44377dc83faSkamil if fgrep -q _LP64 ./def32; then 44477dc83faSkamil atf_fail "c++ -m32 does not generate netbsd32 binaries" 44577dc83faSkamil fi 44677dc83faSkamil fi 44777dc83faSkamil 44877dc83faSkamil cat > test.cpp << EOF 44977dc83faSkamil#include <mutex> 45077dc83faSkamil#include <thread> 45177dc83faSkamil#include <iostream> 45277dc83faSkamilstd::once_flag flag, flag_throw; 45377dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); } 45477dc83faSkamilvoid throw_once(void) { throw std::exception(); } 45577dc83faSkamilint main(void) { 45677dc83faSkamil static const int nr_threads(4); 45777dc83faSkamil std::thread threads[nr_threads]; 45877dc83faSkamil 45977dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 46077dc83faSkamil threads[i] = std::thread(print_once); 46177dc83faSkamil } 46277dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 46377dc83faSkamil threads[i].join(); 46477dc83faSkamil } 46577dc83faSkamil 46677dc83faSkamil try { 46777dc83faSkamil std::call_once(flag_throw, throw_once); 46877dc83faSkamil } catch (...) { 46977dc83faSkamil std::cout << "world!" << std::endl; 47077dc83faSkamil } 47177dc83faSkamil return 0; 47277dc83faSkamil} 47377dc83faSkamilEOF 47477dc83faSkamil atf_check -s exit:0 -o ignore -e ignore c++ -o call_once2_32 -m32 test.cpp -pthread 47577dc83faSkamil atf_check -s exit:0 -o ignore -e ignore c++ -o call_once2_64 test.cpp -pthread 47677dc83faSkamil file -b ./call_once2_32 > ./ftype32 47777dc83faSkamil file -b ./call_once2_64 > ./ftype64 47877dc83faSkamil if diff ./ftype32 ./ftype64 >/dev/null; then 47977dc83faSkamil atf_fail "generated binaries do not differ" 48077dc83faSkamil fi 48177dc83faSkamil echo "32bit binaries on this platform are:" 48277dc83faSkamil cat ./ftype32 48377dc83faSkamil echo "While native (64bit) binaries are:" 48477dc83faSkamil cat ./ftype64 48577dc83faSkamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2_32 48677dc83faSkamil 48777dc83faSkamil # do another test with static 32bit binaries 48877dc83faSkamil cat > test.cpp << EOF 48977dc83faSkamil#include <mutex> 49077dc83faSkamil#include <thread> 49177dc83faSkamil#include <iostream> 49277dc83faSkamilstd::once_flag flag, flag_throw; 49377dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); } 49477dc83faSkamilvoid throw_once(void) { throw std::exception(); } 49577dc83faSkamilint main(void) { 49677dc83faSkamil static const int nr_threads(4); 49777dc83faSkamil std::thread threads[nr_threads]; 49877dc83faSkamil 49977dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 50077dc83faSkamil threads[i] = std::thread(print_once); 50177dc83faSkamil } 50277dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 50377dc83faSkamil threads[i].join(); 50477dc83faSkamil } 50577dc83faSkamil 50677dc83faSkamil try { 50777dc83faSkamil std::call_once(flag_throw, throw_once); 50877dc83faSkamil } catch (...) { 50977dc83faSkamil std::cout << "world!" << std::endl; 51077dc83faSkamil } 51177dc83faSkamil return 0; 51277dc83faSkamil} 51377dc83faSkamilEOF 51477dc83faSkamil atf_check -s exit:0 -o ignore -e ignore c++ -o call_once2 -m32 -pthread \ 51577dc83faSkamil -static test.cpp 51677dc83faSkamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2 51777dc83faSkamil} 51877dc83faSkamil 51977dc83faSkamilcall_once2_static_body() { 52077dc83faSkamil cat > test.cpp << EOF 52177dc83faSkamil#include <mutex> 52277dc83faSkamil#include <thread> 52377dc83faSkamil#include <iostream> 52477dc83faSkamilstd::once_flag flag, flag_throw; 52577dc83faSkamilvoid print_once(void) { std::call_once(flag, [](){ std::cout << "hello, " << std::flush; }); } 52677dc83faSkamilvoid throw_once(void) { throw std::exception(); } 52777dc83faSkamilint main(void) { 52877dc83faSkamil static const int nr_threads(4); 52977dc83faSkamil std::thread threads[nr_threads]; 53077dc83faSkamil 53177dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 53277dc83faSkamil threads[i] = std::thread(print_once); 53377dc83faSkamil } 53477dc83faSkamil for (int i = 0; i < nr_threads; ++i) { 53577dc83faSkamil threads[i].join(); 53677dc83faSkamil } 53777dc83faSkamil 53877dc83faSkamil try { 53977dc83faSkamil std::call_once(flag_throw, throw_once); 54077dc83faSkamil } catch (...) { 54177dc83faSkamil std::cout << "world!" << std::endl; 54277dc83faSkamil } 54377dc83faSkamil return 0; 54477dc83faSkamil} 54577dc83faSkamilEOF 54677dc83faSkamil atf_check -s exit:0 -o ignore -e ignore c++ -static -o call_once2 test.cpp -pthread 54777dc83faSkamil atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once2 54877dc83faSkamil} 54977dc83faSkamil 55077dc83faSkamilatf_init_test_cases() 55177dc83faSkamil{ 55277dc83faSkamil 55377dc83faSkamil atf_add_test_case call_once2 55477dc83faSkamil atf_add_test_case call_once2_profile 55577dc83faSkamil atf_add_test_case call_once2_pic 55677dc83faSkamil atf_add_test_case call_once2_pie 55777dc83faSkamil atf_add_test_case call_once2_32 55877dc83faSkamil atf_add_test_case call_once2_static 55977dc83faSkamil atf_add_test_case call_once2_pic_32 56077dc83faSkamil atf_add_test_case call_once2_pic_profile 56177dc83faSkamil atf_add_test_case call_once2_pic_profile_32 56277dc83faSkamil atf_add_test_case call_once2_profile_32 56377dc83faSkamil} 564