From 99caa743437aee506bc518f6049c7e9776bb7a39 Mon Sep 17 00:00:00 2001 From: Anton Yudintsev Date: Wed, 18 Jan 2023 13:32:24 +0200 Subject: [PATCH] Fixes for Windows demangling and file naming Based on https://github.com/OfekShilon/optview2/pull/21 discussion. * add empty lock for windows and start a new demangler for each process. It is arguably not the worst solution even on other platforms, as Locks are not free, and for many files it is probably better to have demangler per process, rather than Lock them * replace \\ with in generated HTMLs, to produce correct filenames on windows --- optrecord.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/optrecord.py b/optrecord.py index 1e131d9..b3a720f 100755 --- a/optrecord.py +++ b/optrecord.py @@ -51,12 +51,21 @@ def iteritems(d): def html_file_name(filename): - return filename.replace('/', '_').replace('#', '_') + ".html" + replace_targets = ['/', '#', ':', '\\'] + new_name = filename + for target in replace_targets: + new_name = new_name.replace(target, '_') + return new_name + ".html" def make_link(File, Line): return "\"{}#L{}\"".format(html_file_name(File), Line) +class EmptyLock(object): + def __enter__(self): + return True + def __exit__(self, *args): + pass class Remark(yaml.YAMLObject): # Work-around for http://pyyaml.org/ticket/154. @@ -66,12 +75,23 @@ class Remark(yaml.YAMLObject): demangler_proc = None @classmethod - def set_demangler(cls, demangler): + def set_base_demangler(cls, demangler): cls.demangler_proc = subprocess.Popen(demangler.split(), stdin=subprocess.PIPE, stdout=subprocess.PIPE) + + @classmethod + def set_demangler(cls, demangler): + cls.set_base_demangler(demangler) cls.demangler_lock = Lock() + @classmethod + def set_demangler_no_lock(cls, demangler): + cls.set_base_demangler(demangler) + cls.demangler_lock = EmptyLock()#on windows we spawn demangler for each process anyway, Lock is not needed + @classmethod def demangle(cls, name): + if not cls.demangler_proc: + cls.set_demangler_no_lock(cls.default_demangler) with cls.demangler_lock: cls.demangler_proc.stdin.write((name + '\n').encode('utf-8')) cls.demangler_proc.stdin.flush()