Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

nmos-cpp-registry spends a lot of time in regex code #48

Closed
billt-hlit opened this issue Jan 18, 2019 · 5 comments
Closed

nmos-cpp-registry spends a lot of time in regex code #48

billt-hlit opened this issue Jan 18, 2019 · 5 comments

Comments

@billt-hlit
Copy link
Contributor

When running continuous registry updates from my node, I see the following in "perf top"

   4.47%  nmos-cpp-registry          [.] _ZZNKSt8__detail15_BracketMatcherINSt7__cxx1112regex_traitsIcEELb0ELb0EE8_M_applyEcSt17integral_constantIbLb0EEENKUlvE_clEv
   3.20%  libc-2.27.so               [.] cfree@GLIBC_2.2.5
   3.14%  libstdc++.so.6.0.25        [.] __dynamic_cast
   2.62%  libstdc++.so.6.0.25        [.] _ZNK10__cxxabiv121__vmi_class_type_info12__do_dyncastElNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE
   1.84%  libstdc++.so.6.0.25        [.] _ZNKSt7__cxx117collateIcE12do_transformEPKcS3_
   1.84%  libc-2.27.so               [.] malloc
   1.54%  libc-2.27.so               [.] __GI___strcmp_ssse3
   1.36%  nmos-cpp-registry          [.] _ZNSt6vectorIcSaIcEE4dataEv

Repeatedly breaking on the BracketMatcher function show two principal contributors. The biggest one is the JSON validator, which appears to be recompiling its regexps at run time, possibly because the it's rebuilding the registration API frequently(?!):

