testsuite_hooks.cc [plain text]
#include <testsuite_hooks.h>
#ifdef _GLIBCPP_MEM_LIMITS
#include <unistd.h>
#include <sys/time.h>
#include <sys/resource.h>
#endif
#include <list>
#include <string>
#include <stdexcept>
#include <clocale>
#include <locale>
namespace __gnu_cxx_test
{
#ifdef _GLIBCPP_MEM_LIMITS
void
set_memory_limits(float size)
{
struct rlimit r;
__typeof__ (r.rlim_cur) limit = (__typeof__ (r.rlim_cur))(size * 1048576);
#if _GLIBCPP_HAVE_MEMLIMIT_DATA
getrlimit(RLIMIT_DATA, &r);
r.rlim_cur = limit;
setrlimit(RLIMIT_DATA, &r);
#endif
#if _GLIBCPP_HAVE_MEMLIMIT_RSS
getrlimit(RLIMIT_RSS, &r);
r.rlim_cur = limit;
setrlimit(RLIMIT_RSS, &r);
#endif
#if _GLIBCPP_HAVE_MEMLIMIT_VMEM
getrlimit(RLIMIT_VMEM, &r);
r.rlim_cur = limit;
setrlimit(RLIMIT_VMEM, &r);
#endif
#if _GLIBCPP_HAVE_MEMLIMIT_AS
getrlimit(RLIMIT_AS, &r);
r.rlim_cur = limit;
setrlimit(RLIMIT_AS, &r);
#endif
}
#else
void
set_memory_limits(float) { }
#endif
class locale_data : public std::runtime_error
{
public:
explicit
locale_data(const std::string& __arg) : runtime_error(__arg) { }
};
class environment_variable: public std::runtime_error
{
public:
explicit
environment_variable(const std::string& __arg) : runtime_error(__arg) { }
};
class not_found : public std::runtime_error
{
public:
explicit
not_found(const std::string& __arg) : runtime_error(__arg) { }
};
void
run_tests_wrapped_locale(const char* name, const func_callback& l)
{
using namespace std;
bool test = true;
locale loc_name(name);
locale orig = locale::global(loc_name);
const char* res = setlocale(LC_ALL, name);
if (res != NULL)
{
string preLC_ALL = res;
for (func_callback::const_iterator i = l.begin(); i != l.end(); ++i)
(*i)();
string postLC_ALL= setlocale(LC_ALL, NULL);
VERIFY( preLC_ALL == postLC_ALL );
}
else
throw environment_variable(string("LC_ALL for") + string(name));
}
void
run_tests_wrapped_env(const char* name, const char* env,
const func_callback& l)
{
using namespace std;
bool test = true;
#ifdef _GLIBCPP_HAVE_SETENV
locale loc_name(name);
locale orig = locale::global(loc_name);
const char* oldENV = getenv(env);
if (!setenv(env, name, 1))
{
for (func_callback::const_iterator i = l.begin(); i != l.end(); ++i)
(*i)();
setenv(env, oldENV ? oldENV : "", 1);
}
else
throw environment_variable(string(env) + string(" to ") + string(name));
#else
throw not_found("setenv");
#endif
}
counter::size_type counter::count = 0;
unsigned int copy_constructor::count_ = 0;
unsigned int copy_constructor::throw_on_ = 0;
unsigned int assignment_operator::count_ = 0;
unsigned int assignment_operator::throw_on_ = 0;
unsigned int destructor::_M_count = 0;
int copy_tracker::next_id_ = 0;
};