|
46 | 46 | import copy |
47 | 47 | import io |
48 | 48 |
|
49 | | - |
50 | 49 | if sys.version_info >= (3, 5): |
51 | 50 | from importlib import machinery, util |
52 | 51 | def get_module(name, path): |
@@ -572,6 +571,7 @@ def __init__(self, context, path, arch, mode): |
572 | 571 | self.mode = mode |
573 | 572 | self.parallel = False |
574 | 573 | self.disable_core_files = False |
| 574 | + self.max_virtual_memory = None |
575 | 575 | self.serial_id = 0 |
576 | 576 | self.thread_id = 0 |
577 | 577 |
|
@@ -595,7 +595,8 @@ def RunCommand(self, command, env): |
595 | 595 | self.context, |
596 | 596 | self.context.GetTimeout(self.mode, self.config.section), |
597 | 597 | env, |
598 | | - disable_core_files = self.disable_core_files) |
| 598 | + disable_core_files = self.disable_core_files, |
| 599 | + max_virtual_memory = self.max_virtual_memory) |
599 | 600 | return TestOutput(self, |
600 | 601 | full_command, |
601 | 602 | output, |
@@ -759,7 +760,8 @@ def CheckedUnlink(name): |
759 | 760 | PrintError("os.unlink() " + str(e)) |
760 | 761 | break |
761 | 762 |
|
762 | | -def Execute(args, context, timeout=None, env=None, disable_core_files=False, stdin=None): |
| 763 | +def Execute(args, context, timeout=None, env=None, disable_core_files=False, |
| 764 | + stdin=None, max_virtual_memory=None): |
763 | 765 | (fd_out, outname) = tempfile.mkstemp() |
764 | 766 | (fd_err, errname) = tempfile.mkstemp() |
765 | 767 |
|
@@ -781,11 +783,27 @@ def Execute(args, context, timeout=None, env=None, disable_core_files=False, std |
781 | 783 |
|
782 | 784 | preexec_fn = None |
783 | 785 |
|
| 786 | + def disableCoreFiles(): |
| 787 | + import resource |
| 788 | + resource.setrlimit(resource.RLIMIT_CORE, (0,0)) |
| 789 | + |
784 | 790 | if disable_core_files and not utils.IsWindows(): |
785 | | - def disableCoreFiles(): |
| 791 | + preexec_fn = disableCoreFiles |
| 792 | + |
| 793 | + if max_virtual_memory is not None and utils.GuessOS() == 'linux': |
| 794 | + def setMaxVirtualMemory(): |
786 | 795 | import resource |
787 | 796 | resource.setrlimit(resource.RLIMIT_CORE, (0,0)) |
788 | | - preexec_fn = disableCoreFiles |
| 797 | + resource.setrlimit(resource.RLIMIT_AS, (max_virtual_memory,max_virtual_memory + 1)) |
| 798 | + |
| 799 | + if preexec_fn is not None: |
| 800 | + prev_preexec_fn = preexec_fn |
| 801 | + def setResourceLimits(): |
| 802 | + setMaxVirtualMemory() |
| 803 | + prev_preexec_fn() |
| 804 | + preexec_fn = setResourceLimits |
| 805 | + else: |
| 806 | + preexec_fn = setMaxVirtualMemory |
789 | 807 |
|
790 | 808 | (process, exit_code, timed_out) = RunProcess( |
791 | 809 | context, |
|