[sorry about the long comments, but I haven't had any luck attaching files to github tickets]

#0  std::__detail::_BracketMatcher<std::__cxx11::regex_traits<char>, false, false>::_M_apply (this=0x7fffdd7ddd20, __ch=-125 '\203') at /usr/include/c++/7/bits/regex_compiler.tcc:612
#1  0x0000555555742164 in std::__detail::_BracketMatcher<std::__cxx11::regex_traits<char>, false, false>::_M_make_cache (this=0x7fffdd7ddd20) at /usr/include/c++/7/bits/regex_compiler.h:556
#2  0x000055555573dc61 in std::__detail::_BracketMatcher<std::__cxx11::regex_traits<char>, false, false>::_M_ready (this=0x7fffdd7ddd20) at /usr/include/c++/7/bits/regex_compiler.h:525
#3  0x000055555573e969 in std::__detail::_Compiler<std::__cxx11::regex_traits<char> >::_M_insert_bracket_matcher<false, false> (this=0x7fffdd7de190, __neg=true) at /usr/include/c++/7/bits/regex_compiler.tcc:444
#4  0x000055555573ad67 in std::__detail::_Compiler<std::__cxx11::regex_traits<char> >::_M_bracket_expression (this=0x7fffdd7de190) at /usr/include/c++/7/bits/regex_compiler.tcc:363
#5  0x0000555555735e79 in std::__detail::_Compiler<std::__cxx11::regex_traits<char> >::_M_atom (this=0x7fffdd7de190) at /usr/include/c++/7/bits/regex_compiler.tcc:349
#6  0x0000555555732999 in std::__detail::_Compiler<std::__cxx11::regex_traits<char> >::_M_term (this=0x7fffdd7de190) at /usr/include/c++/7/bits/regex_compiler.tcc:139
#7  0x000055555572fa66 in std::__detail::_Compiler<std::__cxx11::regex_traits<char> >::_M_alternative (this=0x7fffdd7de190) at /usr/include/c++/7/bits/regex_compiler.tcc:121
#8  0x000055555572fa89 in std::__detail::_Compiler<std::__cxx11::regex_traits<char> >::_M_alternative (this=0x7fffdd7de190) at /usr/include/c++/7/bits/regex_compiler.tcc:124
#9  0x000055555572d6d8 in std::__detail::_Compiler<std::__cxx11::regex_traits<char> >::_M_disjunction (this=0x7fffdd7de190) at /usr/include/c++/7/bits/regex_compiler.tcc:97
#10 0x000055555572bb77 in std::__detail::_Compiler<std::__cxx11::regex_traits<char> >::_Compiler (this=0x7fffdd7de190, __b=0x7fff7000c570 "^[^\\s\\/]+\\/[^\\s\\/]+$", __e=0x7fff7000c584 "", __loc=..., __flags=(unknown: 16))
    at /usr/include/c++/7/bits/regex_compiler.tcc:82
#11 0x0000555555729d0c in std::__detail::__compile_nfa<char const*, std::__cxx11::regex_traits<char> > (__first=0x7fff7000c570 "^[^\\s\\/]+\\/[^\\s\\/]+$", __last=0x7fff7000c584 "", __loc=..., __flags=(unknown: 16)) at /usr/include/c++/7/bits/regex_compiler.h:203
#12 0x000055555572728a in std::__cxx11::basic_regex<char, std::__cxx11::regex_traits<char> >::basic_regex<char const*> (this=0x7fffdd7de4a0, __first=0x7fff7000c570 "^[^\\s\\/]+\\/[^\\s\\/]+$", __last=0x7fff7000c584 "", __loc=..., __f=(unknown: 16))
    at /usr/include/c++/7/bits/regex.h:767
#13 0x00005555557255a7 in std::__cxx11::basic_regex<char, std::__cxx11::regex_traits<char> >::basic_regex<char const*> (this=0x7fffdd7de4a0, __first=0x7fff7000c570 "^[^\\s\\/]+\\/[^\\s\\/]+$", __last=0x7fff7000c584 "", __f=(unknown: 16))
    at /usr/include/c++/7/bits/regex.h:512
#14 0x00005555557235f1 in std::__cxx11::basic_regex<char, std::__cxx11::regex_traits<char> >::basic_regex<std::char_traits<char>, std::allocator<char> > (this=0x7fffdd7de4a0, __s="^[^\\s\\/]+\\/[^\\s\\/]+$", __f=(unknown: 16)) at /usr/include/c++/7/bits/regex.h:493
#15 0x00005555559ab8a9 in nlohmann::json_schema_draft4::json_validator::validate_string (this=0x555555f5cbe8, instance=..., schema=..., name="root.data.caps.media_types[1]") at /home/sable/bt/git/nmos-cpp/Development/third_party/nlohmann/json-validator.cpp:766
#16 0x00005555559a9160 in nlohmann::json_schema_draft4::json_validator::validate (this=0x555555f5cbe8, instance=..., schema_=..., name="root.data.caps.media_types[1]") at /home/sable/bt/git/nmos-cpp/Development/third_party/nlohmann/json-validator.cpp:466
#17 0x00005555559a8e51 in nlohmann::json_schema_draft4::json_validator::validate (this=0x555555f5cbe8, instance=..., schema_=..., name="root.data.caps.media_types[1]") at /home/sable/bt/git/nmos-cpp/Development/third_party/nlohmann/json-validator.cpp:438
#18 0x00005555559a9e54 in nlohmann::json_schema_draft4::json_validator::validate_array (this=0x555555f5cbe8, instance=..., schema=..., name="root.data.caps.media_types") at /home/sable/bt/git/nmos-cpp/Development/third_party/nlohmann/json-validator.cpp:569
#19 0x00005555559a9137 in nlohmann::json_schema_draft4::json_validator::validate (this=0x555555f5cbe8, instance=..., schema_=..., name="root.data.caps.media_types") at /home/sable/bt/git/nmos-cpp/Development/third_party/nlohmann/json-validator.cpp:462
#20 0x00005555559aa699 in nlohmann::json_schema_draft4::json_validator::validate_object (this=0x555555f5cbe8, instance=..., schema=..., name="root.data.caps") at /home/sable/bt/git/nmos-cpp/Development/third_party/nlohmann/json-validator.cpp:649
#21 0x00005555559a910e in nlohmann::json_schema_draft4::json_validator::validate (this=0x555555f5cbe8, instance=..., schema_=..., name="root.data.caps") at /home/sable/bt/git/nmos-cpp/Development/third_party/nlohmann/json-validator.cpp:458
#22 0x00005555559aa699 in nlohmann::json_schema_draft4::json_validator::validate_object (this=0x555555f5cbe8, instance=..., schema=..., name="root.data") at /home/sable/bt/git/nmos-cpp/Development/third_party/nlohmann/json-validator.cpp:649
#23 0x00005555559a910e in nlohmann::json_schema_draft4::json_validator::validate (this=0x555555f5cbe8, instance=..., schema_=..., name="root.data") at /home/sable/bt/git/nmos-cpp/Development/third_party/nlohmann/json-validator.cpp:458
#24 0x00005555559a8e51 in nlohmann::json_schema_draft4::json_validator::validate (this=0x555555f5cbe8, instance=..., schema_=..., name="root.data") at /home/sable/bt/git/nmos-cpp/Development/third_party/nlohmann/json-validator.cpp:438
#25 0x00005555559a8e51 in nlohmann::json_schema_draft4::json_validator::validate (this=0x555555f5cbe8, instance=..., schema_=..., name="root.data") at /home/sable/bt/git/nmos-cpp/Development/third_party/nlohmann/json-validator.cpp:438
#26 0x00005555559aa699 in nlohmann::json_schema_draft4::json_validator::validate_object (this=0x555555f5cbe8, instance=..., schema=..., name="root") at /home/sable/bt/git/nmos-cpp/Development/third_party/nlohmann/json-validator.cpp:649
#27 0x00005555559a910e in nlohmann::json_schema_draft4::json_validator::validate (this=0x555555f5cbe8, instance=..., schema_=..., name="root") at /home/sable/bt/git/nmos-cpp/Development/third_party/nlohmann/json-validator.cpp:458
#28 0x00005555559a8e51 in nlohmann::json_schema_draft4::json_validator::validate (this=0x555555f5cbe8, instance=..., schema_=..., name="root") at /home/sable/bt/git/nmos-cpp/Development/third_party/nlohmann/json-validator.cpp:438
#29 0x00005555559a86c0 in nlohmann::json_schema_draft4::json_validator::validate (this=0x555555f5cbe8, instance=...) at /home/sable/bt/git/nmos-cpp/Development/third_party/nlohmann/json-validator.cpp:359
#30 0x0000555555946adc in web::json::experimental::details::json_validator_impl::validate (this=0x555555df8f10, value=..., id=...) at /home/sable/bt/git/nmos-cpp/Development/cpprest/json_validator_impl.cpp:115
#31 0x0000555555944c6a in web::json::experimental::json_validator::validate (this=0x555555f53918, value=..., id=...) at /home/sable/bt/git/nmos-cpp/Development/cpprest/json_validator_impl.cpp:137
#32 0x000055555590a1db in nmos::make_unmounted_registration_api(nmos::registry_model&, slog::base_gate&)::{lambda(web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&)#4}::operator()(web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&) const::{lambda(web::json::value)#1}::operator()(web::json)
    (__closure=0x7fff5c003920, body=...) at /home/sable/bt/git/nmos-cpp/Development/nmos/registration_api.cpp:161
#33 0x00005555559139f7 in std::_Function_handler<bool (web::json::value), nmos::make_unmounted_registration_api(nmos::registry_model&, slog::base_gate&)::{lambda(web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&)#4}::operator()(web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&) const::{lambda(web::json::value)#1}>::_M_invoke(std::_Any_data const&, web::json::value&&) (__functor=..., __args#0=...) at /usr/include/c++/7/bits/std_function.h:302
#34 0x00005555558e0e85 in std::function<bool (web::json::value)>::operator()(web::json::value) const (this=0x7fffdd7e18c0, __args#0=...) at /usr/include/c++/7/bits/std_function.h:706
#35 0x00005555559138e3 in pplx::task<web::json::value>::_ContinuationTaskHandle<web::json::value, bool, nmos::make_unmounted_registration_api(nmos::registry_model&, slog::base_gate&)::{lambda(web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&)#4}::operator()(web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&) const::{lambda(web::json::value)#1}, std::integral_constant<bool, false>, pplx::details::_TypeSelectorNoAsync>::_LogWorkItemAndInvokeUserLambda<std::function<bool (web::json::value)>, web::json::value>(std::function<bool (web::json::value)>&&, bool (&&)(web::json::value)) const (this=0x7fff5c009710, _func=..., _value=...) at /usr/local/include/pplx/pplxtasks.h:3859
#36 0x0000555555913719 in pplx::task<web::json::value>::_ContinuationTaskHandle<web::json::value, bool, nmos::make_unmounted_registration_api(nmos::registry_model&, slog::base_gate&)::{lambda(web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&)#4}::operator()(web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&) const::{lambda(web::json::value)#1}, std::integral_constant<bool, false>, pplx::details::_TypeSelectorNoAsync>::_Continue(nmos::make_unmounted_registration_api(nmos::registry_model&, slog::base_gate&)::{lambda(web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&)#4}::operator()(web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&) const::{lambda(web::json::value)#1}, std::integral_constant<bool, false>) const (this=0x7fff5c009710) at /usr/local/include/pplx/pplxtasks.h:3891
#37 0x000055555591357d in pplx::task<web::json::value>::_ContinuationTaskHandle<web::json::value, bool, nmos::make_unmounted_registration_api(nmos::registry_model&, slog::base_gate&)::{lambda(web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basi---Type <return> to continue, or q <return> to quit---
c_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&)#4}::operator()(web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&) const::{lambda(web::json::value)#1}, std::integral_constant<bool, false>, pplx::details::_TypeSelectorNoAsync>::_Perform() const (this=0x7fff5c009710) at /usr/local/include/pplx/pplxtasks.h:3864
#38 0x0000555555913359 in pplx::details::_PPLTaskHandle<bool, pplx::task<web::json::value>::_ContinuationTaskHandle<web::json::value, bool, nmos::make_unmounted_registration_api(nmos::registry_model&, slog::base_gate&)::{lambda(web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&)#4}::operator()(web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&) const::{lambda(web::json::value)#1}, std::integral_constant<bool, false>, pplx::details::_TypeSelectorNoAsync>, pplx::details::_ContinuationTaskHandleBase>::invoke() const (this=0x7fff5c009710)
    at /usr/local/include/pplx/pplxtasks.h:1637
