From: "Luis R. Rodriguez" <[email protected]> The paramap multiprocessor functionalty is better than the Python wrappers, use that. Since we still want folks to not have to figure out what arguments to use for a basic run on git development environments keep pycocci around for just that.
We may extend this later with SmPL proof hooks. Signed-off-by: Luis R. Rodriguez <[email protected]> --- Does anyone object to keep pycocci around which would just exist as a wrapper with sensible defeaults to Coccinelle for typical day to day development on C code on git environments? I use it so, figure I'd keep it as I figure others might. If you don't, do you realloy fill out all those arguments to spatch every time or do you carry your own wrappers? Just curious. Also, I figure we might use pycocci to extend it with SmPL proof support [0], I did that work for backports but since it seems we keep abusing gentree.py we decided to look for another home for such functionality. Would pycocci be a good home for such things or should we try to aim for somethinge else? [0] https://systeme.lip6.fr/pipermail/cocci/2015-June/002100.html tools/pycocci | 117 ++++++++++------------------------------------------------ 1 file changed, 20 insertions(+), 97 deletions(-) diff --git a/tools/pycocci b/tools/pycocci index 4aa1d36..baaa88d 100755 --- a/tools/pycocci +++ b/tools/pycocci @@ -11,61 +11,23 @@ from multiprocessing import Process, cpu_count, Queue import argparse, subprocess, os, sys -import tempfile, shutil - -# simple tempdir wrapper object for 'with' statement -# -# Usage: -# with tempdir.tempdir() as tmpdir: -# os.chdir(tmpdir) -# do something -# -class tempdir(object): - def __init__(self, suffix='', prefix='', dir=None, nodelete=False): - self.suffix = '' - self.prefix = '' - self.dir = dir - self.nodelete = nodelete - - def __enter__(self): - self._name = tempfile.mkdtemp(suffix=self.suffix, - prefix=self.prefix, - dir=self.dir) - return self._name - - def __exit__(self, type, value, traceback): - if self.nodelete: - print('not deleting directory %s!' % self._name) - else: - shutil.rmtree(self._name) class CoccinelleError(Exception): pass -class ExecutionErrorThread(CoccinelleError): - def __init__(self, errcode, fn, cocci_file, threads, t, logwrite, print_name): +class ExecutionError(CoccinelleError): + def __init__(self, errcode, output, cocci_file, logwrite, print_name): self.error_code = errcode logwrite("Failed to apply changes from %s\n" % print_name) + logwrite(output) - logwrite("Specific log output from change that failed using %s\n" % print_name) - tf = open(fn, 'r') - for line in tf.read(): - logwrite(line) - tf.close() - - logwrite("Full log using %s\n" % print_name) - for num in range(threads): - fn = os.path.join(t, '.tmp_spatch_worker.' + str(num)) - if (not os.path.isfile(fn)): - continue - tf = open(fn, 'r') - for line in tf.read(): - logwrite(line) - tf.close() - os.unlink(fn) +def spatch(cocci_file, outdir, logwrite, num_jobs, print_name, extra_args=[]): + num_cpus = cpu_count() + if num_jobs: + threads = int(num_jobs) + else: + threads = num_cpus -def spatch(cocci_file, outdir, - max_threads, thread_id, temp_dir, ret_q, extra_args=[]): cmd = ['spatch', '--sp-file', cocci_file, '--in-place', @@ -75,56 +37,20 @@ def spatch(cocci_file, outdir, '--timeout', '120', '--dir', outdir ] - if (max_threads > 1): - cmd.extend(['-max', str(max_threads), '-index', str(thread_id)]) + if (threads > 1): + cmd.extend(['--jobs', str(threads)]) cmd.extend(extra_args) - - fn = os.path.join(temp_dir, '.tmp_spatch_worker.' + str(thread_id)) - outfile = open(fn, 'w') logwrite("%s\n" % " ".join(cmd)) sprocess = subprocess.Popen(cmd, - stdout=outfile, stderr=subprocess.STDOUT, - close_fds=True, universal_newlines=True) + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + close_fds=True, universal_newlines=True) + output = sprocess.communicate()[0] sprocess.wait() - outfile.close() - ret_q.put((sprocess.returncode, fn)) - -def threaded_spatch(cocci_file, outdir, logwrite, num_jobs, - print_name, extra_args=[]): - num_cpus = cpu_count() - if num_jobs: - threads = int(num_jobs) - else: - threads = num_cpus - jobs = list() - output = "" - ret_q = Queue() - with tempdir() as t: - for num in range(threads): - p = Process(target=spatch, args=(cocci_file, outdir, - threads, num, t, ret_q, - extra_args)) - jobs.append(p) - for p in jobs: - p.start() - - for num in range(threads): - ret, fn = ret_q.get() - if ret != 0: - raise ExecutionErrorThread(ret, fn, cocci_file, threads, t, - logwrite, print_name) - for job in jobs: - p.join() - - for num in range(threads): - fn = os.path.join(t, '.tmp_spatch_worker.' + str(num)) - tf = open(fn, 'r') - output = output + tf.read() - tf.close() - os.unlink(fn) - return output + if sprocess.returncode != 0: + raise ExecutionError(sprocess.returncode, output, cocci_file, logwrite, print_name) + return output def logwrite(msg): sys.stdout.write(msg) @@ -158,12 +84,9 @@ def _main(): if args.jobs > 0: jobs = args.jobs - output = threaded_spatch(args.cocci_file, - args.target_dir, - logwrite, - jobs, - os.path.basename(args.cocci_file), - extra_args=extra_spatch_args) + output = spatch(args.cocci_file, args.target_dir, logwrite, jobs, + os.path.basename(args.cocci_file), + extra_args=extra_spatch_args) if args.verbose: logwrite(output) return 0 -- 2.3.2.209.gd67f9d5.dirty _______________________________________________ Cocci mailing list [email protected] https://systeme.lip6.fr/mailman/listinfo/cocci
