Skip to content

Commit 7086b50

Browse files
committed
Avoid a race condition in opt-viewer/optrecord
See https://bugzilla.redhat.com/2336915 See https://reviews.llvm.org/D41784?id= See androm3da/optviewer-demo#4 (comment) Fixes #62403 The race condition happened when the demangler_proc was being set. The locking mechanism itself happened too late. This way, the lock always exists (to avoid a race when creating it) and is always used when *creating* demangler_proc. I don't have any prior experience with the codebase and I cannot guarantee the behavior is correct. It appears to get rid of the race (which I was seeing consistently). multiprocessing.pool.RemoteTraceback: """ Traceback (most recent call last): File "/usr/lib64/python3.14/multiprocessing/pool.py", line 125, in worker result = (True, func(*args, **kwds)) ~~~~^^^^^^^^^^^^^^^ File "/usr/lib64/python3.14/multiprocessing/pool.py", line 48, in mapstar return list(map(*args)) File "/builddir/build/BUILD/llvm-19.1.6-build/llvm-project-19.1.6.src/llvm/tools/opt-viewer/optpmap.py", line 25, in _wrapped_func return func(argument, filter_) File "/builddir/build/BUILD/llvm-19.1.6-build/llvm-project-19.1.6.src/llvm/tools/opt-viewer/opt-viewer.py", line 293, in _render_file SourceFileRenderer(source_dir, output_dir, filename, no_highlight).render(remarks) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^ File "/builddir/build/BUILD/llvm-19.1.6-build/llvm-project-19.1.6.src/llvm/tools/opt-viewer/opt-viewer.py", line 216, in render self.render_source_lines(self.source_stream, line_remarks) ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/builddir/build/BUILD/llvm-19.1.6-build/llvm-project-19.1.6.src/llvm/tools/opt-viewer/opt-viewer.py", line 123, in render_source_lines self.render_inline_remarks(remark, html_line) ~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^ File "/builddir/build/BUILD/llvm-19.1.6-build/llvm-project-19.1.6.src/llvm/tools/opt-viewer/opt-viewer.py", line 126, in render_inline_remarks inlining_context = r.DemangledFunctionName ^^^^^^^^^^^^^^^^^^^^^^^ File "/builddir/build/BUILD/llvm-19.1.6-build/llvm-project-19.1.6.src/llvm/tools/opt-viewer/optrecord.py", line 153, in DemangledFunctionName return self.demangle(self.Function) ~~~~~~~~~~~~~^^^^^^^^^^^^^^^ File "/builddir/build/BUILD/llvm-19.1.6-build/llvm-project-19.1.6.src/llvm/tools/opt-viewer/optrecord.py", line 77, in demangle with cls.demangler_lock: ^^^^^^^^^^^^^^^^^^ AttributeError: type object 'Passed' has no attribute 'demangler_lock'. Did you mean: 'demangler_proc'? """
1 parent bbb244c commit 7086b50

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

llvm/tools/opt-viewer/optrecord.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,17 +64,19 @@ class Remark(yaml.YAMLObject):
6464

6565
default_demangler = "c++filt -n"
6666
demangler_proc = None
67+
demangler_lock = Lock()
6768

6869
@classmethod
6970
def set_demangler(cls, demangler):
7071
cls.demangler_proc = subprocess.Popen(
7172
demangler.split(), stdin=subprocess.PIPE, stdout=subprocess.PIPE
7273
)
73-
cls.demangler_lock = Lock()
7474

7575
@classmethod
7676
def demangle(cls, name):
7777
with cls.demangler_lock:
78+
if not cls.demangler_proc:
79+
cls.set_demangler(cls.default_demangler)
7880
cls.demangler_proc.stdin.write((name + "\n").encode("utf-8"))
7981
cls.demangler_proc.stdin.flush()
8082
return cls.demangler_proc.stdout.readline().rstrip().decode("utf-8")
@@ -323,8 +325,6 @@ def get_remarks(input_file, filter_=None):
323325
def gather_results(filenames, num_jobs, should_print_progress, filter_=None):
324326
if should_print_progress:
325327
print("Reading YAML files...")
326-
if not Remark.demangler_proc:
327-
Remark.set_demangler(Remark.default_demangler)
328328
remarks = optpmap.pmap(
329329
get_remarks, filenames, num_jobs, should_print_progress, filter_
330330
)

0 commit comments

Comments
 (0)