#39 0x000055555571ee68 in pplx::details::_TaskProcHandle::_RunChoreBridge (_Parameter=0x7fff5c009710) at /usr/local/include/pplx/pplx.h:116
#40 0x00007ffff79a51b5 in void boost::_bi::list1<boost::_bi::value<void*> >::operator()<void (*)(void*), boost::_bi::list0>(boost::_bi::type<void>, void (*&)(void*), boost::_bi::list0&, int) () from /usr/local/lib/libcpprest.so.2.10
#41 0x00007ffff79a5150 in boost::_bi::bind_t<void, void (*)(void*), boost::_bi::list1<boost::_bi::value<void*> > >::operator()() () from /usr/local/lib/libcpprest.so.2.10
#42 0x00007ffff79a5103 in void boost::asio::asio_handler_invoke<boost::_bi::bind_t<void, void (*)(void*), boost::_bi::list1<boost::_bi::value<void*> > > >(boost::_bi::bind_t<void, void (*)(void*), boost::_bi::list1<boost::_bi::value<void*> > >&, ...) ()
   from /usr/local/lib/libcpprest.so.2.10
#43 0x00007ffff79a5098 in void boost_asio_handler_invoke_helpers::invoke<boost::_bi::bind_t<void, void (*)(void*), boost::_bi::list1<boost::_bi::value<void*> > >, boost::_bi::bind_t<void, void (*)(void*), boost::_bi::list1<boost::_bi::value<void*> > > >(boost::_bi::bind_t<void, void (*)(void*), boost::_bi::list1<boost::_bi::value<void*> > >&, boost::_bi::bind_t<void, void (*)(void*), boost::_bi::list1<boost::_bi::value<void*> > >&) () from /usr/local/lib/libcpprest.so.2.10
#44 0x00007ffff79a4fc6 in boost::asio::detail::completion_handler<boost::_bi::bind_t<void, void (*)(void*), boost::_bi::list1<boost::_bi::value<void*> > > >::do_complete(boost::asio::detail::task_io_service*, boost::asio::detail::task_io_service_operation*, boost::system::error_code const&, unsigned long) () from /usr/local/lib/libcpprest.so.2.10
#45 0x0000555555759242 in boost::asio::detail::task_io_service_operation::complete (this=0x7fff6001e060, owner=..., ec=..., bytes_transferred=0) at /usr/include/boost/asio/detail/task_io_service_operation.hpp:38
#46 0x000055555575a20f in boost::asio::detail::task_io_service::do_run_one (this=0x555555f49cd0, lock=..., this_thread=..., ec=...) at /usr/include/boost/asio/detail/impl/task_io_service.ipp:372
#47 0x0000555555759ebf in boost::asio::detail::task_io_service::run (this=0x555555f49cd0, ec=...) at /usr/include/boost/asio/detail/impl/task_io_service.ipp:149
#48 0x000055555575a50c in boost::asio::io_service::run (this=0x7ffff7dd4868 <crossplat::threadpool::shared_instance()::s_shared+8>) at /usr/include/boost/asio/impl/io_service.ipp:59

