forked from boostorg/regex
Use call_once in test code to avoid race condition which may otherwise occur.
[SVN r65702]
This commit is contained in:
@ -36,6 +36,9 @@
|
|||||||
#include "test_icu.hpp"
|
#include "test_icu.hpp"
|
||||||
#include "test_locale.hpp"
|
#include "test_locale.hpp"
|
||||||
|
|
||||||
|
#ifdef TEST_THREADS
|
||||||
|
#include <boost/thread/once.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// define test entry proc, this forwards on to the appropriate
|
// define test entry proc, this forwards on to the appropriate
|
||||||
@ -62,6 +65,16 @@ void test(const wchar_t&, const test_regex_search_tag&);
|
|||||||
void test(const wchar_t&, const test_invalid_regex_tag&);
|
void test(const wchar_t&, const test_invalid_regex_tag&);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
template <class Regex>
|
||||||
|
struct call_once_func
|
||||||
|
{
|
||||||
|
Regex* pregex;
|
||||||
|
void operator()()const
|
||||||
|
{
|
||||||
|
return test_empty(*pregex);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
template <class charT, class tagT>
|
template <class charT, class tagT>
|
||||||
void do_test(const charT& c, const tagT& tag)
|
void do_test(const charT& c, const tagT& tag)
|
||||||
{
|
{
|
||||||
@ -73,12 +86,18 @@ void do_test(const charT& c, const tagT& tag)
|
|||||||
test_info<charT>::set_typename(typeid(boost::basic_regex<charT, boost::cpp_regex_traits<charT> >).name());
|
test_info<charT>::set_typename(typeid(boost::basic_regex<charT, boost::cpp_regex_traits<charT> >).name());
|
||||||
#endif
|
#endif
|
||||||
boost::basic_regex<charT, boost::cpp_regex_traits<charT> > e1;
|
boost::basic_regex<charT, boost::cpp_regex_traits<charT> > e1;
|
||||||
|
#ifndef TEST_THREADS
|
||||||
static bool done_empty_test = false;
|
static bool done_empty_test = false;
|
||||||
if(done_empty_test == false)
|
if(done_empty_test == false)
|
||||||
{
|
{
|
||||||
test_empty(e1);
|
test_empty(e1);
|
||||||
done_empty_test = true;
|
done_empty_test = true;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
boost::once_flag f = BOOST_ONCE_INIT;
|
||||||
|
call_once_func<boost::basic_regex<charT, boost::cpp_regex_traits<charT> > > proc = { &e1 };
|
||||||
|
boost::call_once(f, proc);
|
||||||
|
#endif
|
||||||
if(test_locale::cpp_locale_state() == test_locale::test_with_locale)
|
if(test_locale::cpp_locale_state() == test_locale::test_with_locale)
|
||||||
e1.imbue(test_locale::cpp_locale());
|
e1.imbue(test_locale::cpp_locale());
|
||||||
if(test_locale::cpp_locale_state() != test_locale::no_test)
|
if(test_locale::cpp_locale_state() != test_locale::no_test)
|
||||||
|
Reference in New Issue
Block a user