diff options
author | Erik Schnetter <schnetter@cct.lsu.edu> | 2007-09-28 15:49:00 +0000 |
---|---|---|
committer | Erik Schnetter <schnetter@cct.lsu.edu> | 2007-09-28 15:49:00 +0000 |
commit | 92de5e28bea38e22c0bb69acafa440fb0ff76ad8 (patch) | |
tree | 18119ab155ee408e9160eccc0a757f2ddf845566 /Carpet | |
parent | 4ff785680bea6a8509b9f12fd6d1aa1c480b0d76 (diff) |
CarpetLib: Enforce memory limit via operating system
Enforce memory limit by calling setrlimit for RLIMIT_AS.
darcs-hash:20070928154922-dae7b-2b3436bfe35452de19b9765279c1bb81997f9497.gz
Diffstat (limited to 'Carpet')
-rw-r--r-- | Carpet/CarpetLib/schedule.ccl | 6 | ||||
-rw-r--r-- | Carpet/CarpetLib/src/mem.cc | 40 |
2 files changed, 46 insertions, 0 deletions
diff --git a/Carpet/CarpetLib/schedule.ccl b/Carpet/CarpetLib/schedule.ccl index 98cd00692..d371bc7a5 100644 --- a/Carpet/CarpetLib/schedule.ccl +++ b/Carpet/CarpetLib/schedule.ccl @@ -1,5 +1,11 @@ # Schedule definitions for thorn CarpetLib +SCHEDULE CarpetLib_setmemlimit AT WRAGH +{ + LANG: C + OPTIONS: global +} "Set operating system memory limit" + SCHEDULE CarpetLib_printtimestats AT analysis { LANG: C diff --git a/Carpet/CarpetLib/src/mem.cc b/Carpet/CarpetLib/src/mem.cc index 8a6260c9a..65d4f5e98 100644 --- a/Carpet/CarpetLib/src/mem.cc +++ b/Carpet/CarpetLib/src/mem.cc @@ -16,6 +16,9 @@ # include <malloc.h> #endif +#include <sys/resource.h> +#include <sys/time.h> + #include "defs.hh" #include "dist.hh" @@ -202,6 +205,43 @@ alloc (size_t nbytes) +extern "C" void CarpetLib_setmemlimit (CCTK_ARGUMENTS); + +void CarpetLib_setmemlimit (CCTK_ARGUMENTS) +{ + DECLARE_CCTK_ARGUMENTS; + DECLARE_CCTK_PARAMETERS; + + // Set address space limit + struct rlimit aslimit; + { + int const ierr = getrlimit (RLIMIT_AS, & aslimit); + assert (not ierr); + } + CCTK_VInfo (CCTK_THORNSTRING, + "Old address space size limit: hard=%lld, soft=%lld", + (long long) aslimit.rlim_max, (long long) aslimit.rlim_cur); + if (max_allowed_memory_MB > 0) { + aslimit.rlim_cur = max_allowed_memory_MB * 1000000LL; + } + { + int const ierr = setrlimit (RLIMIT_AS, & aslimit); + assert (not ierr); + } + { + int const ierr = getrlimit (RLIMIT_AS, & aslimit); + assert (not ierr); + } + CCTK_VInfo (CCTK_THORNSTRING, + "Old address space size limit: hard=%lld, soft=%lld", + (long long) aslimit.rlim_max, (long long) aslimit.rlim_cur); + CCTK_VInfo (CCTK_THORNSTRING, + "Unlimited address space size indicated by %lld", + (long long) RLIM_INFINITY); +} + + + extern "C" void CarpetLib_printmemstats (CCTK_ARGUMENTS); void CarpetLib_printmemstats (CCTK_ARGUMENTS) |