Runner-up looks to be the user of that API:

#0  std::__detail::_BracketMatcher<std::__cxx11::regex_traits<char>, false, false>::_M_apply (this=0x555555f94900, __ch=49 '1') at /usr/include/c++/7/bits/regex_compiler.h:550
#1  0x0000555555747441 in std::__detail::_BracketMatcher<std::__cxx11::regex_traits<char>, false, false>::operator() (this=0x555555f94900, __ch=49 '1') at /usr/include/c++/7/bits/regex_compiler.h:454
#2  0x00005555557423b0 in std::_Function_handler<bool (char), std::__detail::_BracketMatcher<std::__cxx11::regex_traits<char>, false, false> >::_M_invoke(std::_Any_data const&, char&&) (__functor=..., __args#0=@0x7ffff16277b4: 49 '1')
    at /usr/include/c++/7/bits/std_function.h:302
#3  0x000055555573bfe8 in std::function<bool (char)>::operator()(char) const (this=0x555555f8e2a0, __args#0=49 '1') at /usr/include/c++/7/bits/std_function.h:706
#4  0x0000555555737758 in std::__detail::_State<char>::_M_matches (this=0x555555f8e290, __char=49 '1') at /usr/include/c++/7/bits/regex_automaton.h:170
#5  0x0000555555734349 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=27) at /usr/include/c++/7/bits/regex_executor.tcc:326
#6  0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=27) at /usr/include/c++/7/bits/regex_executor.tcc:480
#7  0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=26) at /usr/include/c++/7/bits/regex_executor.tcc:329
#8  0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=26) at /usr/include/c++/7/bits/regex_executor.tcc:480
#9  0x0000555555734024 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_subexpr_begin (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=25) at /usr/include/c++/7/bits/regex_executor.tcc:254
#10 0x0000555555730e20 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=25) at /usr/include/c++/7/bits/regex_executor.tcc:468
#11 0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=24) at /usr/include/c++/7/bits/regex_executor.tcc:329
#12 0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=24) at /usr/include/c++/7/bits/regex_executor.tcc:480
#13 0x00005555557340f1 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_subexpr_end (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=23) at /usr/include/c++/7/bits/regex_executor.tcc:269
#14 0x0000555555730e3b in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=23) at /usr/include/c++/7/bits/regex_executor.tcc:470
#15 0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=21) at /usr/include/c++/7/bits/regex_executor.tcc:329
#16 0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=21) at /usr/include/c++/7/bits/regex_executor.tcc:480
#17 0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=20) at /usr/include/c++/7/bits/regex_executor.tcc:329
#18 0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=20) at /usr/include/c++/7/bits/regex_executor.tcc:480
#19 0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=19) at /usr/include/c++/7/bits/regex_executor.tcc:329
#20 0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=19) at /usr/include/c++/7/bits/regex_executor.tcc:480
#21 0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_st---Type <return> to continue, or q <return> to quit---
ring<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=18) at /usr/include/c++/7/bits/regex_executor.tcc:329
#22 0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=18) at /usr/include/c++/7/bits/regex_executor.tcc:480
#23 0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=17) at /usr/include/c++/7/bits/regex_executor.tcc:329
#24 0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=17) at /usr/include/c++/7/bits/regex_executor.tcc:480
#25 0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=16) at /usr/include/c++/7/bits/regex_executor.tcc:329
#26 0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=16) at /usr/include/c++/7/bits/regex_executor.tcc:480
#27 0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=15) at /usr/include/c++/7/bits/regex_executor.tcc:329
#28 0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=15) at /usr/include/c++/7/bits/regex_executor.tcc:480
#29 0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=14) at /usr/include/c++/7/bits/regex_executor.tcc:329
#30 0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=14) at /usr/include/c++/7/bits/regex_executor.tcc:480
#31 0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=13) at /usr/include/c++/7/bits/regex_executor.tcc:329
#32 0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=13) at /usr/include/c++/7/bits/regex_executor.tcc:480
#33 0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=12) at /usr/include/c++/7/bits/regex_executor.tcc:329
#34 0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=12) at /usr/include/c++/7/bits/regex_executor.tcc:480
#35 0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=11) at /usr/include/c++/7/bits/regex_executor.tcc:329
#36 0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=11) at /usr/include/c++/7/bits/regex_executor.tcc:480
#37 0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=10) at /usr/include/c++/7/bits/regex_executor.tcc:329
#38 0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=10) at /usr/include/c++/7/bits/regex_executor.tcc:480
#39 0x0000555555734024 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_subexpr_begin (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=9) at /usr/include/c++/7/bits/regex_executor.tcc:254
---Type <return> to continue, or q <return> to quit---
#40 0x0000555555730e20 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=9) at /usr/include/c++/7/bits/regex_executor.tcc:468
#41 0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=8) at /usr/include/c++/7/bits/regex_executor.tcc:329
#42 0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=8) at /usr/include/c++/7/bits/regex_executor.tcc:480
#43 0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=7) at /usr/include/c++/7/bits/regex_executor.tcc:329
#44 0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=7) at /usr/include/c++/7/bits/regex_executor.tcc:480
#45 0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=6) at /usr/include/c++/7/bits/regex_executor.tcc:329
#46 0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=6) at /usr/include/c++/7/bits/regex_executor.tcc:480
#47 0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=5) at /usr/include/c++/7/bits/regex_executor.tcc:329
#48 0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=5) at /usr/include/c++/7/bits/regex_executor.tcc:480
#49 0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=4) at /usr/include/c++/7/bits/regex_executor.tcc:329
#50 0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=4) at /usr/include/c++/7/bits/regex_executor.tcc:480
#51 0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=3) at /usr/include/c++/7/bits/regex_executor.tcc:329
#52 0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=3) at /usr/include/c++/7/bits/regex_executor.tcc:480
#53 0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=2) at /usr/include/c++/7/bits/regex_executor.tcc:329
#54 0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=2) at /usr/include/c++/7/bits/regex_executor.tcc:480
#55 0x0000555555734377 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_match (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=1) at /usr/include/c++/7/bits/regex_executor.tcc:329
#56 0x0000555555730ebc in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=1) at /usr/include/c++/7/bits/regex_executor.tcc:480
#57 0x0000555555734024 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_handle_subexpr_begin (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=0) at /usr/include/c++/7/bits/regex_executor.tcc:254
#58 0x0000555555730e20 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11:---Type <return> to continue, or q <return> to quit---
:basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_dfs (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix, __i=0) at /usr/include/c++/7/bits/regex_executor.tcc:468
#59 0x000055555572e893 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_main_dispatch (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix) at /usr/include/c++/7/bits/regex_executor.tcc:87
#60 0x000055555572c955 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_main (this=0x7ffff1628560, 
    __match_mode=std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_Match_mode::_Prefix) at /usr/include/c++/7/bits/regex_executor.h:149
