WARNING! Access to this system is limited to authorised users only.
Unauthorised users may be subject to prosecution.
Unauthorised access to this system is a criminal offence under Australian law (Federal Crimes Act 1914 Part VIA)
It is a criminal offence to:
(1) Obtain access to data without authority. -Penalty 2 years imprisonment.
(2) Damage, delete, alter or insert data without authority. -Penalty 10 years imprisonment.
User activity is monitored and recorded. Anyone using this system expressly consents to such monitoring and recording.

To protect your data, the CISO officer has suggested users to enable 2FA as soon as possible.
Currently 2.2% of users enabled 2FA.

Commit 93235413 authored by John Zhang's avatar John Zhang
Browse files

refactor run_in_subproc into util.py

parent c9862092
......@@ -28,7 +28,8 @@ from mubench.frontend import frontends
assert sys.version_info[:2] >= (3, 4), "Python 3.4+ is required."
logging.basicConfig(
format="[%(levelname)s] %(asctime)s %(module)s %(message)s",
# format="[%(levelname)s] %(asctime)s %(module)s %(message)s",
format="%(message)s",
level=logging.INFO)
......
......@@ -17,10 +17,10 @@ import importlib
from pathlib import Path
import os
from mubench.conf import global_settings
from mubench.exceptions import ImproperBehavior
class ImproperBehavior(Exception):
pass
class Settings:
......
#!/usr/bin/env python3
# Copyright 2017 The Australian National University
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
class ExecutionFailure(Exception):
def __init__(self, cmd, exec_res):
self.cmd = cmd
self.exec_res = exec_res
def dump(self, errlog_file):
with errlog_file.open('w') as fp:
fp.write('---------------- stdout ----------------\n')
if self.exec_res.stdout:
fp.write(str(self.exec_res.stdout, encoding='utf-8'))
fp.write('\n')
fp.write('---------------- stderr ----------------\n')
if self.exec_res.stderr:
fp.write(str(self.exec_res.stderr, encoding='utf-8'))
def __str__(self):
return "Executing '%s' failed." % \
(' '.join(self.cmd) if isinstance(self.cmd, list) else self.cmd)
class ImproperBehavior(Exception):
pass
......@@ -14,17 +14,12 @@
# limitations under the License.
import os
import time
import logging
import subprocess as subproc
from pathlib import Path
from mubench import CALLBACKS_DIR
from mubench.util import expandenv
from mubench.exceptions import ExecutionFailure
from types import SimpleNamespace
logger = logging.getLogger(__name__)
from mubench.util import run_in_subproc
class Language:
name = None
......@@ -59,27 +54,6 @@ class Language:
def run(cls, target, task):
raise NotImplementedError
@classmethod
def run_in_subproc(cls, cmd, env=None): # TODO: maybe put this in util.py
cmd = list(map(str, cmd))
logger.info(" ".join(cmd))
import resource
ru0 = resource.getrusage(resource.RUSAGE_CHILDREN)
t0 = ru0.ru_utime + ru0.ru_stime
res = subproc.Popen(cmd, stdout=subproc.PIPE, stderr=subproc.PIPE,
env=env)
so, se = res.communicate()
res = SimpleNamespace(stdout=so, stderr=se, returncode=res.returncode)
ru1 = resource.getrusage(resource.RUSAGE_CHILDREN)
t1 = ru1.ru_utime + ru1.ru_stime
if res.returncode != 0:
raise ExecutionFailure(cmd, res)
return res, (t1 - t0)
def get_lang(name):
from mubench.lang.python import Python
......
......@@ -17,7 +17,7 @@ import os
from mubench.lang import Language
from mubench import CALLBACKS_DIR
from mubench.util import expandenv
from mubench.util import expandenv, run_in_subproc
class C(Language):
......@@ -59,7 +59,7 @@ class C(Language):
cmd.append(task.srcfile)
cls.run_in_subproc(cmd, task.env)
run_in_subproc(cmd, task.env)
assert target.exists()
return target
......@@ -75,4 +75,4 @@ class C(Language):
cmd.extend(task.benchmark['args'])
return cls.run_in_subproc(cmd, task.env)
return run_in_subproc(cmd, task.env)
......@@ -19,8 +19,7 @@ from pathlib import Path
from mubench.lang import Language
from mubench import CALLBACKS_DIR
from mubench.exceptions import ExecutionFailure
from mubench.util import expandenv
from mubench.util import expandenv, run_in_subproc
class Mu(Language):
......@@ -153,7 +152,7 @@ class Mu(Language):
]
cmd.extend(srcs)
cls.run_in_subproc(cmd, task.env)
run_in_subproc(cmd, task.env)
assert build_target.exists()
......@@ -163,7 +162,7 @@ class Mu(Language):
cmd.append(cc['vmarg_s'])
cmd.append(target.absolute())
cls.run_in_subproc(cmd, task.env)
run_in_subproc(cmd, task.env)
assert target.exists()
return target
......@@ -185,4 +184,4 @@ class Mu(Language):
cmd.extend(task.benchmark['args'])
return cls.run_in_subproc(cmd, task.env)
return run_in_subproc(cmd, task.env)
......@@ -18,8 +18,7 @@ import os
from mubench import CALLBACKS_DIR
from mubench.lang import Language
from mubench.exceptions import ExecutionFailure
from mubench.util import expandenv
from mubench.util import expandenv, run_in_subproc
class Python(Language):
......@@ -60,4 +59,4 @@ class Python(Language):
cmd.extend(bmc['args'])
return cls.run_in_subproc(cmd, task.env)
return run_in_subproc(cmd, task.env)
......@@ -20,8 +20,7 @@ from pathlib import Path
from mubench.lang import Language
from mubench import CALLBACKS_DIR
from mubench.exceptions import ExecutionFailure
from mubench.util import expandenv
from mubench.util import expandenv, run_in_subproc
class RPython(Language):
......@@ -152,7 +151,7 @@ class RPython(Language):
# the rest, custom defined arguments
cmd.extend(task.compiler['args'])
cls.run_in_subproc(cmd, task.env)
run_in_subproc(cmd, task.env)
assert target.exists()
return target
......@@ -174,4 +173,4 @@ class RPython(Language):
cmd.extend(task.benchmark['args'])
return cls.run_in_subproc(cmd, task.env)
return run_in_subproc(cmd, task.env)
......@@ -19,8 +19,7 @@ import subprocess as subproc
from mubench.lang import Language
from mubench import CALLBACKS_DIR
from mubench.util import expandenv
from mubench.exceptions import ExecutionFailure
from mubench.util import expandenv, run_in_subproc
from types import SimpleNamespace
logger = logging.getLogger(__name__)
......@@ -70,7 +69,7 @@ class WASM(Language):
callback_file = callback_dir / ('cb_%(name)s.c' % task.callback)
cmd.append(callback_file)
cls.run_in_subproc(cmd, task.env)
run_in_subproc(cmd, task.env)
assert target.exists()
return target
......@@ -86,19 +85,5 @@ class WASM(Language):
cmd.extend(task.benchmark['args'])
return cls.run_in_subproc(cmd, task.env,
return run_in_subproc(cmd, task.env,
cwd=str(target.parent.resolve()))
@classmethod
def run_in_subproc(cls, cmd, env=None, **kwargs):
cmd = list(map(str, cmd))
logger.info(" ".join(cmd))
t0 = time.perf_counter()
res = subproc.Popen(cmd, stdout=subproc.PIPE, stderr=subproc.PIPE,
env=env, **kwargs)
so, se = res.communicate()
res = SimpleNamespace(stdout=so, stderr=se, returncode=res.returncode)
t1 = time.perf_counter()
if res.returncode != 0:
raise ExecutionFailure(cmd, res)
return res, (t1 - t0)
......@@ -24,9 +24,8 @@ from pathlib import Path
from types import SimpleNamespace
from mubench import SUITE_DIR, CALLBACKS_DIR
from mubench.exceptions import ExecutionFailure
from mubench.conf import settings
from mubench.util import expandenv, dictify
from mubench.util import expandenv, dictify, run_in_subproc, ExecutionFailure
from mubench.lang import get_lang, Language
from mubench.models.result import Result
......@@ -241,7 +240,7 @@ class TaskSet:
# source
cmd.append(CALLBACKS_DIR / ('cb_%(name)s.c' % self.callback))
Language.run_in_subproc(cmd, self.env)
run_in_subproc(cmd, self.env)
class Task:
"""
......
......@@ -15,10 +15,58 @@
from string import Template
import os
import logging
import subprocess as subproc
from types import SimpleNamespace
logger = logging.getLogger(__name__)
def expandenv(s, env=os.environ):
return Template(s).substitute(env)
def dictify(opt, key_name='name'):
return {key_name: opt} if isinstance(opt, str) else opt
\ No newline at end of file
return {key_name: opt} if isinstance(opt, str) else opt
class ExecutionFailure(Exception):
def __init__(self, cmd, exec_res):
self.cmd = cmd
self.exec_res = exec_res
def dump(self, errlog_file):
with errlog_file.open('w') as fp:
fp.write('---------------- stdout ----------------\n')
if self.exec_res.stdout:
fp.write(str(self.exec_res.stdout, encoding='utf-8'))
fp.write('\n')
fp.write('---------------- stderr ----------------\n')
if self.exec_res.stderr:
fp.write(str(self.exec_res.stderr, encoding='utf-8'))
def __str__(self):
return "Executing '%s' failed." % \
(' '.join(self.cmd) if isinstance(self.cmd, list) else self.cmd)
def run_in_subproc(cmd, env=None, **kwds):
cmd = list(map(str, cmd))
logger.info(" ".join(cmd))
import resource
ru0 = resource.getrusage(resource.RUSAGE_CHILDREN)
t0 = ru0.ru_utime + ru0.ru_stime
res = subproc.Popen(cmd, stdout=subproc.PIPE, stderr=subproc.PIPE,
env=env, **kwds)
so, se = res.communicate()
res = SimpleNamespace(stdout=so, stderr=se, returncode=res.returncode)
ru1 = resource.getrusage(resource.RUSAGE_CHILDREN)
t1 = ru1.ru_utime + ru1.ru_stime
if res.returncode != 0:
raise ExecutionFailure(cmd, res)
return res, (t1 - t0)
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment