#!/usr/bin/env python import argparse import glob import subprocess import select import os import os.path import time NUMJOBS=4 class Job(object): def __init__(self, dirname, poll): self.dirname = dirname self.poll = poll self.out = '' def start(self): self.p = subprocess.Popen( ['./testsuite.sh'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True, cwd=self.dirname) self.out_fd = self.p.stdout self.poll.extend([self.out_fd]) def wait(self): self.poll.remove(self.out_fd) return self.p.wait() def run(keep): # List of tests to run tests = glob.glob('*[0-9]') start_time = time.time() jobs = [] poll = [] failures = [] nbr_tests = len(tests) nbr_run = 0 nbr_err = 0 while len(tests) != 0 or len(jobs) != 0: # Start as many jobs as possible if len(tests) > 0 and len(jobs) < NUMJOBS: test = tests.pop(0) j = Job(test, poll) jobs.append(j) print('Starting {}'.format(test)) j.start() elif len(jobs) > 0: # Wait for output or end of job. assert len(poll) == NUMJOBS or len(tests) == 0 res = select.select(poll, [], []) done = set() for fd in res[0]: d = os.read(fd.fileno(), 1024) if len(d) == 0: # EOF => end of job. for j in jobs: if fd == j.out_fd: done.add(j) break else: # Gather output for j in jobs: if fd == j.out_fd: j.out += d for j in done: print('Finish: {}'.format(j.dirname)) print(j.out) code = j.wait() if code != 0: print('############### Error for {}'.format(j.dirname)) nbr_err += 1 failures.append(j.dirname) if not keep: tests = [] jobs.remove(j) nbr_run += 1 end_time = time.time() print('{}/{} tests run in {} sec, {} failures'.format( nbr_run, nbr_tests, end_time - start_time, nbr_err)) if failures: print('Failure: {}'.format(failures)) if __name__ == '__main__': parser = argparse.ArgumentParser(description="parallel test driver") parser.add_argument("-k", "--keep", help="keep running", action='store_true') args = parser.parse_args() run(args.keep) tree.tex?id=dd8b412833b85cfffb6371b1f75340233b83a0bd'>basics_parsetree.tex
blob: 1c8392b8892f6687208c2d1cdbb9f8ece239c41a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
\documentclass[12pt,tikz]{standalone}
\pdfinfoomitdate 1
\pdfsuppressptexinfo 1
\pdftrailerid{}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{pgfplots}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric}
\pagestyle{empty}

\begin{document}
\begin{tikzpicture}
	\tikzstyle{node} = [draw, fill=green!10, ellipse, minimum height=2em, minimum width=8em, node distance=10em]

	\draw (+0,+1) node[node] (n1) {\tt assign\_stmt};

	\draw (-6,-1) node[node] (n11) {\tt TOK\_ASSIGN};
	\draw (-3,-2) node[node] (n12) {\tt TOK\_IDENTIFIER};
	\draw (+0,-1) node[node] (n13) {\tt TOK\_EQ};
	\draw (+3,-2) node[node] (n14) {\tt expr};
	\draw (+6,-1) node[node] (n15) {\tt TOK\_SEMICOLON};

	\draw (-1,-4) node[node] (n141) {\tt expr};
	\draw (+3,-4) node[node] (n142) {\tt TOK\_PLUS};
	\draw (+7,-4) node[node] (n143) {\tt expr};

	\draw (-1,-5.5) node[node] (n1411) {\tt TOK\_IDENTIFIER};
	\draw (+7,-5.5) node[node] (n1431) {\tt TOK\_NUMBER};

	\draw[-latex] (n1) -- (n11);
	\draw[-latex] (n1) -- (n12);
	\draw[-latex] (n1) -- (n13);
	\draw[-latex] (n1) -- (n14);
	\draw[-latex] (n1) -- (n15);

	\draw[-latex] (n14) -- (n141);
	\draw[-latex] (n14) -- (n142);
	\draw[-latex] (n14) -- (n143);

	\draw[-latex] (n141) -- (n1411);
	\draw[-latex] (n143) -- (n1431);
\end{tikzpicture}
\end{document}