#61 0x000055555572c99d in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_search_from_first (this=0x7ffff1628560) at /usr/include/c++/7/bits/regex_executor.h:101
#62 0x000055555572ab62 in std::__detail::_Executor<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, std::__cxx11::regex_traits<char>, true>::_M_search (this=0x7ffff1628560) at /usr/include/c++/7/bits/regex_executor.tcc:42
#63 0x0000555555727d5e in std::__detail::__regex_algo_impl<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, char, std::__cxx11::regex_traits<char>, (std::__detail::_RegexExecutorPolicy)0, false> (__s=47 '/', __e=0 '\000', __m=..., __re=..., __flags=(unknown: 64))
    at /usr/include/c++/7/bits/regex.tcc:82
#64 0x0000555555725acf in std::regex_search<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, char, std::__cxx11::regex_traits<char> > (__s=47 '/', __e=0 '\000', __m=..., __re=..., __flags=(unknown: 64)) at /usr/include/c++/7/bits/regex.h:2196
#65 0x00005555557239c4 in std::regex_search<std::char_traits<char>, std::allocator<char>, std::allocator<std::__cxx11::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, char, std::__cxx11::regex_traits<char> > (__s="/x-nmos/registration/v1.2/health/nodes/f7699281-695d-5bea-8fb2-b1fba9a57c79", __m=..., __e=..., __f=(unknown: 64)) at /usr/include/c++/7/bits/regex.h:2302
#66 0x000055555571a8ca in web::http::experimental::listener::api_router::route_regex_match (path="/x-nmos/registration/v1.2/health/nodes/f7699281-695d-5bea-8fb2-b1fba9a57c79", route_match=..., route_regex=..., 
    flags=web::http::experimental::listener::api_router::match_prefix) at /home/sable/bt/git/nmos-cpp/Development/cpprest/api_router.cpp:204
#67 0x000055555571974d in web::http::experimental::listener::api_router::operator() (this=0x555555f790c0, req=..., res=..., route_path="", parameters=std::unordered_map with 0 elements, route=
    {flags = web::http::experimental::listener::api_router::match_prefix, route_pattern = {first = {static icase = <optimized out>, static nosubs = <optimized out>, static optimize = <optimized out>, static collate = <optimized out>, static ECMAScript = (unknown: 16), static basic = <optimized out>, static extended = <optimized out>, static awk = <optimized out>, static grep = <optimized out>, static egrep = <optimized out>, _M_flags = (unknown: 16), _M_loc = {static none = 0, static ctype = 1, static numeric = 2, static collate = 4, static time = 8, static monetary = 16, static messages = 32, static all = 63, _M_impl = 0x7ffff6434680, static _S_classic = <optimized out>, static _S_global = <optimized out>, static _S_categories = <optimized out>, static _S_once = <optimized out>, static _S_twinned_facets = <optimized out>}, _M_automaton = std::shared_ptr<const std::__detail::_NFA<std::__cxx11::regex_traits<char> >> (use count 1, weak count 0) = {get() = 0x555555f9a4e0}}, second = std::map with 2 elements = {["api"] = 1, ["version"] = 2}}, method = "", handler = {<std::_Maybe_unary_or_binary_function<pplx::task<bool>, web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&>> = {<No data fields>}, <std::_Function_base> = {static _M_max_size = 16, static _M_max_align = 8, _M_functor = {_M_unused = {_M_object = 0x555555f29900, _M_const_object = 0x555555f29900, _M_function_pointer = 0x555555f29900, _M_member_pointer = (void (std::_Undefined_class::*)(std::_Undefined_class * const)) 0x555555f29900}, _M_pod_data = "\000\231\362UUU\000\000\000\000\000\000\000\000\000"}, _M_manager = 0x555555701dcf <std::_Function_base::_Base_manager<web::http::experimental::listener::api_router>::_M_manager(std::_Any_data&, std::_Any_data const&, std::_Manager_operation)>}, _M_invoker = 0x555555701cb2 <std::_Function_handler<pplx::task<bool> (web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&), web::http::experimental::listener::api_router>::_M_invoke(std::_Any_data const&, web::http::http_request&&, web::http::http_response&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&)>}})
    at /home/sable/bt/git/nmos-cpp/Development/cpprest/api_router.cpp:72
