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 ,
0 commit comments