#68 0x00005555557193fa in web::http::experimental::listener::api_router::operator() (this=0x555555f790c0, req=..., res=..., route_path="", parameters=std::unordered_map with 0 elements) at /home/sable/bt/git/nmos-cpp/Development/cpprest/api_router.cpp:63
#69 0x0000555555701d6c in std::_Function_handler<pplx::task<bool> (web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&), web::http::experimental::listener::api_router>::_M_invoke(std::_Any_data const&, web::http::http_request&&, web::http::http_response&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&) (__functor=..., __args#0=..., 
    __args#1=..., __args#2="", __args#3=std::unordered_map with 0 elements) at /usr/include/c++/7/bits/std_function.h:302
#70 0x0000555555723455 in std::function<pplx::task<bool> (web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&)>::operator()(web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&) const (this=0x555555e094c8, __args#0=..., __args#1=..., __args#2="", __args#3=std::unordered_map with 0 elements)
    at /usr/include/c++/7/bits/std_function.h:706
#71 0x0000555555719ef9 in web::http::experimental::listener::api_router::call(std::function<pplx::task<bool> (web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&)> const&, std::function<pplx::task<bool> (web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&)> const&, web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&) (handler=..., exception_handler=..., req=..., res=..., route_path="", parameters=std::unordered_map with 0 elements)
    at /home/sable/bt/git/nmos-cpp/Development/cpprest/api_router.cpp:116
#72 0x00005555557198df in web::http::experimental::listener::api_router::operator() (this=0x555555e32b28, req=..., res=..., route_path="", parameters=std::unordered_map with 0 elements, route=
    {flags = web::http::experimental::listener::api_router::match_prefix, route_pattern = {first = {static icase = <optimized out>, static nosubs = <optimized out>, static optimize = <optimized out>, static collate = <optimized out>, static ECMAScript = (unknown: 16), static basic = <optimized out>, static extended = <optimized out>, static awk = <optimized out>, static grep = <optimized out>, static egrep = <optimized out>, _M_flags = (unknown: 16), _M_loc = {static none = 0, static ctype = 1, static numeric = 2, static collate = 4, static time = 8, static monetary = 16, static messages = 32, static all = 63, _M_impl = 0x7ffff6434680, static _S_classic = <optimized out>, static _S_global = <optimized out>, static _S_categories = <optimized out>, static _S_once = <optimized out>, static _S_twinned_facets = <optimized out>}, _M_automaton = std::shared_ptr<const std::__detail::_NFA<std::__cxx11::regex_traits<char> >> (use count 1, weak count 0) = {get() = 0x555555f9a620}}, second = std::map with 0 elements}, method = "", handler = {<std::_Maybe_unary_or_binary_function<pplx::task<bool>, web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::all---Type <return> to continue, or q <return> to quit---
ocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&>> = {<No data fields>}, <std::_Function_base> = {static _M_max_size = 16, static _M_max_align = 8, _M_functor = {_M_unused = {_M_object = 0x555555f790c0, _M_const_object = 0x555555f790c0, _M_function_pointer = 0x555555f790c0, _M_member_pointer = (void (std::_Undefined_class::*)(std::_Undefined_class * const)) 0x555555f790c0, this adjustment 140737488345632}, _M_pod_data = "\300\220\367UUU\000\000 \332\377\377\377\177\000"}, _M_manager = 0x555555701dcf <std::_Function_base::_Base_manager<web::http::experimental::listener::api_router>::_M_manager(std::_Any_data&, std::_Any_data const&, std::_Manager_operation)>}, _M_invoker = 0x555555701cb2 <std::_Function_handler<pplx::task<bool> (web::http::http_request, web::http::http_response, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&), web::http::experimental::listener::api_router>::_M_invoke(std::_Any_data const&, web::http::http_request&&, web::http::http_response&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&)>}})
    at /home/sable/bt/git/nmos-cpp/Development/cpprest/api_router.cpp:81
#73 0x00005555557193fa in web::http::experimental::listener::api_router::operator() (this=0x555555e32b28, req=..., res=..., route_path="", parameters=std::unordered_map with 0 elements) at /home/sable/bt/git/nmos-cpp/Development/cpprest/api_router.cpp:63
#74 0x000055555571920a in web::http::experimental::listener::api_router::operator() (this=0x555555e32b28, req=...) at /home/sable/bt/git/nmos-cpp/Development/cpprest/api_router.cpp:41
#75 0x0000555555817a6a in std::__invoke_impl<void, web::http::experimental::listener::api_router&, web::http::http_request> (__f=..., __args#0=...) at /usr/include/c++/7/bits/invoke.h:60
#76 0x000055555581636d in std::__invoke<web::http::experimental::listener::api_router&, web::http::http_request> (__fn=..., __args#0=...) at /usr/include/c++/7/bits/invoke.h:95
#77 0x00005555558136af in std::reference_wrapper<web::http::experimental::listener::api_router>::operator()<web::http::http_request> (this=0x555555fce9a0, __args#0=...) at /usr/include/c++/7/bits/refwrap.h:356
#78 0x0000555555810dfb in std::_Function_handler<void (web::http::http_request), std::reference_wrapper<web::http::experimental::listener::api_router> >::_M_invoke(std::_Any_data const&, web::http::http_request&&) (__functor=..., __args#0=...)
    at /usr/include/c++/7/bits/std_function.h:316
#79 0x00007ffff78483cb in std::function<void (web::http::http_request)>::operator()(web::http::http_request) const () from /usr/local/lib/libcpprest.so.2.10
#80 0x00007ffff7846126 in web::http::experimental::listener::details::http_listener_impl::handle_request(web::http::http_request) () from /usr/local/lib/libcpprest.so.2.10
#81 0x00007ffff79f4f51 in (anonymous namespace)::asio_server_connection::dispatch_request_to_listener() () from /usr/local/lib/libcpprest.so.2.10
#82 0x00007ffff79f39a0 in (anonymous namespace)::asio_server_connection::handle_headers() () from /usr/local/lib/libcpprest.so.2.10
#83 0x00007ffff79f2f89 in (anonymous namespace)::asio_server_connection::handle_http_line(boost::system::error_code const&) () from /usr/local/lib/libcpprest.so.2.10
#84 0x00007ffff79f2243 in (anonymous namespace)::asio_server_connection::start_request_response()::{lambda(boost::system::error_code const&, unsigned long)#2}::operator()(boost::system::error_code const&, unsigned long) const () from /usr/local/lib/libcpprest.so.2.10
#85 0x00007ffff79fa9cb in boost::asio::detail::read_until_match_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::allocator<char>, (anonymous namespace)::crlfcrlf_nonascii_searcher_t, (anonymous namespace)::asio_server_connection::start_request_response()::{lambda(boost::system::error_code const&, unsigned long)#2}>::operator()(boost::system::error_code const&, unsigned long, int) () from /usr/local/lib/libcpprest.so.2.10
#86 0x00007ffff7a14c32 in boost::asio::detail::binder2<boost::asio::detail::read_until_match_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::allocator<char>, (anonymous namespace)::crlfcrlf_nonascii_searcher_t, (anonymous namespace)::asio_server_connection::start_request_response()::{lambda(boost::system::error_code const&, unsigned long)#2}>, boost::system::error_code, unsigned long>::operator()() () from /usr/local/lib/libcpprest.so.2.10
#87 0x00007ffff7a1239d in void boost::asio::asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_until_match_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::allocator<char>, (anonymous namespace)::crlfcrlf_nonascii_searcher_t, (anonymous namespace)::asio_server_connection::start_request_response()::{lambda(boost::system::error_code const&, unsigned long)#2}>, boost::system::error_code, unsigned long> >(boost::asio::detail::binder2<boost::asio::detail::read_until_match_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::allocator<char>, (anonymous namespace)::crlfcrlf_nonascii_searcher_t, (anonymous namespace)::asio_server_connection::start_request_response()::{lambda(boost::system::error_code const&, unsigned long)#2}>, boost::system::error_code, unsigned long>&, ...) () from /usr/local/lib/libcpprest.so.2.10
#88 0x00007ffff7a109f4 in void boost_asio_handler_invoke_helpers::invoke<boost::asio::detail::binder2<boost::asio::detail::read_until_match_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::allocator<char>, (anonymous namespace)::crlfcrlf_nonascii_searcher_t, (anonymous namespace)::asio_server_connection::start_request_response()::{lambda(boost::system::error_code const&, unsigned long)#2}>, boost::system::error_code, unsigned long>, {lambda(boost::system::error_code const&, unsigned long)#2}>(boost::asio::detail::binder2<boost::asio::detail::read_until_match_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::allocator<char>, (anonymous namespace)::crlfcrlf_nonascii_searcher_t, (anonymous namespace)::asio_server_connection::start_request_response()::{lambda(boost::system::error_code const&, unsigned long)#2}>, boost::system::error_code, unsigned long>&, {lambda(boost::system::error_code const&, unsigned long)#2}&) ()
   from /usr/local/lib/libcpprest.so.2.10
#89 0x00007ffff7a0e682 in void boost::asio::detail::asio_handler_invoke<boost::asio::detail::binder2<boost::asio::detail::read_until_match_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::allocator<char>, (anonymous namespace)::crlfcrlf_nonascii_searcher_t, (anonymous namespace)::asio_server_connection::start_request_response()::{lambda(boost::system::error_code const&, unsigned long)#2}>, boost::system::error_code, unsigned long>, boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::allocator<char>, (anonymous namespace)::crlfcrlf_nonascii_searcher_t, {lambda(boost::system::error_code const&, unsigned long)#2}>(boost::asio::detail::binder2<boost::asio::detail::read_until_match_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::allocator<char>, (anonymous namespace)::crlfcrlf_nonascii_searcher_t, (anonymous namespace)::asio_server_connection::start_request_response()::{lambda(boost::system::error_code const&, unsigned long)#2}>, boost::system::error_code, unsigned long>&, boost::asio::detail::read_until_match_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::allocator<char>, (anonymous namespace)::crlfcrlf_nonascii_searcher_t, {lambda(boost::system::error_code const&, unsigned long)#2}>*) () from /usr/local/lib/libcpprest.so.2.10
#90 0x00007ffff7a0bfbe in void boost_asio_handler_invoke_helpers::invoke<boost::asio::detail::binder2<boost::asio::detail::read_until_match_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::allocator<char>, (anonymous namespace)::crlfcrlf_nonascii_searcher_t, (anonymous namespace)::asio_server_connection::start_request_response()::{lambda(boost::system::error_code const&, unsigned long)#2}>, boost::system::error_code, unsigned long>, (anonymous namespace)::asio_server_connection::start_request_response()::{lambda(boost::system::error_code const&, unsigned long)#2}>(boost::asio::detail::binder2<boost::asio::detail::read_until_match_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::allocator<char>, (anonymous namespace)::crlfcrlf_nonascii_searcher_t, (anonymous namespace)::asio_server_connection::start_request_response()::{lambda(boost::system::error_code const&, unsigned long)#2}>, boost::system::error_code, unsigned long>&, (anonymous namespace)::asio_server_connection::start_request_response()::{lambda(boost::system::error_code const&, unsigned long)#2}&) () from /usr/local/lib/libcpprest.so.2.10
#91 0x00007ffff7a09c9d in boost::asio::detail::reactive_socket_recv_op<boost::asio::mutable_buffers_1, boost::asio::detail::read_until_match_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::allocator<char>, (anonymous namespace)::crlfcrlf_nonascii_searcher_t, (anonymous namespace)::asio_server_connection::start_request_response()::{lambda(boost::system::error_code const&, unsigned long)#2}> >::do_complete(boost::asio::detail::task_io_service*, boost::asio::detail::task_io_service_operation*, boost::system::error_code const&, unsigned long) () from /usr/local/lib/libcpprest.so.2.10
#92 0x0000555555759242 in boost::asio::detail::task_io_service_operation::complete (this=0x7fff7c017430, owner=..., ec=..., bytes_transferred=0) at /usr/include/boost/asio/detail/task_io_service_operation.hpp:38
#93 0x000055555575a20f in boost::asio::detail::task_io_service::do_run_one (this=0x555555f49cd0, lock=..., this_thread=..., ec=...) at /usr/include/boost/asio/detail/impl/task_io_service.ipp:372
#94 0x0000555555759ebf in boost::asio::detail::task_io_service::run (this=0x555555f49cd0, ec=...) at /usr/include/boost/asio/detail/impl/task_io_service.ipp:149
#95 0x000055555575a50c in boost::asio::io_service::run (this=0x7ffff7dd4868 <crossplat::threadpool::shared_instance()::s_shared+8>) at /usr/include/boost/asio/impl/io_service.ipp:59
@garethsb
Copy link
Contributor

garethsb commented Jan 18, 2019

I've checked the api_router class I implemented for nmos-cpp and it already caches prebuilt regexes, phew, but as the first call-stack shows, third_party/nlohmann/json-validator.cpp we adopted just doesn't. That's bad. (It isn't "rebuilding the Registration API"!)

On the other hand, the second call-stack which has a regex_search with a prebuilt regex (at #65) is awfully deep within that. Will see what I can repro (though it's going to depend on the regex implementation - which version of libstdc++ in this case, or Boost, or Microsoft's).

@garethsb
Copy link
Contributor

https://github.com/pboettch/json-schema-validator has had a "complete rewrite of the validator - aiming at a 2.0-release" and one of the things Patrick Boettcher has done is to cache the built regexes. I'll have a play with the latest version to see how compatible and how stable it is.

garethsb added a commit that referenced this issue Jan 21, 2019
…idation

(cherry picked from commit d7cc99b1ca6b1bc83c1644f0e3a5478a6adefce7)
garethsb added a commit that referenced this issue Jan 21, 2019
…v1.0.0 to current master (aiming at v2.0.0)

(cherry picked from commit 8f9b67503e65104b88e4fb79d7630d1990a4d8dc)
garethsb added a commit that referenced this issue Jan 21, 2019
garethsb added a commit that referenced this issue Jan 21, 2019
…mit c9ff2c8c4cf90620434e3c3082351f3492c1c95c

(cherry picked from commit 44b68b804555c7b46d22b157ca4bb036d34bc1fc)
@garethsb
Copy link
Contributor

Hi @billt-hlit. I've updated to the rewritten json-schema-validator on a branch - https://github.com/sony/nmos-cpp/tree/pboettch-json-schema-validator-update. I've tested it works. I still need to fix some compile warnings for it, but if you were to have a chance to compare performance in your environment, that would be wonderful. Understand if you've moved on to other things! Thanks.

@billt-hlit
Copy link
Contributor Author

That's a big improvement! CPU usage goes down from 90%+ to 20%+

garethsb added a commit that referenced this issue Jan 22, 2019
… which don't implement std::pair conditionally-explicit constructors (retroactively applied to C++11); we could use std::map::emplace (but we were trying to support gcc 4.7 where possible, in which it is missing)

(cherry picked from commit f838cf99835aee0f6dd6c1c2a232a5753a972e22)
garethsb added a commit that referenced this issue Jan 22, 2019
(cherry picked from commit 3d4c217c20b35aabdd04e45fce6d7cb3a5c2cacb)
garethsb added a commit that referenced this issue Feb 1, 2019
(cherry picked from commit bf6c5522ef2e4839f6b8114f1664a87c73263834)
garethsb added a commit that referenced this issue Feb 1, 2019
(cherry picked from commit 60741238bce6f31389c9df4a5767212232f89d78)
garethsb added a commit that referenced this issue Feb 1, 2019
(cherry picked from commit b36d7d295d9f765b498affe0fb1ae1b90c903196)
@garethsb
Copy link
Contributor

garethsb commented Feb 1, 2019

I've got impatient and committed patched versions of nlohmann/json version 3.5.0 and pboettch/json-schema-validator based on my PRs on those projects:

I will keep an eye out for official releases of these dependencies, but I'm going to close this issue based on our testing. Thanks, @billt-hlit.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants