From e3e1e4b381f00acef9ff3d9a8727a11e32b1c0d3 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Sun, 12 Mar 2017 11:18:32 -0700 Subject: [PATCH 01/32] New Cargo build system. --- Cargo.build-language | 8 +- Cargo.sublime-build | 53 - Default (Linux).sublime-keymap | 17 + Default (OSX).sublime-keymap | 17 + Default (Windows).sublime-keymap | 17 + RustEnhanced.sublime-build | 53 +- RustEnhanced.sublime-commands | 34 +- SyntaxCheckPlugin.py | 553 +- cargo_build.py | 122 + docs/build.md | 139 + rust/__init__.py | 0 rust/cargo_config.py | 367 ++ rust/cargo_settings.py | 343 ++ rust/messages.py | 576 ++ rust/opanel.py | 105 + rust/rust_proc.py | 300 + rust/rust_thread.py | 115 + rust/target_detect.py | 159 + rust/util.py | 55 + tests/README.md | 9 + ...cast-to-unsized-trait-object-suggestion.rs | 20 + tests/message-order/Cargo.lock | 4 + tests/message-order/Cargo.toml | 5 + tests/message-order/dt | 4946 +++++++++++++++++ tests/message-order/src/lib.rs | 2 + tests/message-order/src/warning1.rs | 7 + tests/message-order/src/warning2.rs | 84 + tests/multi-targets/Cargo.toml | 5 + tests/multi-targets/mystery.rs | 3 + tests/multi-targets/src/bin/bin2.rs | 4 +- tests/multi-targets/src/lib.rs | 2 + tests/multi-targets/src/main.rs | 1 + tests/rust_test_common.py | 128 + tests/slow-build/Cargo.lock | 4 + tests/slow-build/Cargo.toml | 6 + tests/slow-build/build.rs | 24 + tests/slow-build/src/lib.rs | 0 tests/test_cargo_build.py | 289 + tests/test_interrupt.py | 244 + tests/test_syntax_check.py | 132 +- tests/test_target_detect.py | 55 + 41 files changed, 8371 insertions(+), 636 deletions(-) delete mode 100644 Cargo.sublime-build create mode 100644 Default (Linux).sublime-keymap create mode 100644 Default (OSX).sublime-keymap create mode 100644 Default (Windows).sublime-keymap create mode 100644 cargo_build.py create mode 100644 docs/build.md create mode 100644 rust/__init__.py create mode 100644 rust/cargo_config.py create mode 100644 rust/cargo_settings.py create mode 100644 rust/messages.py create mode 100644 rust/opanel.py create mode 100644 rust/rust_proc.py create mode 100644 rust/rust_thread.py create mode 100644 rust/target_detect.py create mode 100644 rust/util.py create mode 100644 tests/error-tests/tests/cast-to-unsized-trait-object-suggestion.rs create mode 100644 tests/message-order/Cargo.lock create mode 100644 tests/message-order/Cargo.toml create mode 100644 tests/message-order/dt create mode 100644 tests/message-order/src/lib.rs create mode 100644 tests/message-order/src/warning1.rs create mode 100644 tests/message-order/src/warning2.rs create mode 100644 tests/rust_test_common.py create mode 100644 tests/slow-build/Cargo.lock create mode 100644 tests/slow-build/Cargo.toml create mode 100644 tests/slow-build/build.rs create mode 100644 tests/slow-build/src/lib.rs create mode 100644 tests/test_cargo_build.py create mode 100644 tests/test_interrupt.py create mode 100644 tests/test_target_detect.py diff --git a/Cargo.build-language b/Cargo.build-language index e18da478..ab1e74af 100644 --- a/Cargo.build-language +++ b/Cargo.build-language @@ -38,6 +38,12 @@ name variable.parameter + + match + ^warning: + name + variable.parameter + match ^test result: @@ -108,4 +114,4 @@ scopeName source.build_results - \ No newline at end of file + diff --git a/Cargo.sublime-build b/Cargo.sublime-build deleted file mode 100644 index cad1a66c..00000000 --- a/Cargo.sublime-build +++ /dev/null @@ -1,53 +0,0 @@ -{ - "shell_cmd": "cargo build", - "selector": "source.rust", - "file_regex": "(?|, ([^,<\n]*\\.[A-z]{2}):([0-9]+)|[ \t]*-->[ \t]*([^<\n]*):([0-9]+):([0-9]+))", - "syntax": "Cargo.build-language", - "osx": - { - "path": "~/.cargo/bin:$path", - }, - - "variants": [ - { - "shell_cmd": "cargo check", - "name": "Check" - }, - { - "shell_cmd": "cargo run", - "name": "Run" - }, - { - "shell_cmd": "cargo run --release", - "name": "Run Release" - }, - { - "shell_cmd": "cargo test", - "name": "Test" - }, - { - "shell_cmd": "cargo bench", - "name": "Bench" - }, - { - "shell_cmd": "cargo clean", - "name": "Clean" - }, - { - "shell_cmd": "cargo build --release", - "name": "Release" - }, - { - "shell_cmd": "cargo doc", - "name": "Document" - }, - { - "shell_cmd": "cargo clippy", - "name": "Clippy" - }, - { - "shell_cmd": "cargo script \"$file\"", - "name": "Script" - } - ] -} diff --git a/Default (Linux).sublime-keymap b/Default (Linux).sublime-keymap new file mode 100644 index 00000000..32aade3d --- /dev/null +++ b/Default (Linux).sublime-keymap @@ -0,0 +1,17 @@ +[ + {"keys": ["f4"], "command": "rust_next_message", "context": + [ + {"key": "selector", "operator":"equal", "operand": "source.rust"} + ] + }, + {"keys": ["shift+f4"], "command": "rust_prev_message", "context": + [ + {"key": "selector", "operator":"equal", "operand": "source.rust"} + ] + }, + {"keys": ["ctrl+break"], "command": "rust_cancel", "context": + [ + {"key": "selector", "operator":"equal", "operand": "source.rust"} + ] + }, +] diff --git a/Default (OSX).sublime-keymap b/Default (OSX).sublime-keymap new file mode 100644 index 00000000..febf8d95 --- /dev/null +++ b/Default (OSX).sublime-keymap @@ -0,0 +1,17 @@ +[ + {"keys": ["f4"], "command": "rust_next_message", "context": + [ + {"key": "selector", "operator":"equal", "operand": "source.rust"} + ] + }, + {"keys": ["shift+f4"], "command": "rust_prev_message", "context": + [ + {"key": "selector", "operator":"equal", "operand": "source.rust"} + ] + }, + {"keys": ["ctrl+c"], "command": "rust_cancel", "context": + [ + {"key": "selector", "operator":"equal", "operand": "source.rust"} + ] + }, +] diff --git a/Default (Windows).sublime-keymap b/Default (Windows).sublime-keymap new file mode 100644 index 00000000..32aade3d --- /dev/null +++ b/Default (Windows).sublime-keymap @@ -0,0 +1,17 @@ +[ + {"keys": ["f4"], "command": "rust_next_message", "context": + [ + {"key": "selector", "operator":"equal", "operand": "source.rust"} + ] + }, + {"keys": ["shift+f4"], "command": "rust_prev_message", "context": + [ + {"key": "selector", "operator":"equal", "operand": "source.rust"} + ] + }, + {"keys": ["ctrl+break"], "command": "rust_cancel", "context": + [ + {"key": "selector", "operator":"equal", "operand": "source.rust"} + ] + }, +] diff --git a/RustEnhanced.sublime-build b/RustEnhanced.sublime-build index 78b1f6a6..e24b182e 100644 --- a/RustEnhanced.sublime-build +++ b/RustEnhanced.sublime-build @@ -1,21 +1,50 @@ { - "shell_cmd": "rustc \"$file\"", + "target": "cargo_exec", "selector": "source.rust", - "file_regex": "[ \\t]*-->[ \\t]*(.*?):([0-9]+):([0-9]+)$", - "osx": - { - "path": "~/.cargo/bin:$path", - }, + "command": "build", "variants": [ { - "selector": "source.rust", - "shell_cmd": "./$file_base_name", "name": "Run", - "windows": - { - "shell_cmd": "\"$file_base_name.exe\"" + "command": "run", + }, + { + "name": "Run (with args)...", + "command": "run", + "command_info": { + "wants_run_args": true } - } + }, + { + "name": "Test", + "command": "test", + }, + { + "name": "Test (with args)...", + "command": "test", + "command_info": { + "wants_run_args": true + } + }, + { + "name": "Bench", + "command": "bench", + }, + { + "name": "Clean", + "command": "clean", + }, + { + "name": "Document", + "command": "doc", + }, + { + "name": "Clippy", + "command": "clippy", + }, + { + "name": "Script", + "command": "script", + }, ] } diff --git a/RustEnhanced.sublime-commands b/RustEnhanced.sublime-commands index 9b183e96..256ab927 100644 --- a/RustEnhanced.sublime-commands +++ b/RustEnhanced.sublime-commands @@ -1,6 +1,34 @@ [ - { - "caption": "Rust: Toggle Syntax Checking", + { + "caption": "Rust: Toggle Syntax Checking", "command": "toggle_rust_syntax_setting" - } + }, + { + "caption": "Rust: Next Message", + "command": "rust_next_message" + }, + { + "caption": "Rust: Prev Message", + "command": "rust_prev_message" + }, + { + "caption": "Rust: Cancel Build", + "command": "rust_cancel" + }, + { + "caption": "Rust: Set Cargo Target", + "command": "cargo_set_target" + }, + { + "caption": "Rust: Set Cargo Build Profile", + "command": "cargo_set_profile" + }, + { + "caption": "Rust: Set Cargo Target Triple", + "command": "cargo_set_triple" + }, + { + "caption": "Rust: Set Cargo Toolchain", + "command": "cargo_set_toolchain" + }, ] diff --git a/SyntaxCheckPlugin.py b/SyntaxCheckPlugin.py index 32a98ded..fb29a857 100755 --- a/SyntaxCheckPlugin.py +++ b/SyntaxCheckPlugin.py @@ -1,11 +1,10 @@ -import sublime, sublime_plugin -import subprocess +import sublime +import sublime_plugin import os -import html -import json -import webbrowser +from .rust import messages, rust_proc, rust_thread, util, target_detect from pprint import pprint + """On-save syntax checking. This contains the code for displaying message phantoms for errors/warnings @@ -32,482 +31,114 @@ # json. # TODO: -# - clippy support (doesn't output json afaik) -# - Some way to navigate to messages? Similar to Build next/previous. +# - clippy support + -class rustPluginSyntaxCheckEvent(sublime_plugin.EventListener): +class RustSyntaxCheckEvent(sublime_plugin.EventListener): # Beware: This gets called multiple times if the same buffer is opened in # multiple views (with the same view passed in each time). See: # https://github.com/SublimeTextIssues/Core/issues/289 - def on_post_save_async(self, view): + def on_post_save(self, view): # Are we in rust scope and is it switched on? # We use phantoms which were added in 3118 if int(sublime.version()) < 3118: return - settings = view.settings() - enabled = settings.get('rust_syntax_checking') - if enabled and "source.rust" in view.scope_name(0): - file_name = os.path.abspath(view.file_name()) - file_dir = os.path.dirname(file_name) - - view.set_status('rust-check', 'Rust syntax check running...') - # This flag is used to terminate early. In situations where we - # can't auto-detect the appropriate Cargo target, we compile - # multiple targets. If we receive any messages for the current - # view, we might as well stop. Otherwise, you risk displaying - # duplicate messages for shared modules. - self.this_view_found = False - try: - self.hide_phantoms(view.window()) - - # Keep track of regions used for highlighting, since Sublime - # requires it to be added in one shot. - # Key is view.id, value is - # {'view': view, 'regions': [(scope, region)]} - regions_by_view = {} - - for target_src, infos in self.get_rustc_messages(settings, file_name): - # print('-------------') - for info in infos: - # pprint(info) - self.add_error_phantoms(view, file_dir, info, settings, regions_by_view, target_src, {}) - if self.this_view_found: - break - - self.draw_region_highlights(regions_by_view) - finally: - view.erase_status('rust-check') - - # If the user has switched OFF the plugin, remove any phantom lines + enabled = util.get_setting('rust_syntax_checking', True) + if enabled and 'source.rust' in view.scope_name(0): + t = RustSyntaxCheckThread(view) + t.start() elif not enabled: - self.hide_phantoms(view.window()) - # print('done') - - def run_cargo(self, args, cwd): - """Args should be an array of arguments for cargo. - Returns list of dictionaries of the parsed JSON output. - """ - - # When sublime is launched from the dock in OSX, it does not have the user's environment set. So the $PATH env is reset. - # This means ~./cargo/bin won't be added (causing rustup to fail), we can manually add it back in here. [This is a hack, hopefully Sublime fixes this natively] - # fixes https://github.com/rust-lang/sublime-rust/issues/126 - env = os.environ.copy() # copy so we don't modify the current processs' environment - normalised_cargo_path = os.path.normpath("~/.cargo/bin") + (";" if os.name == "nt" else ":") - env["PATH"] = normalised_cargo_path + env["PATH"] - - cmd = ' '.join(['cargo']+args) - print('Running %r' % cmd) - # shell=True is needed to stop the window popping up, although it looks like this is needed: - # http://stackoverflow.com/questions/3390762/how-do-i-eliminate-windows-consoles-from-spawned-processes-in-python-2-7 - cproc = subprocess.Popen(cmd, cwd=cwd, - shell=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, env=env) - - output = cproc.communicate() - output = output[0].decode('utf-8') # ignore errors? - result = [] - for line in output.split('\n'): - if line == '' or line[0] != '{': - continue - result.append(json.loads(line)) - # print(output) - if not result and cproc.returncode: - print('Failed to run: %s' % cmd) - print(output) - return result - - def get_rustc_messages(self, settings, file_name): + # If the user has switched OFF the plugin, remove any phantom + # lines. + messages.clear_messages(view.window()) + + +class RustSyntaxCheckThread(rust_thread.RustThread, rust_proc.ProcListener): + + # Thread name. + name = 'Syntax Check' + # The Sublime view that triggered the check. + view = None + # Absolute path to the view that triggered the check. + triggered_file_name = None + # Directory of `triggered_file_name`. + cwd = None + # This flag is used to terminate early. In situations where we can't + # auto-detect the appropriate Cargo target, we compile multiple targets. + # If we receive any messages for the current view, we might as well stop. + # Otherwise, you risk displaying duplicate messages for shared modules. + this_view_found = False + # The path to the top-level Cargo target filename (like main.rs or + # lib.rs). + current_target_src = None + + def __init__(self, view): + self.view = view + super(RustSyntaxCheckThread, self).__init__(view.window()) + + def run(self): + self.triggered_file_name = os.path.abspath(self.view.file_name()) + self.cwd = os.path.dirname(self.triggered_file_name) + + self.view.set_status('rust-check', 'Rust syntax check running...') + self.this_view_found = False + try: + messages.clear_messages(self.window) + try: + self.get_rustc_messages() + except rust_proc.ProcessTerminatedError: + return + messages.draw_all_region_highlights(self.window) + finally: + self.view.erase_status('rust-check') + + def get_rustc_messages(self): """Top-level entry point for generating messages for the given - filename. A generator that yields (target_src_filename, infos) - tuples, where: - * target_src_filename: The name of the top-level source file of a - Cargo target. - * infos: A list of JSON dictionaries produced by Rust for that target. + filename. + + :raises rust_proc.ProcessTerminatedError: Check was canceled. """ - cwd = os.path.dirname(file_name) - targets = self.determine_targets(settings, file_name) + td = target_detect.TargetDetector(self.window) + targets = td.determine_targets(self.triggered_file_name) for (target_src, target_args) in targets: - args = ['rustc', target_args, '--', - '-Zno-trans', '-Zunstable-options', '--error-format=json'] - - if settings.get('rust_syntax_checking_include_tests', True): + cmd = ['cargo', 'rustc'] + cmd.extend(target_args) + cmd.extend(['--', '-Zno-trans', '-Zunstable-options', + '--error-format=json']) + if util.get_setting('rust_syntax_checking_include_tests', True): if not ('--test' in target_args or '--bench' in target_args): - args.append('--test') - yield (target_src, self.run_cargo(args, cwd)) - - def determine_targets(self, settings, file_name): - """Detect the target/filters needed to pass to Cargo to compile - file_name. - Returns list of (target_src_path, target_command_line_args) tuples. - """ - # Try checking for target match in settings. - result = self._targets_manual_config(settings, file_name) - if result: return result - - # Try a heuristic to detect the filename. - output = self.run_cargo(['metadata', '--no-deps'], - cwd=os.path.dirname(file_name)) - if not output: - return [] - # Each "workspace" shows up as a separate package. - for package in output[0]['packages']: - root_path = os.path.dirname(package['manifest_path']) - targets = package['targets'] - # targets is list of dictionaries: - # {'kind': ['lib'], - # 'name': 'target-name', - # 'src_path': 'path/to/lib.rs'} - # src_path may be absolute or relative, fix it. - for target in targets: - if not os.path.isabs(target['src_path']): - target['src_path'] = os.path.join(root_path, target['src_path']) - target['src_path'] = os.path.normpath(target['src_path']) - - # Try exact filename matches. - result = self._targets_exact_match(targets, file_name) - if result: return result - - # No exact match, try to find all targets with longest matching parent - # directory. - result = self._targets_longest_matches(targets, file_name) - if result: return result - - # TODO: Alternatively, could run rustc directly without cargo. - # rustc -Zno-trans -Zunstable-options --error-format=json file_name - print('Rust Enhanced: Failed to find target for %r' % file_name) - return [] - - def _targets_manual_config(self, settings, file_name): - """Check for Cargo targets in the Sublime settings.""" - # First check config for manual targets. - for project in settings.get('projects', {}).values(): - src_root = os.path.join(project.get('root', ''), 'src') - if not file_name.startswith(src_root): - continue - targets = project.get('targets', {}) - for tfile, tcmd in targets.items(): - if file_name == os.path.join(src_root, tfile): - return [(tfile, tcmd)] - else: - target = targets.get('_default', '') - if target: - # Unfortunately don't have the target src filename. - return [('', target)] - return None - - def _target_to_args(self, target): - """Convert target from Cargo metadata to Cargo command-line argument.""" - # Targets have multiple "kinds" when you specify crate-type in - # Cargo.toml, like: - # crate-type = ["rlib", "dylib"] - # - # Libraries are the only thing that support this at this time, and - # generally you only use one command-line argument to build multiple - # "kinds" (--lib in this case). - # - # Nightly beware: [[example]] that specifies crate-type will no - # longer show up as "example", making it impossible to compile. - # See https://github.com/rust-lang/cargo/pull/3556 and - # https://github.com/rust-lang/cargo/issues/3572 - # - # For now, just grab the first kind since it will always result in the - # same arguments. - kind = target['kind'][0] - if kind in ('lib', 'rlib', 'dylib', 'staticlib', 'proc-macro'): - return (target['src_path'], '--lib') - elif kind in ('bin', 'test', 'example', 'bench'): - return (target['src_path'], '--'+kind+' '+target['name']) - elif kind in ('custom-build',): - # Could wait for "cargo check" or run rustc directly on the file. - return None - else: - # Unknown kind, don't know how to build. - raise ValueError(kind) - - def _targets_exact_match(self, targets, file_name): - """Check for Cargo targets that exactly match the current file.""" - for target in targets: - if target['src_path'] == file_name: - args = self._target_to_args(target) - if args: - return [args] - return None - - def _targets_longest_matches(self, targets, file_name): - """Determine the Cargo targets that are in the same directory (or - parent) of the current file.""" - result = [] - # Find longest path match. - # TODO: This is sub-optimal, because it may result in multiple targets. - # Consider using the output of rustc --emit dep-info. - # See https://github.com/rust-lang/cargo/issues/3211 for some possible - # problems with that. - path_match = os.path.dirname(file_name) - found = False - found_lib = False - found_bin = False - while not found: - for target in targets: - if os.path.dirname(target['src_path']) == path_match: - target_args = self._target_to_args(target) - if target_args: - result.append(target_args) - found = True - if target_args[1].startswith('--bin'): - found_bin = True - if target_args[1].startswith('--lib'): - found_lib = True - p = os.path.dirname(path_match) - if p == path_match: - # Root path + cmd.append('--test') + p = rust_proc.RustProc() + self.current_target_src = target_src + p.run(self.window, cmd, self.cwd, self) + p.wait() + if self.this_view_found: break - path_match = p - # If the match is both --bin and --lib in the same directory, just do --lib. - if found_bin and found_lib: - result = [x for x in result if not x[1].startswith('--bin')] - return result - - def hide_phantoms(self, window): - for view in window.views(): - view.erase_phantoms('rust-syntax-phantom') - view.erase_regions('rust-invalid') - view.erase_regions('rust-info') - - def add_error_phantoms(self, view_of_interest, cwd, info, settings, - regions_by_view, target_src_path, parent_info): - """Add messages to Sublime views. - - - `view_of_interest`: This is the view that triggered the syntax - check. If we receive any messages for this view, then - this_view_found is set. - - `cwd`: The directory where cargo is run. - - `info`: Dictionary of messages from rustc. - - `settings`: Sublime settings. - - `regions_by_view`: Dictionary used to map view to highlight regions (see above). - - `target_src_path`: The path to the top-level Cargo target filename - (like main.rs or lib.rs). - - `parent_info`: Dictionary used for tracking "children" messages. - Includes 'view' and 'region' keys to indicate where a child message - should be displayed. - """ - window = view_of_interest.window() - error_colour = settings.get('rust_syntax_error_color', 'var(--redish)') - warning_colour = settings.get('rust_syntax_warning_color', 'var(--yellowish)') - - # Include "notes" tied to errors, even if warnings are disabled. - if (info['level'] != 'error' and - settings.get('rust_syntax_hide_warnings', False) and - not parent_info - ): - return - - # TODO: Consider matching the colors used by rustc. - # - error: red - # `bug` appears as "error: internal compiler error" - # - warning: yellow - # - note: bright green - # - help: cyan - is_error = info['level'] == 'error' - if is_error: - base_color = error_colour - else: - base_color = warning_colour - - msg_template = """ - - - {level}: {msg} {extra}\xD7 - """ % (base_color,) - - def click_handler(url): - if url == 'hide': - self.hide_phantoms(window) - else: - webbrowser.open_new(url) - - def add_message(view, region, message, extra=''): - if view == view_of_interest: - self.this_view_found = True - vid = view.id() - if vid not in regions_by_view: - regions_by_view[vid] = {'view': view, 'regions': {}} - # Unfortunately you cannot specify colors, but instead scopes as - # defined in the color theme. If the scope is not defined, then - # it will show up as foreground color. I just use "info" as an - # undefined scope (empty string will remove regions). - scope = 'invalid' if is_error else 'info' - regions_by_view[vid]['regions'].setdefault(scope, []).append(region) - - # For some reason, with LAYOUT_BELOW, if you have a multi-line - # region, the phantom is only displayed under the first line. I - # think it makes more sense for the phantom to appear below the - # last line. - start = view.rowcol(region.begin()) - end = view.rowcol(region.end()) - if start[0] != end[0]: - # Spans multiple lines, adjust to the last line. - region = sublime.Region( - view.text_point(end[0], 0), - region.end() - ) - - if info['level'] == 'error': - cls = 'rust-error' - else: - cls = 'rust-additional' - - # Rust performs some pretty-printing for things like suggestions, - # attempt to retain some of the formatting. This isn't perfect - # (doesn't line up perfectly), not sure why. - message = html.escape(message, quote=False).\ - replace('\n', '
').replace(' ', ' ') - content = msg_template.format( - cls = cls, - level = info['level'], - msg = message, - extra = extra - ) - self._add_phantom(view, - 'rust-syntax-phantom', region, - content, - sublime.LAYOUT_BELOW, - click_handler - ) - - def add_primary_message(view, region, message): - parent_info['view'] = view - parent_info['region'] = region - # Not all codes have explanations (yet). - if info['code'] and info['code']['explanation']: - # TODO - # This could potentially be a link that opens a Sublime popup, or - # a new temp buffer with the contents of 'explanation'. - # (maybe use sublime-markdown-popups) - extra = ' ?' % (info['code']['code'],) - else: - extra = '' - add_message(view, region, message, extra) - - def report_silent_message(path, message): - print('rust: %s' % path) - print('[%s]: %s' % (info['level'], message)) - if len(info['spans']) == 0: - if parent_info: - # This is extra info attached to the parent message. - add_primary_message(parent_info['view'], - parent_info['region'], - info['message']) - else: - # Messages without spans are global session messages (like "main - # function not found"). The most appropriate place for most of the - # messages is the root path (like main.rs). - # - # Some of the messages are not very interesting, though. - imsg = info['message'] - if not (imsg.startswith('aborting due to') or - imsg.startswith('cannot continue')): - view = window.find_open_file(os.path.realpath(target_src_path)) - if view: - # Place at bottom of file for lack of anywhere better. - r = sublime.Region(view.size()) - add_primary_message(view, r, imsg) - else: - report_silent_message(target_src_path, imsg) + ######################################################################### + # ProcListner methods + ######################################################################### - for span in info['spans']: - is_primary = span['is_primary'] - if 'macros>' in span['file_name']: - # Rust gives the chain of expansions for the macro, which we - # don't really care about. We want to find the site where the - # macro was invoked. - def find_span_r(span): - if 'macros>' in span['file_name']: - if span['expansion']: - return find_span_r(span['expansion']['span']) - else: - # XXX: Is this possible? - return None - else: - return span - span = find_span_r(span) - if span == None: - continue - span_path = os.path.realpath(os.path.join(cwd, span['file_name'])) - view = window.find_open_file(span_path) - if view: - # Sublime text is 0 based whilst the line/column info from - # rust is 1 based. - region = sublime.Region( - view.text_point(span['line_start'] - 1, span['column_start'] - 1), - view.text_point(span['line_end'] - 1, span['column_end'] - 1) - ) + def on_begin(self, proc): + pass - label = span['label'] - if label: - # Display the label for this Span. - add_message(view, region, label) - else: - # Some spans don't have a label. These seem to just imply - # that the main "message" is sufficient, and always seems - # to happen with the span is_primary. - if not is_primary: - # When can this happen? - pprint(info) - raise ValueError('Unexpected span with no label') - if is_primary: - # Show the overall error message. - add_primary_message(view, region, info['message']) - if span['suggested_replacement']: - # The "suggested_replacement" contains the code that - # should replace the span. However, it can be easier to - # read if you repeat the entire line (from "rendered"). - add_message(view, region, info['rendered']) - else: - # File is currently not open. - if is_primary: - report_silent_message(span['file_name'], info['message']) - if span['label']: - report_silent_message(span['file_name'], span['label']) + def on_data(self, proc, data): + pass - # Recurse into children (which typically hold notes). - for child in info['children']: - self.add_error_phantoms(view_of_interest, cwd, child, settings, regions_by_view, target_src_path, parent_info) + def on_error(self, proc, message): + print('Rust Error: %s' % message) - def draw_region_highlights(self, regions_by_view): - for d in regions_by_view.values(): - view = d['view'] - for scope, regions in d['regions'].items(): - # Is DRAW_EMPTY necessary? Is it possible to have a zero-length span? - self._add_regions(view, 'rust-%s' % scope, regions, scope, '', - sublime.DRAW_NO_FILL|sublime.DRAW_EMPTY) + def on_json(self, proc, obj): + messages.add_rust_messages(self.window, self.cwd, obj, + self.current_target_src, msg_cb=None) + if messages.has_message_for_path(self.window, + self.triggered_file_name): + self.this_view_found = True - def _add_phantom(self, view, key, region, content, layout, on_navigate): - """Pulled out to assist testing.""" - view.add_phantom( - key, region, - content, - layout, - on_navigate - ) + def on_finished(self, proc, rc): + pass - def _add_regions(self, view, key, regions, scope, icon, flags): - """Pulled out to assist testing.""" - view.add_regions(key, regions, scope, icon, flags) + def on_terminated(self, proc): + pass diff --git a/cargo_build.py b/cargo_build.py new file mode 100644 index 00000000..0556a508 --- /dev/null +++ b/cargo_build.py @@ -0,0 +1,122 @@ +"""Sublime commands for the cargo build system.""" + +import sublime +import sublime_plugin +from .rust import (rust_proc, rust_thread, opanel, util, messages, + cargo_settings) +from .rust.cargo_config import * + +# Maps command to an input string. Used to pre-populate the input panel with +# the last entered value. +LAST_EXTRA_ARGS = {} + + +class CargoExecCommand(sublime_plugin.WindowCommand): + + """cargo_exec Sublime command. + + This takes the following arguments: + + - `command`: The command to run. Commands are defined in the + `cargo_settings` module. You can define your own custom command by + passing in `command_info`. + - `command_info`: Dictionary of values the defines how the cargo command + is constructed. See `command_settings.CARGO_COMMANDS`. + - `settings`: Dictionary of settings overriding anything set in the + Sublime project settings (see `command_settings`). + """ + + def run(self, command=None, command_info=None, settings=None): + self.command_info = cargo_settings.CARGO_COMMANDS\ + .get(command, {}).copy() + if command_info: + self.command_info.update(command_info) + self.initial_settings = settings if settings else {} + if self.command_info.get('wants_run_args', False) and \ + 'extra_run_args' not in self.initial_settings: + self.window.show_input_panel('Enter extra args:', + LAST_EXTRA_ARGS.get(command, ''), + self._on_extra_args, None, None) + else: + self._run() + + def _on_extra_args(self, args): + LAST_EXTRA_ARGS[self.command_info['command']] = args + self.initial_settings['extra_run_args'] = args + self._run() + + def _run(self): + t = CargoExecThread(self.window, + self.command_info, self.initial_settings) + t.start() + + +class CargoExecThread(rust_thread.RustThread): + + silently_interruptible = False + name = 'Cargo Exec' + + def __init__(self, window, command_info, initial_settings): + super(CargoExecThread, self).__init__(window) + self.command_info = command_info + self.initial_settings = initial_settings + + def run(self): + self.settings = cargo_settings.CargoSettings(self.window) + try: + self.settings.load() + except cargo_settings.LoadSettingsError: + return + cmd = self.settings.get_command(self.command_info, + self.initial_settings) + if not cmd: + return + messages.clear_messages(self.window) + p = rust_proc.RustProc() + listener = opanel.OutputListener(self.window, + self.settings.manifest_dir) + try: + p.run(self.window, cmd, self.settings.manifest_dir, listener) + p.wait() + except rust_proc.ProcessTerminatedError: + return + + +class CargoEventListener(sublime_plugin.EventListener): + + """Every time a new file is loaded, check if is a Rust file with messages, + and if so, display the messages. + """ + + def on_load(self, view): + if 'source.rust' in view.scope_name(0): + # For some reason, view.window() returns None here. + # Use set_timeout to give it time to attach to a window. + sublime.set_timeout( + lambda: messages.show_messages_for_view(view), 1) + + +class RustNextMessageCommand(sublime_plugin.WindowCommand): + + def run(self, levels='all'): + messages.show_next_message(self.window, levels) + + +class RustPrevMessageCommand(sublime_plugin.WindowCommand): + + def run(self, levels='all'): + messages.show_prev_message(self.window, levels) + + +class RustCancelCommand(sublime_plugin.WindowCommand): + + def run(self): + try: + t = rust_thread.THREADS[self.window.id()] + except KeyError: + pass + else: + t.terminate() + # Also call Sublime's cancel command, in case the user is using a + # normal Sublime build. + self.window.run_command('cancel_build') diff --git a/docs/build.md b/docs/build.md new file mode 100644 index 00000000..5380a74c --- /dev/null +++ b/docs/build.md @@ -0,0 +1,139 @@ +# Cargo Build System + +The Rust Enhanced build system provides an interface for running Cargo. It can +show inline warning and error messages. It also has a variety of ways of +configuring options for how Cargo is run. + +## Usage + +When Sublime is set to use "Automatic" build system detection, it will choose +the build system based on the syntax of the currently active view. If you +want to ensure the Rust Enhanced build system is used regardless of which file +is open, choose it via `Tools > Build System > RustEnhanced`. + +The basic Sublime commands available are: + +Command | Keyboard | Menu | Description +------- | -------- | ---- | ----------- +Build | Ctrl-B / ⌘-B | Tools > Build | Runs the currently active build variant. +Build With... | Ctrl-Shift-B / ⌘-Shift-B | Tools > Build With... | Choose the build variant. +Cancel Build | Ctrl-Break / Ctrl-C | Tools > Cancel Build | Abort the currently running build. +Show Build Results | | Tools > Build Results > Show Build Results | Opens the output panel with build results. +Next Result | F4 | Tools > Build Results > Next Result | Go to the next warning/error message. +Previous Result | Shift-F4 | Tools > Build Results > Previous Result | Go to the previous warning/error message. + +## Build Variants + +When you select the RustEnhanced build system in Sublime, there are a few +variants that you can select with Tools > Build With... ( +Ctrl-Shift-B / ⌘-Shift-B). They are: + +Variant | Command | Description +------- | ------- | ----------- +(Default) | cargo build | Builds the project. +Run | cargo run | Runs the binary. +Run (with args)... | cargo run -- *args* | Runs the binary with optional arguments you specify. +Test | cargo test | Runs unit and integration tests. +Test (with args)... | cargo test -- *args* | Runs the test with optional arguments you specify. +Bench | cargo bench | Runs benchmarks. +Clean | cargo clean | Removes all built files. +Document | cargo doc | Builds package documentation. +Clippy | cargo clippy | Runs [Clippy](https://github.com/Manishearth/rust-clippy). Clippy must be installed, and currently requires the nightly toolchain. +Script | cargo script $path | Runs [Cargo Script](https://github.com/DanielKeep/cargo-script). Cargo Script must be installed. This is an addon that allows you to run a Rust source file like a script (without a Cargo.toml manifest). + +## Cargo Project Settings + +You can customize how Cargo is run with settings stored in your +`sublime-project` file. Settings can be applied per-target (`--lib`, +`--example foo`, etc.), for specific variants ("Build", "Run", "Test", etc.), +or globally. + +### Setting Commands + +There are several Sublime commands to help you configure the Cargo settings. +They can be accessed from the Command Palette (Ctrl-Shift-P / ⌘-Shift-P). They +are: + +Command | Description +------- | ----------- +Rust: Set Cargo Target | Set the Cargo target (`--lib`, `--example foo`, etc.) for each build variant. The "Automatic Detection" option will attempt to determine which target to use based on the current active view in Sublime (a test file will use `--test` or a binary will use `--bin`, etc.). +Rust: Set Cargo Build Profile | Set whether or not to use the `--release` flag. +Rust: Set Cargo Target Triple | Set the target triple (such as `x86_64-apple-darwin`). +Rust: Set Cargo Toolchain | Set the Rust toolchain to use (`nightly`, `beta`, etc.). Use the Targets > "All Targets" to set globally. + +Caution: If you have not created a `sublime-project` file, then any changes +you make will be lost if you close the Sublime window. + +### Settings + +Settings are stored in your `sublime-project` file under the `"settings"` key. +Settings are organized per Cargo package. The top-level keys for each package are: + +Key | Description +--- | ----------- +`"defaults"` | Default settings used if not set per target or variant. +`"targets"` | Settings per target. +`"variants"` | Settings per build variant. + +An example of a `sublime-project` file: + +```json +{ + "folders": [ + { "path": "." } + ], + "settings": { + "cargo_build": { + "paths": { + "path/to/package": { + "defaults": { + "release": true + }, + "targets": { + "--example ex1": { + "extra_run_args": "-f file" + } + }, + "variants": { + "bench": { + "toolchain": "nightly" + }, + "clippy": { + "toolchain": "nightly" + } + } + } + } + } + } +} +``` + +The available settings are: + +Setting Name | Description +------------ | ----------- +`release` | If true, uses the `--release` flag. +`target_triple` | If set, uses the `--target` flag with the given value. +`toolchain` | The Rust toolchain to use (such as `nightly` or `beta`). +`target` | The Cargo target (such as `"--bin myprog"`). Applies to `variants` only. Can be `"auto"` (see "Set Cargo Target" above). +`extra_cargo_args` | Extra arguments passed to Cargo (before the `--` flags separator). +`extra_run_args` | Extra arguments passed to Cargo (after the `--` flags separator). + +The extra args settings support standard Sublime variable expansion (see +[Build System +Variables](http://docs.sublimetext.info/en/latest/reference/build_systems/configuration.html#build-system-variables)) + +## Multiple Cargo Projects (Advanced) + +You can have multiple Cargo projects in a single Sublime project (such as when +using Cargo workspaces, or if you simply have multiple projects in different +folders). + +If you have multiple Cargo projects in your Sublime window, the build system +will use the currently active view to attempt to determine which project to +build. + +## Custom Variants (Advanced) + +TODO diff --git a/rust/__init__.py b/rust/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/rust/cargo_config.py b/rust/cargo_config.py new file mode 100644 index 00000000..735d8092 --- /dev/null +++ b/rust/cargo_config.py @@ -0,0 +1,367 @@ +"""Sublime commands for configuring Cargo execution. + +See `cargo_settings` for more details on how settings work. +""" + +import os +import re +import sublime_plugin +from .cargo_settings import CargoSettings, CARGO_COMMANDS, LoadSettingsError +from .util import index_with +from . import rust_proc + +# Keep track of recent choices to set the default value. +RECENT_CHOICES = {} + + +class CargoConfigBase(sublime_plugin.WindowCommand): + + """Base class for cargo config commands. + + This implements a simple interactive UI by asking the user a series of + questions using the Sublime quick panels for selecting choices. Subclasses + set the `sequence` class variable to the list of questions they want to + ask. The choices for each question are produced by methods starting with + 'items_'+name. These methods should return a dictionary with: + + - `items`: List of choices. Each element should be a tuple + `(display_string, value)`. + - `default`: The default value (optional). + - `skip_if_one`: Skip this question if there is only 1 item. + + `items_` methods can also just return the 'items' list. + + An optional method `selected_`+name will be called when a choice is made. + This method can return a list of questions to be asked. + + The `done` method is called once all questions have been asked. + + Callers are allowed to pass in values instead of using the interactive UI. + This is probably only useful for the test code, but in theory you could + define key bindings that perform certain actions. + """ + + # CargoSettings object. + settings = None + # Dictionary of choices passed into the command, instead of using + # interactive UI. + input = None + + # Sequence of questions to ask. + sequence = None + # Current question being asked. + sequence_index = 0 + # Dictionary of selections made during the interactive process. + choices = None + + def run(self, **kwargs): + self.sequence_index = 0 + # Copy, since WindowCommand reuses objects. + self._sequence = self.sequence[:] + self.input = kwargs + self.settings = CargoSettings(self.window) + try: + self.settings.load() + except LoadSettingsError: + return + self.choices = {} + self.show_next_question() + + def done(self): + """Called once all questions have been asked. Subclasses must + implement this.""" + raise NotImplementedError() + + def show_next_question(self): + if self.sequence_index < len(self._sequence): + q = self._sequence[self.sequence_index] + self.sequence_index += 1 + else: + self.done() + return + + item_info = getattr(self, 'items_' + q)() + if not isinstance(item_info, dict): + item_info = {'items': item_info} + items = item_info['items'] + f_selected = getattr(self, 'selected_' + q, None) + + def make_choice(value): + self.choices[q] = value + if f_selected: + next = f_selected(value) + if next: + self._sequence.extend(next) + self.show_next_question() + + def wrapper(index): + if index != -1: + chosen = items[index][1] + RECENT_CHOICES[q] = chosen + make_choice(chosen) + + if q in self.input: + make_choice(self.input[q]) + elif item_info.get('skip_if_one', False) and len(items) == 1: + wrapper(0) + else: + # If the user manually edits the config and enters custom values + # then it won't show up in the list (because it is not an exact + # match). Add it so that it is a valid choice (assuming the user + # entered a valid value). + if 'default' in item_info: + default_index = index_with(items, + lambda x: x[1] == item_info['default']) + if default_index == -1: + items.append((item_info['default'], item_info['default'])) + # Determine the default selection. + # Use the default provided by the items_ method, else + # use the most recently used value. + default = index_with(items, + lambda x: x[1] == item_info.get('default', + RECENT_CHOICES.get(q, '_NO_DEFAULT_SENTINEL_'))) + display_items = [x[0] for x in items] + self.window.show_quick_panel(display_items, wrapper, 0, default) + + def items_package(self): + # path/to/package: package_info + self.packages = {} + + def _add_manifest(path): + manifest = self.settings.get_cargo_metadata(path) + if manifest: + for package in manifest['packages']: + manifest_dir = os.path.dirname(package['manifest_path']) + if manifest_dir not in self.packages: + self.packages[manifest_dir] = package + else: + # Manifest load failure, let it slide. + print('Failed to load Cargo manifest in %r' % path) + + _add_manifest(self.settings.manifest_dir) + skeys = self.settings.project_data.get('settings', {})\ + .get('cargo_build', {})\ + .get('paths', {}).keys() + for path in skeys: + if path not in self.packages: + _add_manifest(path) + + items = [('Package:' + package['name'], path) + for path, package in self.packages.items()] + items.sort(key=lambda x: x[0]) + return { + 'items': items, + 'skip_if_one': True + } + + def items_target(self): + # Group by kind. + kinds = {} + package_path = self.choices['package'] + for target in self.packages[package_path]['targets']: + # AFAIK, when there are multiple "kind" values, this only happens + # when there are multiple library kinds. + kind = target['kind'][0] + if kind in ('lib', 'rlib', 'dylib', 'staticlib', 'proc-macro'): + kinds.setdefault('lib', []).append(('Lib', '--lib')) + elif kind in ('bin', 'test', 'example', 'bench'): + text = '%s: %s' % (kind.capitalize(), target['name']) + arg = '--%s %s' % (kind, target['name']) + kinds.setdefault(kind, []).append((text, arg)) + elif kind in ('custom-build',): + # build.rs, can't be built explicitly. + pass + else: + print('Rust: Unsupported target found: %s' % kind) + items = [('All Targets', None), + ('Automatic Detection', 'auto')] + for kind, values in kinds.items(): + allowed = True + if self.choices.get('variant', None): + cmd = CARGO_COMMANDS[self.choices['variant']] + target_types = cmd['allows_target'] + if target_types is not True: + allowed = kind in target_types + if allowed: + items.extend(values) + return items + + def items_variant(self): + result = [] + for key, info in CARGO_COMMANDS.items(): + if self.filter_variant(info): + result.append((info['name'], key)) + return result + + def filter_variant(self, x): + return True + + +class CargoSetProfile(CargoConfigBase): + + sequence = ['package', 'target', 'profile'] + + def items_profile(self): + default = self.settings.get_with_target(self.choices['package'], + self.choices['target'], + 'release', False) + if default: + default = 'release' + else: + default = 'dev' + items = [('Dev', 'dev'), + ('Release', 'release')] + return {'items': items, + 'default': default} + + def done(self): + self.settings.set_with_target(self.choices['package'], + self.choices['target'], + 'release', + self.choices['profile'] == 'release') + + +class CargoSetTarget(CargoConfigBase): + + sequence = ['variant', 'package', 'target'] + + def filter_variant(self, info): + return info.get('allows_target', False) + + def items_target(self): + items = super(CargoSetTarget, self).items_target() + default = self.settings.get_with_variant(self.choices['package'], + self.choices['variant'], + 'target') + return { + 'items': items, + 'default': default + } + + def done(self): + self.settings.set_with_variant(self.choices['package'], + self.choices['variant'], + 'target', + self.choices['target']) + + +class CargoSetTriple(CargoConfigBase): + + sequence = ['package', 'target', 'target_triple'] + + def items_target_triple(self): + # Could check if rustup is not installed, to run + # "rustc --print target-list", but that does not tell + # us which targets are installed. + triples = rust_proc.check_output(self.window, + 'rustup target list'.split(), self.settings.manifest_dir)\ + .splitlines() + current = self.settings.get_with_target(self.choices['package'], + self.choices['target'], + 'target_triple') + result = [('Use Default', None)] + for triple in triples: + if triple.endswith(' (default)'): + actual_triple = triple[:-10] + result.append((actual_triple, actual_triple)) + elif triple.endswith(' (installed)'): + actual_triple = triple[:-12] + result.append((actual_triple, actual_triple)) + else: + actual_triple = None + # Don't bother listing uninstalled targets. + return { + 'items': result, + 'default': current + } + + def done(self): + self.settings.set_with_target(self.choices['package'], + self.choices['target'], + 'target_triple', + self.choices['target_triple']) + + +class CargoSetToolchain(CargoConfigBase): + + sequence = ['which'] + + def items_which(self): + return [ + ('Set Toolchain for Build Variant', 'variant'), + ('Set Toolchain for Targets', 'target') + ] + + def selected_which(self, which): + if which == 'variant': + return ['package', 'variant', 'toolchain'] + elif which == 'target': + return ['package', 'target', 'toolchain'] + else: + raise AssertionError(which) + + def items_toolchain(self): + items = [('Use Default Toolchain', None)] + toolchains = self._toolchain_list() + if self.choices['which'] == 'variant': + current = self.settings.get_with_variant(self.choices['package'], + self.choices['variant'], + 'toolchain') + elif self.choices['which'] == 'target': + current = self.settings.get_with_target(self.choices['package'], + self.choices['target'], + 'toolchain') + else: + raise AssertionError(self.choices['which']) + items.extend([(x, x) for x in toolchains]) + return { + 'items': items, + 'default': current + } + + def _toolchain_list(self): + output = rust_proc.check_output(self.window, + 'rustup toolchain list'.split(), + self.settings.manifest_dir) + output = output.splitlines() + system_default = index_with(output, lambda x: x.endswith(' (default)')) + if system_default != -1: + output[system_default] = output[system_default][:-10] + # Rustup supports some shorthand of either `channel` or `channel-date` + # without the trailing target info. + # + # Complete list of available toolchains is available at: + # https://static.rust-lang.org/dist/index.html + # (See https://github.com/rust-lang-nursery/rustup.rs/issues/215) + shorthands = [] + channels = ['nightly', 'beta', 'stable', '\d\.\d{1,2}\.\d'] + pattern = '(%s)(?:-(\d{4}-\d{2}-\d{2}))?(?:-(.*))' % '|'.join(channels) + for toolchain in output: + m = re.match(pattern, toolchain) + # Should always match. + if m: + channel = m.group(1) + date = m.group(2) + if date: + shorthand = '%s-%s' % (channel, date) + else: + shorthand = channel + if shorthand not in shorthands: + shorthands.append(shorthand) + result = shorthands + output + result.sort() + return result + + def done(self): + if self.choices['which'] == 'variant': + self.settings.set_with_variant(self.choices['package'], + self.choices['variant'], + 'toolchain', + self.choices['toolchain']) + elif self.choices['which'] == 'target': + self.settings.set_with_target(self.choices['package'], + self.choices['target'], + 'toolchain', + self.choices['toolchain']) + else: + raise AssertionError(self.choices['which']) diff --git a/rust/cargo_settings.py b/rust/cargo_settings.py new file mode 100644 index 00000000..4d8f811e --- /dev/null +++ b/rust/cargo_settings.py @@ -0,0 +1,343 @@ +"""Interface for accessing Cargo settings (stored in the sublime-project +file). + +These are used by the build system to determine how to run Cargo. + +Cargo Info +========== +When the `cargo_exec` Sublime command is run, you pass in a named command to +run. There is a default set of commands defined here in CARGO_COMMANDS (users +can create custom commands and pass them in with `command_info`). A command +has the following values that are used for figuring out how to construct the +command: + +- `name`: Human-readable name of the command (required). +- `command`: The command to pass to cargo (required). +- `allows_target`: If True, the command accepts cargo filters for determining + which target to build ("--lib", "--bin foo", "--example bar", etc.). Can + also be a sequence of strings like `('bin', 'example')` to specify a subset + of targets it supports. +- `allows_target_triple`: If True, the command accepts triples like + "--target x86_64-apple-darwin". +- `allows_release`: If True, allows "--release" flag. +- `allows_features`: If True, allows feature flags. +- `allows_json`: If True, allows "--message-format=json" flag. +- `wants_view_path`: If True, then the active view must be a Rust source file, + and the path to that file will be passed into Cargo (used mainly by "cargo + script"). +- `wants_run_args`: If True, `cargo_exec` will ask for extra args to pass to + the executable (after the `--` flag separator). + +Project Settings +================ +Settings can be stored (under the "cargo_build" key) to alter how cargo is +run. See `docs/build.md` for a description. + +""" + +import sublime +import os +import shlex +from . import util, rust_proc, target_detect + +CARGO_COMMANDS = { + 'build': { + 'name': 'Build', + 'command': 'build', + 'allows_target': True, + 'allows_target_triple': True, + 'allows_release': True, + 'allows_features': True, + 'allows_json': True, + }, + 'run': { + 'name': 'Run', + 'command': 'run', + 'allows_target': ('bin', 'example'), + 'allows_target_triple': True, + 'allows_release': True, + 'allows_features': True, + 'allows_json': True, + }, + 'test': { + 'name': 'Test', + 'command': 'test', + 'allows_target': True, + 'allows_target_triple': True, + 'allows_release': True, + 'allows_features': True, + 'allows_json': True, + }, + 'bench': { + 'name': 'Bench', + 'command': 'bench', + 'allows_target': True, + 'allows_target_triple': True, + 'allows_release': False, + 'allows_features': True, + 'allows_json': True, + }, + 'clean': { + 'name': 'Clean', + 'command': 'clean', + }, + 'doc': { + 'name': 'Doc', + 'command': 'doc', + 'allows_target': ['lib', 'bin'], + 'allows_target_triple': True, + 'allows_release': True, + 'allows_features': True, + 'allows_json': False, + }, + 'clippy': { + 'name': 'Clippy', + 'command': 'clippy', + 'allows_target': False, + 'allows_target_triple': True, + 'allows_release': True, + 'allows_features': True, + 'allows_json': True, + }, + 'script': { + 'name': 'Script', + 'command': 'script', + 'allows_target': False, + 'allows_target_triple': False, + 'allows_release': False, + 'allows_features': False, + 'allows_json': False, + 'wants_view_path': True, + }, +} + + +class LoadSettingsError(Exception): + """Failed to load build settings.""" + + +class CargoSettings(object): + + """Interface to Cargo project settings stored in `sublime-project` + file.""" + + # Sublime window. + window = None + # Directory where Cargo.toml manifest was found. + manifest_dir = None + # Version of `manifest_dir` with Cargo.toml on the end. + manifest_path = None + # Data in the sublime project file. Empty dictionary if nothing is set. + project_data = None + + def __init__(self, window): + self.window = window + + def load(self): + self.project_data = self.window.project_data() + if self.project_data is None: + # Window does not have a Sublime project. + self.project_data = {} + + cwd = self._determine_working_directory() + if not cwd or not self._find_cargo_manifest(cwd): + sublime.error_message(util.multiline_fix(""" + Error: Cannot determine Rust package to use. + + Open a Rust file to determine which package to use.""")) + raise LoadSettingsError() + + if self.window.project_file_name() is None: + # XXX: Better way to display a warning? Is + # sublime.error_message() reasonable? + print(util.multiline_fix(""" + Rust Enhanced Warning: This window does not have an associated sublime-project file. + Any changes to the Cargo build settings will be lost if you close the window.""")) + + def get_with_target(self, path, target, key, default=None): + pdata = self.project_data.get('settings', {})\ + .get('cargo_build', {})\ + .get('paths', {})\ + .get(path, {}) + if target: + d = pdata.get('targets', {}).get(target, {}) + else: + d = pdata.get('defaults', {}) + return d.get(key, default) + + def get_with_variant(self, path, variant, key, default=None): + vdata = self.project_data.get('settings', {})\ + .get('cargo_build', {})\ + .get('paths', {})\ + .get(path, {})\ + .get('variants', {})\ + .get(variant, {}) + return vdata.get(key, default) + + def set_with_target(self, path, target, key, value): + pdata = self.project_data.setdefault('settings', {})\ + .setdefault('cargo_build', {})\ + .setdefault('paths', {})\ + .setdefault(path, {}) + if target: + d = pdata.setdefault('targets', {}).setdefault(target, {}) + else: + d = pdata.setdefault('defaults', {}) + d[key] = value + self.window.set_project_data(self.project_data) + + def set_with_variant(self, path, variant, key, value): + vdata = self.project_data.setdefault('settings', {})\ + .setdefault('cargo_build', {})\ + .setdefault('paths', {})\ + .setdefault(path, {})\ + .setdefault('variants', {})\ + .setdefault(variant, {}) + vdata[key] = value + self.window.set_project_data(self.project_data) + + def _determine_working_directory(self): + working_dir = None + view = self.window.active_view() + if view and view.file_name(): + working_dir = os.path.dirname(view.file_name()) + else: + folders = self.window.folders() + if folders: + working_dir = folders[0] + if working_dir is None or not os.path.exists(working_dir): + return None + else: + return working_dir + + def _find_cargo_manifest(self, cwd): + while True: + path = os.path.join(cwd, 'Cargo.toml') + if os.path.exists(path): + self.manifest_dir = cwd + self.manifest_path = path + return True + parent = os.path.dirname(cwd) + if parent == cwd: + return False + cwd = parent + + def _active_view_is_rust(self): + view = self.window.active_view() + if not view: + return False + return 'source.rust' in view.scope_name(0) + + def get_cargo_metadata(self, cwd): + """Load Cargo metadata. + + :returns: Dictionary from Cargo: + - packages: List of packages: + - name + - manifest_path: Path to Cargo.toml. + - targets: List of target dictionaries: + - name: Name of target. + - src_path: Path of top-level source file. May be a + relative path. + - kind: List of kinds. May contain multiple entries if + `crate-type` specifies multiple values in Cargo.toml. + Lots of different types of values: + - Libraries: 'lib', 'rlib', 'dylib', 'staticlib', + 'proc-macro' + - Executables: 'bin', 'test', 'example', 'bench' + - build.rs: 'custom-build' + + """ + return rust_proc.slurp_json(self.window, + 'cargo metadata --no-deps'.split(), + cwd=cwd)[0] + + def get_command(self, cmd_info, initial_settings={}): + """Generates the command arguments for running Cargo.""" + command = cmd_info['command'] + result = ['cargo'] + pdata = self.project_data.get('settings', {})\ + .get('cargo_build', {})\ + .get('paths', {})\ + .get(self.manifest_dir, {}) + vdata = pdata.get('variants', {})\ + .get(command, {}) + + def vdata_get(key, default=None): + return initial_settings.get(key, vdata.get(key, default)) + + # Target + target = None + if cmd_info.get('allows_target', False): + tcfg = vdata_get('target') + if tcfg == 'auto': + # If this fails, leave target as None and let Cargo sort it + # out (it may display an error). + if self._active_view_is_rust(): + td = target_detect.TargetDetector(self.window) + view = self.window.active_view() + targets = td.determine_targets(view.file_name()) + if len(targets) == 1: + src_path, cmd_line = targets[0] + target = ' '.join(cmd_line) + else: + target = tcfg + + def get(key, default=None): + d = pdata.get('defaults', {}).get(key, default) + v_val = vdata.get(key, d) + t_val = pdata.get('targets', {}).get(target, {}).get(key, v_val) + return initial_settings.get(key, t_val) + + toolchain = get('toolchain', None) + if toolchain: + result.append('+' + toolchain) + + # Command to run. + result.append(cmd_info['command']) + + # Default target. + if target: + result.extend(target.split()) + + # target_triple + if cmd_info.get('allows_target_triple', False): + v = get('target_triple', None) + if v: + result.extend(['--target', v]) + + # release (profile) + if cmd_info.get('allows_release', False): + v = get('release', False) + if v: + result.append('--release') + + if cmd_info.get('allows_json'): + result.append('--message-format=json') + + # Add path from current active view (mainly for "cargo script"). + if cmd_info.get('wants_view_path', False): + if not self._active_view_is_rust(): + sublime.error_message(util.multiline_fix(""" + Cargo build command %r requires the current view to be a Rust source file.""" % command)) + return None + path = self.window.active_view().file_name() + result.append(path) + + def expand(s): + return sublime.expand_variables(s, + self.window.extract_variables()) + + # Extra args. + extra_cargo_args = get('extra_cargo_args') + if extra_cargo_args: + extra_cargo_args = expand(extra_cargo_args) + result.extend(shlex.split(extra_cargo_args)) + + extra_run_args = get('extra_run_args') + if extra_run_args: + extra_run_args = expand(extra_run_args) + result.append('--') + result.extend(shlex.split(extra_run_args)) + + return result diff --git a/rust/messages.py b/rust/messages.py new file mode 100644 index 00000000..32b1df96 --- /dev/null +++ b/rust/messages.py @@ -0,0 +1,576 @@ +"""Module for storing/displaying Rust compiler messages.""" + +import sublime + +import collections +import html +import itertools +import os +import webbrowser +from pprint import pprint + +from . import util + +# Key is window id. +# Value is a dictionary: { +# 'paths': {path: [msg_dict,...]}, +# 'msg_index': (path_idx, message_idx) +# } +# `path` is the absolute path to the file. +# Each msg_dict has the following: +# - `level` +# - `span` +# - `is_main` +# - `message` +WINDOW_MESSAGES = {} + + +def clear_messages(window): + WINDOW_MESSAGES.pop(window.id(), None) + for view in window.views(): + view.erase_phantoms('rust-syntax-phantom') + view.erase_regions('rust-invalid') + view.erase_regions('rust-info') + + +def add_message(window, path, level, span, is_main, message): + """Add a message to be displayed. + + :param window: The Sublime window. + :param path: The absolute path of the file to show the message for. + :param level: The Rust message level ('error', 'note', etc.). + :param span: Location of the message (0-based): + `((line_start, col_start), (line_end, col_end))` + May be `None` to indicate no particular spot. + :param is_main: If True, this is a top-level message. False is used for + attached detailed diagnostic information, child notes, etc. + :param message: The message to display. + """ + wid = window.id() + try: + messages_by_path = WINDOW_MESSAGES[wid]['paths'] + except KeyError: + messages_by_path = collections.OrderedDict() + WINDOW_MESSAGES[wid] = { + 'paths': messages_by_path, + 'msg_index': (-1, -1) + } + messages = messages_by_path.setdefault(path, []) + messages.append({ + 'level': level, + 'span': span, + 'is_main': is_main, + 'message': message, + }) + view = window.find_open_file(path) + if view: + _show_phantom(view, level, span, message) + + +def has_message_for_path(window, path): + paths = WINDOW_MESSAGES.get(window.id(), {}).get('paths', {}) + return path in paths + + +def draw_all_region_highlights(window): + """Drawing region outlines must be deferred until all the messages have + been received since Sublime does not have an API to incrementally add + them.""" + paths = WINDOW_MESSAGES.get(window.id(), {}).get('paths', {}) + for path, messages in paths.items(): + view = window.find_open_file(path) + if view: + _draw_region_highlights(view, messages) + + +def _draw_region_highlights(view, messages): + error_regions = [] + info_regions = [] + error_region_set = set() + for message in messages: + region = _span_to_region(view, message['span']) + if message['level'] == 'error': + error_regions.append(region) + error_region_set.add((region.a, region.b)) + else: + info_regions.append(region) + # Filter out identical info regions. + info_regions = list(filter(lambda x: (x.a, x.b) not in error_region_set, + info_regions)) + + # Unfortunately you cannot specify colors, but instead scopes as + # defined in the color theme. If the scope is not defined, then it + # will show up as foreground color (white in dark themes). I just use + # "info" as an undefined scope (empty string will remove regions). + # "invalid" will typically show up as red. + + # Is DRAW_EMPTY necessary? Is it possible to have a zero-length span? + _sublime_add_regions( + view, 'rust-error', error_regions, 'invalid', '', + sublime.DRAW_NO_FILL | sublime.DRAW_EMPTY) + _sublime_add_regions( + view, 'rust-info', info_regions, 'info', '', + sublime.DRAW_NO_FILL | sublime.DRAW_EMPTY) + + +def _show_phantom(view, level, span, message): + region = _span_to_region(view, span) + # For some reason, with LAYOUT_BELOW, if you have a multi-line + # region, the phantom is only displayed under the first line. I + # think it makes more sense for the phantom to appear below the + # last line. + start = view.rowcol(region.begin()) + end = view.rowcol(region.end()) + if start[0] != end[0]: + # Spans multiple lines, adjust to the last line. + region = sublime.Region( + view.text_point(end[0], 0), + region.end() + ) + + def click_handler(url): + if url == 'hide': + clear_messages(view.window()) + else: + webbrowser.open_new(url) + + _sublime_add_phantom( + view, + 'rust-syntax-phantom', region, + message, + sublime.LAYOUT_BELOW, + click_handler + ) + + +def _span_to_region(view, span): + if span: + return sublime.Region( + view.text_point(span[0][0], span[0][1]), + view.text_point(span[1][0], span[1][1]) + ) + else: + # Place at bottom of file for lack of anywhere better. + return sublime.Region(view.size()) + + +def _sublime_add_phantom(view, key, region, content, layout, on_navigate): + """Pulled out to assist testing.""" + view.add_phantom( + key, region, + content, + layout, + on_navigate + ) + + +def _sublime_add_regions(view, key, regions, scope, icon, flags): + """Pulled out to assist testing.""" + view.add_regions(key, regions, scope, icon, flags) + + +def show_next_message(window, levels): + current_idx = _advance_next_message(window, levels) + _show_message(window, levels, current_idx) + + +def show_prev_message(window, levels): + current_idx = _advance_prev_message(window, levels) + _show_message(window, levels, current_idx) + + +def _show_message(window, levels, current_idx): + if current_idx is None: + return + try: + window_info = WINDOW_MESSAGES[window.id()] + except KeyError: + return + paths = window_info['paths'] + path, messages = _ith_iter_item(paths.items(), current_idx[0]) + view = window.find_open_file(path) + if view: + _scroll_to_message(view, messages, current_idx) + else: + # show_at_center is buggy with newly opened views (see + # https://github.com/SublimeTextIssues/Core/issues/538). + # ENCODED_POSITION is 1-based. + msg = messages[current_idx[1]] + row, col = msg['span'][0] + view = window.open_file('%s:%d:%d' % (path, row + 1, col + 1), + sublime.ENCODED_POSITION) + _show_message_wait(view, levels, messages, current_idx) + + +def _show_message_wait(view, levels, messages, current_idx): + if view.is_loading(): + def f(): + _show_message_wait(view, levels, messages, current_idx) + sublime.set_timeout(f, 10) + # The on_load event handler will call show_messages_for_view which + # should handle displaying the messages. + + +def _scroll_to_message(view, messages, current_idx): + """Scroll view to the message.""" + view.window().focus_view(view) + msg = messages[current_idx[1]] + r = _span_to_region(view, msg['span']) + view.sel().clear() + view.sel().add(r.a) + view.show_at_center(r) + # Work around bug in Sublime where the visual of the cursor + # does not update. See + # https://github.com/SublimeTextIssues/Core/issues/485 + view.add_regions('bug', [r], 'bug', 'dot', sublime.HIDDEN) + view.erase_regions('bug') + + +def show_messages_for_view(view): + """Adds all phantoms and region outlines for a view.""" + window = view.window() + paths = WINDOW_MESSAGES.get(window.id(), {}).get('paths', {}) + messages = paths.get(view.file_name(), None) + if messages: + _show_messages_for_view(view, messages) + + +def _show_messages_for_view(view, messages): + for message in messages: + _show_phantom(view, + message['level'], + message['span'], + message['message']) + _draw_region_highlights(view, messages) + + +def _ith_iter_item(d, i): + return next(itertools.islice(d, i, None)) + + +def _advance_next_message(window, levels, wrap_around=False): + """Update global msg_index to the next index.""" + try: + win_info = WINDOW_MESSAGES[window.id()] + except KeyError: + return None + paths = win_info['paths'] + path_idx, msg_idx = win_info['msg_index'] + if path_idx == -1: + # First time. + path_idx = 0 + msg_idx = 0 + else: + msg_idx += 1 + + while path_idx < len(paths): + messages = _ith_iter_item(paths.values(), path_idx) + while msg_idx < len(messages): + msg = messages[msg_idx] + if _is_matching_level(levels, msg): + current_idx = (path_idx, msg_idx) + win_info['msg_index'] = current_idx + return current_idx + msg_idx += 1 + path_idx += 1 + msg_idx = 0 + if wrap_around: + # No matching entries, give up. + return None + else: + # Start over at the beginning of the list. + win_info['msg_index'] = (-1, -1) + return _advance_next_message(window, levels, wrap_around=True) + + +def _last_index(paths): + path_idx = len(paths) - 1 + msg_idx = len(_ith_iter_item(paths.values(), path_idx)) - 1 + return (path_idx, msg_idx) + + +def _advance_prev_message(window, levels, wrap_around=False): + """Update global msg_index to the previous index.""" + try: + win_info = WINDOW_MESSAGES[window.id()] + except KeyError: + return None + paths = win_info['paths'] + path_idx, msg_idx = win_info['msg_index'] + if path_idx == -1: + # First time, start at the end. + path_idx, msg_idx = _last_index(paths) + else: + msg_idx -= 1 + + while path_idx >= 0: + messages = _ith_iter_item(paths.values(), path_idx) + while msg_idx >= 0: + msg = messages[msg_idx] + if _is_matching_level(levels, msg): + current_idx = (path_idx, msg_idx) + win_info['msg_index'] = current_idx + return current_idx + msg_idx -= 1 + path_idx -= 1 + if path_idx >= 0: + msg_idx = len(_ith_iter_item(paths.values(), path_idx)) - 1 + if wrap_around: + # No matching entries, give up. + return None + else: + # Start over at the end of the list. + win_info['msg_index'] = (-1, -1) + return _advance_prev_message(window, levels, wrap_around=True) + + +def _is_matching_level(levels, msg_dict): + if not msg_dict['is_main']: + # Only navigate to top-level messages. + return False + level = msg_dict['level'] + if levels == 'all': + return True + elif levels == 'error' and level == 'error': + return True + elif levels == 'warning' and level != 'error': + # Warning, Note, Help + return True + else: + return False + + +def add_rust_messages(window, cwd, info, target_path, msg_cb): + """Add messages from Rust JSON to Sublime views. + + - `window`: Sublime Window object. + - `cwd`: Directory where cargo/rustc was run. + - `info`: Dictionary of messages from rustc. + - `target_path`: Absolute path to the top-level source file of the target + (lib.rs, main.rs, etc.). May be None if it is not known. + - `msg_cb`: Function called for each message (if not None). Parameters + are: + - `path`: Full path to the file. None if no file associated. + - `span_region`: Sublime (0-based) offsets into the file for the + region `((line_start, col_start), (line_end, col_end))`. None if + no region. + - `is_main`: If True, a top-level message. + - `message`: Text of the message. + - `level`: Rust level ('error', 'warning', 'note', etc.) + """ + _add_rust_messages(window, cwd, info, target_path, msg_cb, {}) + + +def _add_rust_messages(window, cwd, info, target_path, + msg_cb, parent_info): + """ + - `info`: The dictionary from Rust has the following structure: + + - 'message': The message to display. + - 'level': The error level ('error', 'warning', 'note', 'help') + (XXX I think an ICE shows up as 'error: internal compiler + error') + - 'code': If not None, contains a dictionary of extra information + about the error. + - 'code': String like 'E0001' + - 'explanation': Optional string with a very long description of + the error. If not specified, then that means nobody has gotten + around to describing the error, yet. + - 'spans': List of regions with diagnostic information. May be empty + (child messages attached to their parent, or global messages like + "main not found"). Each element is: + + - 'file_name': Filename for the message. For spans located in the + 'expansion' section, this will be the name of the expanded macro + in the format ''. + - 'byte_start': + - 'byte_end': + - 'line_start': + - 'line_end': + - 'column_start': + - 'column_end': + - 'is_primary': If True, this is the primary span where the error + started. Note: It is possible (though rare) for multiple spans + to be marked as primary. + - 'text': List of dictionaries showing the original source code. + - 'label': A message to display at this span location. May be + None (AFAIK, this only happens when is_primary is True, in which + case the main 'message' is all that should be displayed). + - 'suggested_replacement': If not None, a string with a + suggestion of the code to replace this span. If this is set, we + actually display the 'rendered' value instead, because it's + easier to read. + - 'expansion': If not None, a dictionary indicating the expansion + of the macro within this span. The values are: + + - 'span': A span object where the macro was applied. + - 'macro_decl_name': Name of the macro ("print!" or + "#[derive(Eq)]") + - 'def_site_span': Span where the macro was defined (may be + None if not known). + + - 'children': List of attached diagnostic messages (following this + same format) of associated information. + - 'rendered': Optional string (may be None). Currently only used by + suggested replacements. If a child has a span with + 'suggested_replacement' set, then this a suggestion of how the line + should be written. + + - `parent_info`: Dictionary used for tracking "children" messages. + Includes 'view' and 'region' keys to indicate where a child message + should be displayed. + """ + error_colour = util.get_setting('rust_syntax_error_color', 'var(--redish)') + warning_colour = util.get_setting('rust_syntax_warning_color', 'var(--yellowish)') + + # Include "notes" tied to errors, even if warnings are disabled. + if (info['level'] != 'error' and + util.get_setting('rust_syntax_hide_warnings', False) and + not parent_info + ): + return + + # TODO: Consider matching the colors used by rustc. + # - error: red + # `bug` appears as "error: internal compiler error" + # - warning: yellow + # - note: bright green + # - help: cyan + is_error = info['level'] == 'error' + if is_error: + base_color = error_colour + else: + base_color = warning_colour + + msg_template = """ + + + {level}: {msg} {extra}\xD7 + """ % (base_color,) + + def _add_message(path, span_region, is_main, message, extra=''): + if info['level'] == 'error': + cls = 'rust-error' + else: + cls = 'rust-additional' + + # Rust performs some pretty-printing for things like suggestions, + # attempt to retain some of the formatting. This isn't perfect + # (doesn't line up perfectly), not sure why. + escaped_message = html.escape(message, quote=False).\ + replace('\n', '
').replace(' ', ' ') + content = msg_template.format( + cls=cls, + level=info['level'], + msg=escaped_message, + extra=extra + ) + add_message(window, path, info['level'], span_region, + is_main, content) + if msg_cb: + msg_cb(path, span_region, is_main, message, info['level']) + + def add_primary_message(path, span_region, is_main, message): + parent_info['path'] = path + parent_info['span'] = span_region + # Not all codes have explanations (yet). + if info['code'] and info['code']['explanation']: + # TODO + # This could potentially be a link that opens a Sublime popup, or + # a new temp buffer with the contents of 'explanation'. + # (maybe use sublime-markdown-popups) + extra = ' ?' % (info['code']['code'],) + else: + extra = '' + _add_message(path, span_region, is_main, message, extra) + + if len(info['spans']) == 0: + if parent_info: + # This is extra info attached to the parent message. + add_primary_message(parent_info['path'], + parent_info['span'], + False, + info['message']) + else: + # Messages without spans are global session messages (like "main + # function not found"). + # + # Some of the messages are not very interesting, though. + imsg = info['message'] + if not (imsg.startswith('aborting due to') or + imsg.startswith('cannot continue')): + if target_path: + # Display at the bottom of the root path (like main.rs) + # for lack of a better place to put it. + add_primary_message(target_path, None, True, imsg) + else: + if msg_cb: + msg_cb(None, None, True, imsg, info['level']) + + for span in info['spans']: + is_primary = span['is_primary'] + + if 'macros>' in span['file_name']: + # Rust gives the chain of expansions for the macro, which we + # don't really care about. We want to find the site where the + # macro was invoked. + def find_span_r(span): + if 'macros>' in span['file_name']: + if span['expansion']: + return find_span_r(span['expansion']['span']) + else: + # XXX: Is this possible? + return None + else: + return span + span = find_span_r(span) + if span is None: + continue + + span_path = os.path.realpath(os.path.join(cwd, span['file_name'])) + # Sublime text is 0 based whilst the line/column info from + # rust is 1 based. + span_region = ((span['line_start'] - 1, span['column_start'] - 1), + (span['line_end'] - 1, span['column_end'] - 1)) + + label = span['label'] + if label: + # Display the label for this Span. + _add_message(span_path, span_region, False, label) + else: + # Some spans don't have a label. These seem to just imply + # that the main "message" is sufficient, and always seems + # to happen when the span is_primary. + if not is_primary: + # When can this happen? + pprint(info) + raise ValueError('Unexpected span with no label') + if is_primary: + # Show the overall error message. + add_primary_message(span_path, span_region, True, info['message']) + if span['suggested_replacement']: + # The "suggested_replacement" contains the code that + # should replace the span. However, it can be easier to + # read if you repeat the entire line (from "rendered"). + _add_message(span_path, span_region, False, info['rendered']) + + # Recurse into children (which typically hold notes). + for child in info['children']: + _add_rust_messages(window, cwd, child, target_path, + msg_cb, parent_info.copy()) diff --git a/rust/opanel.py b/rust/opanel.py new file mode 100644 index 00000000..d2776908 --- /dev/null +++ b/rust/opanel.py @@ -0,0 +1,105 @@ +"""Module displaying build output in a Sublime output panel.""" + +import os +from . import rust_proc, messages, util + +# Use the same panel name that Sublime's build system uses so that "Show Build +# Results" will open the same panel. I don't see any particular reason why +# this would be a problem. If it is, it's a simple matter of changing this. +PANEL_NAME = 'exec' + + +def create_output_panel(window, cwd): + output_view = window.create_output_panel(PANEL_NAME) + s = output_view.settings() + # FILENAME:LINE: MESSAGE + # Two dots to handle Windows DRIVE: + # XXX: Verify + s.set('result_file_regex', '^[^:]+: (..[^:]*):([0-9]+): (.*)$') + # Used for resolving relative paths. + s.set('result_base_dir', cwd) + s.set('word_wrap', True) # XXX Or False? + s.set('line_numbers', False) + s.set('gutter', False) + s.set('scroll_past_end', False) + output_view.assign_syntax('Cargo.build-language') + # 'color_scheme'? + # XXX: Is this necessary? + # self.window.create_output_panel(PANEL_NAME) + if util.get_setting('show_panel_on_build', True): + window.run_command('show_panel', {'panel': 'output.' + PANEL_NAME}) + return output_view + + +def display_message(window, msg): + """Utility function for displaying a one-off message (typically an error) + in a new output panel.""" + v = create_output_panel(window, '') + _append(v, msg) + + +def _append(view, text): + view.run_command('append', {'characters': text, + 'scroll_to_end': True}) + + +class OutputListener(rust_proc.ProcListener): + + """Listener used for displaying results to a Sublime output panel.""" + + # Sublime view used for output. + output_view = None + + def __init__(self, window, base_path): + self.window = window + self.base_path = base_path + + def on_begin(self, proc): + self.output_view = create_output_panel(self.window, self.base_path) + self._append('[Running: %s]' % (' '.join(proc.cmd),)) + + def on_data(self, proc, data): + self._append(data, nl=False) + + def on_error(self, proc, message): + self._append(message) + + def on_json(self, proc, obj): + if 'message' in obj: + messages.add_rust_messages(self.window, proc.cwd, obj['message'], + None, self.msg_cb) + + def msg_cb(self, path, span_region, is_main, message, level): + if path: + if self.base_path and path.startswith(self.base_path): + path = os.path.relpath(path, self.base_path) + if span_region: + self._append('%s: %s:%d: %s' % (level, path, + span_region[0][0], message)) + else: + self._append('%s: %s: %s' % (level, path, message)) + else: + self._append('%s: %s' % (level, message)) + + def on_finished(self, proc, rc): + if rc: + self._append('[Finished in %.1fs with exit code %d]' % ( + proc.elapsed, rc)) + self._display_debug(proc) + else: + self._append('[Finished in %.1fs]' % proc.elapsed) + messages.draw_all_region_highlights(self.window) + + def on_terminated(self, proc): + self._append('[Build interrupted]') + + def _append(self, message, nl=True): + if nl: + message += '\n' + _append(self.output_view, message) + + def _display_debug(self, proc): + # Display some information to help the user debug any build problems. + self._append('[dir: %s]' % (proc.cwd,)) + # TODO: Fix this when adding PATH/env support. + self._append('[path: %s]' % (proc.env.get('PATH'),)) diff --git a/rust/rust_proc.py b/rust/rust_proc.py new file mode 100644 index 00000000..edc85775 --- /dev/null +++ b/rust/rust_proc.py @@ -0,0 +1,300 @@ +"""Module for running cargo or rustc and parsing the output. + +It is assumed a thread only ever has one process running at a time. +""" + +import json +import os +import signal +import subprocess +import sys +import threading +import time + +from . import util + +# Map Sublime window ID to RustProc. +PROCS = {} +PROCS_LOCK = threading.Lock() + + +class ProcessTerminatedError(Exception): + """Process was terminated by another thread.""" + + +class ProcListener(object): + + """Listeners are used to handle output events while a process is + running.""" + + def on_begin(self, proc): + """Called just before the process is started.""" + pass + + def on_data(self, proc, data): + """A line of text output by the process.""" + pass + + def on_error(self, proc, message): + """Called when there is an error, such as failure to decode utf-8.""" + print('Rust Error: %s' % message) + + def on_json(self, proc, obj): + """Parsed JSON output from the command.""" + pass + + def on_finished(self, proc, rc): + """Called after all output has been processed.""" + pass + + def on_terminated(self, proc): + """Called when the process is terminated by another thread. Note that + the process may still be running.""" + pass + + +class SlurpListener(ProcListener): + + def on_begin(self, proc): + self.json = [] + self.data = [] + + def on_json(self, proc, obj): + self.json.append(obj) + + def on_data(self, proc, data): + self.data.append(data) + + +def _slurp(window, cmd, cwd): + p = RustProc() + listener = SlurpListener() + p.run(window, cmd, cwd, listener) + rc = p.wait() + return (rc, listener) + + +def slurp_json(window, cmd, cwd): + """Run a command and return the JSON output from it. + + :param window: Sublime window. + :param cmd: The command to run (list of strings). + :param cwd: The directory where to run the command. + + :returns: List of parsed JSON objects. + + :raises ProcessTermiantedError: Process was terminated by another thread. + """ + rc, listener = _slurp(window, cmd, cwd) + if not listener.json and rc: + print('Failed to run: %s' % cmd) + print(''.join(listener.data)) + return listener.json + + +def check_output(window, cmd, cwd): + """Run a command and return the text output from it. + + :param window: Sublime window. + :param cmd: The command to run (list of strings). + :param cwd: The directory where to run the command. + + :returns: A string of the command's output. + + :raises ProcessTermiantedError: Process was terminated by another thread. + :raises subprocess.CalledProcessError: The command returned a nonzero exit + status. + """ + rc, listener = _slurp(window, cmd, cwd) + output = ''.join(listener.data) + if rc: + raise subprocess.CalledProcessError(rc, cmd, output) + return output + + +class RustProc(object): + + """Launches and controls a subprocess.""" + + # Set to True when the process is finished running. + finished = False + # Set to True if the process was forcefully terminated. + terminated = False + # Command to run as a list of strings. + cmd = None + # The directory where the command is being run. + cwd = None + # Environment dictionary used in the child. + env = None + # subprocess.Popen object + proc = None + # Time when the process was started. + start_time = None + # Number of seconds it took to run. + elapsed = None + # The thread used for reading output. + _stdout_thread = None + + def run(self, window, cmd, cwd, listener): + """Run the process. + + :param window: Sublime window. + :param cmd: The command to run (list of strings). + :param cwd: The directory where to run the command. + :param listener: `ProcListener` to receive the output. + + :raises ProcessTermiantedError: Process was terminated by another + thread. + """ + self.cmd = cmd + self.cwd = cwd + self.listener = listener + self.start_time = time.time() + self.window = window + + from . import rust_thread + try: + t = rust_thread.THREADS[window.id()] + except KeyError: + pass + else: + if t.should_exit: + raise ProcessTerminatedError() + + with PROCS_LOCK: + PROCS[window.id()] = self + listener.on_begin(self) + # This is similar to how Sublime 'exec' works. + # XXX: TODO: + # - Allow user to specify 'env', and merge into environment. + # - Allow user to specify 'path', like '$PATH;C:\\new\path' + + # XXX: Debug config. + util.debug('Rust running: %s', self.cmd) + + self.env = os.environ.copy() + if sys.platform == 'darwin': + # Because setting a global PATH on OS X is tricky, hard-code this. + # TODO: Grab this from settings. + cargo_dir = os.path.expanduser('~/.cargo/bin') + if cargo_dir not in self.env.get('PATH', '') \ + and os.path.exists(cargo_dir): + self.env['PATH'] = cargo_dir + os.pathsep + \ + self.env.get('PATH', '') + + if sys.platform == 'win32': + # Prevent a console window from popping up. + startupinfo = subprocess.STARTUPINFO() + startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW + self.proc = subprocess.Popen( + self.cmd, + cwd=self.cwd, + env=self.env, + startupinfo=startupinfo, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + ) + else: + # Make the process the group leader so we can easily kill all its + # children. + self.proc = subprocess.Popen( + self.cmd, + cwd=self.cwd, + preexec_fn=os.setpgrp, + env=self.env, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + ) + + self._stdout_thread = threading.Thread(target=self._read_stdout, + name='%s: Stdout' % (threading.current_thread().name,)) + self._stdout_thread.start() + + def terminate(self): + """Kill the process. + + Termination may not happen immediately. Use wait() if you need to + ensure when it is finished. + """ + if self.finished: + return + self.finished = True + self.terminated = True + if sys.platform == 'win32': + # Use taskkill to kill the entire tree (terminate only kills top + # process). + startupinfo = subprocess.STARTUPINFO() + startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW + # /T - Kill tree + # /F - Force kill + subprocess.Popen( + 'taskkill /T /F /PID ' + str(self.proc.pid), + startupinfo=startupinfo) + else: + # Must kill the entire process group. The rustup wrapper won't + # forward the signal to cargo, and cargo doesn't forward signals + # to any processes it spawns. + os.killpg(os.getpgid(self.proc.pid), signal.SIGTERM) + # stdout reader should catch the end of the stream and perform + # cleanup. + self.listener.on_terminated(self) + + def wait(self): + """Wait for the process to finish. + + :return: The returncode of the process. + + :raises ProcessTerminatedError: Process was interrupted by another + thread. + """ + # stdout_thread is responsible for cleanup, setting `finished`, etc. + if self._stdout_thread: + self._stdout_thread.join() + rc = self.proc.wait() + if self.terminated: + raise ProcessTerminatedError() + return rc + + def _read_stdout(self): + while True: + line = self.proc.stdout.readline() + if not line: + rc = self._cleanup() + self.listener.on_finished(self, rc) + break + try: + line = line.decode('utf-8') + except: + self.listener.on_error(self, + 'Error decoding UTF-8: %r' % line) + continue + if line.startswith('{'): + try: + result = json.loads(line) + except: + self.listener.on_error(self, + 'Error loading JSON from rust:\n%r' % line) + else: + try: + self.listener.on_json(self, result) + except: + self._cleanup() + raise + else: + # Sublime always uses \n internally. + line = line.replace('\r\n', '\n') + self.listener.on_data(self, line) + + def _cleanup(self): + self.elapsed = time.time() - self.start_time + self.finished = True + self._stdout_thread = None + self.proc.stdout.close() + rc = self.proc.wait() + with PROCS_LOCK: + p = PROCS[self.window.id()] + if p is self: + del PROCS[self.window.id()] + return rc diff --git a/rust/rust_thread.py b/rust/rust_thread.py new file mode 100644 index 00000000..1179b4f2 --- /dev/null +++ b/rust/rust_thread.py @@ -0,0 +1,115 @@ +"""Manage threads used for running Rust processes.""" + +from . import util, rust_proc + +import sublime +import threading + +# Map Sublime window ID to RustThread. +THREADS = {} +THREADS_LOCK = threading.Lock() + + +class RustThread(object): + + """A thread for running Rust processes. + + Subclasses should implement run to define the code to run. + + Subclasses should check `should_exit` around any long-running steps. + """ + + # threading.Thread instance + thread = None + # If this is true, then it is OK to kill this thread to start a new one. + silently_interruptible = True + # Set to True when the thread should terminate. + should_exit = False + # Sublime window this thread is attached to. + window = None + # Name of the thread. + name = None + + def __init__(self, window): + self.window = window + + def start(self): + """Start the thread.""" + self.thread = threading.Thread(name=self.name, + target=self._thread_run) + self.thread.start() + + @property + def current_proc(self): + """The current `RustProc` being executed by this thread, or None.""" + return rust_proc.PROCS.get(self.window.id(), None) + + def describe(self): + """Returns a string with the name of the thread.""" + p = self.current_proc + if p: + return '%s: %s' % (self.name, ' '.join(p.cmd)) + else: + return self.name + + def _thread_run(self): + # Determine if this thread is allowed to run. + while True: + with THREADS_LOCK: + t = THREADS.get(self.window.id(), None) + if not t or not t.is_alive(): + THREADS[self.window.id()] = self + break + + # Another thread is already running for this window. + if t.should_exit: + t.join() + elif t.silently_interruptible: + t.terminate() + t.join() + elif self.silently_interruptible: + # Never allowed to interrupt. + return + else: + # Neither is interruptible (the user started a Build + # while one is already running). + msg = """ + Rust Build + + The following Rust command is still running, do you want to cancel it? + %s""" % self.describe() + if sublime.ok_cancel_dialog(util.multiline_fix(msg), + 'Stop Running Command'): + t.terminate() + t.join() + else: + # Allow the original process to finish. + return + # Try again. + + try: + self.run() + finally: + with THREADS_LOCK: + t = THREADS.get(self.window.id(), None) + if t is self: + del THREADS[self.window.id()] + + def run(self): + raise NotImplementedError() + + def terminate(self): + """Asks the thread to exit. + + If the thread is running a process, the process will be killed. + """ + self.should_exit = True + p = self.current_proc + if p and not p.finished: + p.terminate() + + def is_alive(self): + return self.thread.is_alive() + + def join(self, timeout=None): + return self.thread.join(timeout=timeout) diff --git a/rust/target_detect.py b/rust/target_detect.py new file mode 100644 index 00000000..2dbc56b5 --- /dev/null +++ b/rust/target_detect.py @@ -0,0 +1,159 @@ +"""Used to determine the Cargo targets from any given .rs file. + +This is very imperfect. It uses heuristics to try to detect targets. This +could be significantly improved by using "rustc --emit dep-info", however, +that may be a little tricky (and doesn't work on errors). See +https://github.com/rust-lang/cargo/issues/3211 +""" + +import os +from . import rust_proc, util + + +class TargetDetector(object): + + def __init__(self, window): + self.window = window + + def determine_targets(self, file_name): + """Detect the target/filters needed to pass to Cargo to compile + file_name. + Returns list of (target_src_path, target_command_line_args) tuples. + + :raises ProcessTerminatedError: Thread should shut down. + """ + # Try checking for target match in settings. + result = self._targets_manual_config(file_name) + if result: + return result + + # Try a heuristic to detect the filename. + result = rust_proc.slurp_json(self.window, + 'cargo metadata --no-deps'.split(), + cwd=os.path.dirname(file_name)) + if not result: + return [] + # Each "workspace" shows up as a separate package. + for package in result[0]['packages']: + root_path = os.path.dirname(package['manifest_path']) + targets = package['targets'] + # targets is list of dictionaries: + # {'kind': ['lib'], + # 'name': 'target-name', + # 'src_path': 'path/to/lib.rs'} + # src_path may be absolute or relative, fix it. + for target in targets: + if not os.path.isabs(target['src_path']): + target['src_path'] = os.path.join(root_path, target['src_path']) + target['src_path'] = os.path.normpath(target['src_path']) + + # Try exact filename matches. + result = self._targets_exact_match(targets, file_name) + if result: + return result + + # No exact match, try to find all targets with longest matching + # parent directory. + result = self._targets_longest_matches(targets, file_name) + if result: + return result + + # TODO: Alternatively, could run rustc directly without cargo. + # rustc -Zno-trans -Zunstable-options --error-format=json file_name + print('Rust Enhanced: Failed to find target for %r' % file_name) + return [] + + def _targets_manual_config(self, file_name): + """Check for Cargo targets in the Sublime settings.""" + # First check config for manual targets. + for project in util.get_setting('projects', {}).values(): + src_root = os.path.join(project.get('root', ''), 'src') + if not file_name.startswith(src_root): + continue + targets = project.get('targets', {}) + for tfile, tcmd in targets.items(): + if file_name == os.path.join(src_root, tfile): + return [(tfile, tcmd.split())] + else: + target = targets.get('_default', '') + if target: + # Unfortunately don't have the target src filename. + return [('', target)] + return None + + def _target_to_args(self, target): + """Convert target from Cargo metadata to Cargo command-line argument. + """ + # Targets have multiple "kinds" when you specify crate-type in + # Cargo.toml, like: + # crate-type = ["rlib", "dylib"] + # + # Libraries are the only thing that support this at this time, and + # generally you only use one command-line argument to build multiple + # "kinds" (--lib in this case). + # + # Nightly beware: [[example]] that specifies crate-type will no + # longer show up as "example", making it impossible to compile. + # See https://github.com/rust-lang/cargo/pull/3556 and + # https://github.com/rust-lang/cargo/issues/3572 + # https://github.com/rust-lang/cargo/pull/3668 (ISSUE FIXED) + # + # For now, just grab the first kind since it will always result in the + # same arguments. + kind = target['kind'][0] + if kind in ('lib', 'rlib', 'dylib', 'staticlib', 'proc-macro'): + return (target['src_path'], ['--lib']) + elif kind in ('bin', 'test', 'example', 'bench'): + return (target['src_path'], ['--' + kind, target['name']]) + elif kind in ('custom-build',): + # Currently no way to target build.rs explicitly. + # Or, run rustc (without cargo) on build.rs. + # TODO: "cargo check" seems to work + return None + else: + # Unknown kind, don't know how to build. + raise ValueError(kind) + + def _targets_exact_match(self, targets, file_name): + """Check for Cargo targets that exactly match the current file.""" + for target in targets: + if target['src_path'] == file_name: + args = self._target_to_args(target) + if args: + return [args] + return None + + def _targets_longest_matches(self, targets, file_name): + """Determine the Cargo targets that are in the same directory (or + parent) of the current file.""" + result = [] + # Find longest path match. + # TODO: This is sub-optimal, because it may result in multiple targets. + # Consider using the output of rustc --emit dep-info. + # See https://github.com/rust-lang/cargo/issues/3211 for some possible + # problems with that. + path_match = os.path.dirname(file_name) + found = False + found_lib = False + found_bin = False + while not found: + for target in targets: + if os.path.dirname(target['src_path']) == path_match: + target_args = self._target_to_args(target) + if target_args: + result.append(target_args) + found = True + if target_args[1][0] == '--bin': + found_bin = True + if target_args[1][0] == '--lib': + found_lib = True + p = os.path.dirname(path_match) + if p == path_match: + # Root path + break + path_match = p + # If the match is both --bin and --lib in the same directory, + # just do --lib. + if found_bin and found_lib: + result = [x for x in result if x[1][0] != '--bin'] + return result diff --git a/rust/util.py b/rust/util.py new file mode 100644 index 00000000..240ae5f8 --- /dev/null +++ b/rust/util.py @@ -0,0 +1,55 @@ +"""General utilities used by the Rust package.""" + +import sublime +import textwrap +import threading +import time + + +def index_with(l, cb): + """Find the index of a value in a sequence using a callback. + + :param l: The sequence to search. + :param cb: Function to call, should return true if the given value matches + what you are searching for. + :returns: Returns the index of the match, or -1 if no match. + """ + for i, v in enumerate(l): + if cb(v): + return i + return -1 + + +def multiline_fix(s): + """Remove indentation from a multi-line string.""" + return textwrap.dedent(s).lstrip() + + +def get_setting(name, default=None): + """Retrieve a setting from Sublime settings.""" + pdata = sublime.active_window().project_data() + if pdata: + v = pdata.get('settings', {}).get(name) + if v is not None: + return v + settings = sublime.load_settings('RustEnhanced.sublime-settings') + v = settings.get(name) + if v is not None: + return v + settings = sublime.load_settings('Preferences.sublime-settings') + # XXX: Also check "Distraction Free"? + return settings.get(name, default) + + +_last_debug = time.time() + + +def debug(msg, *args): + """Display a general debug message.""" + global _last_debug + t = time.time() + d = t - _last_debug + _last_debug = t + n = threading.current_thread().name + print('%s +%.3f ' % (n, d), end='') + print(msg % args) diff --git a/tests/README.md b/tests/README.md index 985437fa..f0a9675e 100644 --- a/tests/README.md +++ b/tests/README.md @@ -2,3 +2,12 @@ To run the tests in this directory, install the Sublime plugin [UnitTesting](https://github.com/randy3k/UnitTesting/) (most easily done with Package Control). Then in Sublime run the UnitTesting command from the Command Palette. + +You also need the following installed and in your PATH: +- Rust, Cargo, and Rustup +- `nightly` Rust toolchain. +- Clippy (https://github.com/Manishearth/rust-clippy) +- Cargo Script (https://github.com/DanielKeep/cargo-script) + +It also assumes you have not made any changes to the default RustEnhanced +settings. diff --git a/tests/error-tests/tests/cast-to-unsized-trait-object-suggestion.rs b/tests/error-tests/tests/cast-to-unsized-trait-object-suggestion.rs new file mode 100644 index 00000000..a30fad08 --- /dev/null +++ b/tests/error-tests/tests/cast-to-unsized-trait-object-suggestion.rs @@ -0,0 +1,20 @@ +// Copyright 2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn main() { + &1 as Send; + // ^ERR cast to unsized type + // ^^HELP try casting to + // ^^^HELP &1 as &Send + Box::new(1) as Send; + // ^ERR cast to unsized type + // ^^HELP try casting to a `Box` instead: + // ^^^HELP Box::new(1) as Box; +} diff --git a/tests/message-order/Cargo.lock b/tests/message-order/Cargo.lock new file mode 100644 index 00000000..dd7eb9a0 --- /dev/null +++ b/tests/message-order/Cargo.lock @@ -0,0 +1,4 @@ +[root] +name = "message-order" +version = "0.1.0" + diff --git a/tests/message-order/Cargo.toml b/tests/message-order/Cargo.toml new file mode 100644 index 00000000..76257309 --- /dev/null +++ b/tests/message-order/Cargo.toml @@ -0,0 +1,5 @@ +[package] +name = "message-order" +version = "0.1.0" + +[dependencies] diff --git a/tests/message-order/dt b/tests/message-order/dt new file mode 100644 index 00000000..bcfb0d4f --- /dev/null +++ b/tests/message-order/dt @@ -0,0 +1,4946 @@ +dtrace: 1620 dynamic variable drops with non-empty dirty list + PID/THRD SYSCALL(args) = return +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: stat64("/Users/eric/Library/Application Support/Sublime Text 3/Installed Packages/Package Control.sublime-package\0", 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: stat64("/Users/eric/Library/Application Support/Sublime Text 3/Installed Packages/Package Control.sublime-package\0", 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x100) = 0 0 +20482/0x111bd2c: gettimeofday(0x7FFF544294F0, 0x0, 0x100) = 1488411655 0 +20482/0x111bd64: psynch_mutexwait(0x10BE86C58, 0x4FD9B0004FD9D03, 0x4FD9B00) = 83729667 0 +20482/0x111bd64: psynch_cvsignal(0x10BE86C98, 0x2A0000002A0100, 0x2A0000) = 257 0 +20482/0x111bd2c: psynch_cvwait(0x10BE86C98, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A0001002A0100, 0x2A0000) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A0001002A0100, 0x0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd2c: read(0x25, "debug [unoptimized + debuginfo] target(s) in 0.0 secs\n\0", 0x4000) = 54 0 +20482/0x111bd2c: sem_post(0x3, 0x7F89CD1F2400, 0x4000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7F89CD1F2400, 0x4000) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd2c: read(0x25, "\0", 0x4000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7F89CD1F2400, 0x4000) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7F89CD1F2400, 0x4000) = 0 0 +20482/0x111bd2c: wait4(0x523B, 0x7FFF544289CC, 0x1) = 21051 0 +20482/0x111bd2c: close(0x24) = 0 0 +20482/0x111bd2c: close(0x25) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +dtrace: 1961 dynamic variable drops with non-empty dirty list +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF544289CC, 0x1) = 0 0 +20482/0x111bd2c: gettimeofday(0x7FFF54429520, 0x0, 0x1) = 1488411657 0 +20482/0x111bd64: psynch_mutexwait(0x10BE86C58, 0x506020005060403, 0x5060200) = 84280323 0 +20482/0x111bd64: psynch_cvsignal(0x10BE86C98, 0x2A1500002A1600, 0x2A1500) = 257 0 +20482/0x111bd2c: psynch_cvwait(0x10BE86C98, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1501002A1600, 0x2A1500) = 0 0 +20482/0x111bd2c: stat64("/Users/eric/Library/Application Support/Sublime Text 3/Installed Packages/Package Control.sublime-package\0", 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x7FFF54428E28, 0x2A1500) = 0 0 +20482/0x111bd2c: gettimeofday(0x7FFF544294F0, 0x0, 0x2A1500) = 1488411657 0 +20482/0x111bd64: psynch_cvsignal(0x10BE86C98, 0x2A1600002A1700, 0x2A1600) = 257 0 +20482/0x111bd2c: psynch_cvwait(0x10BE86C98, 0x2A1601002A1700, 0x2A1600) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: gettimeofday(0x7000013960C0, 0x0, 0x700001396260) = 1488411657 0 +20482/0x111bd2c: psynch_mutexwait(0x10BE86C58, 0x508C4000508C603, 0x508C400) = 84461059 0 +20482/0x111bd2c: psynch_cvsignal(0x10BE86C98, 0x2A1700002A1800, 0x2A1700) = 257 0 +20482/0x111bd64: psynch_cvwait(0x10BE86C98, 0x2A1701002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x2A1700002A1800, 0x2A1700) = 0 0 +20482/0x111bd2c: sem_post(0x0, 0x0, 0x0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 + +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x3, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_wait(0x18, 0x10000000203, 0x100) = 0 0 +20482/0x111bd2c: sem_post(0x1A, 0x10000000203, 0x100) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 +20482/0x111bd64: select(0x0, 0x0, 0x0, 0x0, 0x7000013A2550) = 0 0 +20482/0x111bd64: select(0x1F, 0x7000013962E0, 0x700001396260, 0x7000013961E0, 0x7000013961D0) = 0 0 + diff --git a/tests/message-order/src/lib.rs b/tests/message-order/src/lib.rs new file mode 100644 index 00000000..60928fd9 --- /dev/null +++ b/tests/message-order/src/lib.rs @@ -0,0 +1,2 @@ +pub mod warning1; +pub mod warning2; diff --git a/tests/message-order/src/warning1.rs b/tests/message-order/src/warning1.rs new file mode 100644 index 00000000..867b1f5c --- /dev/null +++ b/tests/message-order/src/warning1.rs @@ -0,0 +1,7 @@ +fn unused_a() { + +} + +fn unused_b() { + +} diff --git a/tests/message-order/src/warning2.rs b/tests/message-order/src/warning2.rs new file mode 100644 index 00000000..9dc0c062 --- /dev/null +++ b/tests/message-order/src/warning2.rs @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +fn unused_in_2() { + +} diff --git a/tests/multi-targets/Cargo.toml b/tests/multi-targets/Cargo.toml index 48960d03..41809c83 100644 --- a/tests/multi-targets/Cargo.toml +++ b/tests/multi-targets/Cargo.toml @@ -5,6 +5,9 @@ build = "build.rs" [dependencies] +[features] +nightly = [] + [[bin]] name = "otherbin" path = "src/altmain.rs" @@ -12,6 +15,7 @@ path = "src/altmain.rs" [[bin]] name = "multi-targets" path = "src/main.rs" +doc = false # If you specify an explicit bin, the Cargo will no automatically detect bins # in the bin/ directory. @@ -35,3 +39,4 @@ path = "examples/ex2.rs" name = "exlib" path = "examples/exlib.rs" crate-type = ["dylib"] +test = false diff --git a/tests/multi-targets/mystery.rs b/tests/multi-targets/mystery.rs index 850631e5..f735cbed 100644 --- a/tests/multi-targets/mystery.rs +++ b/tests/multi-targets/mystery.rs @@ -1 +1,4 @@ // This is an example of a Rust file that does not belong to any target. +fn main() { + println!("Hello Mystery"); +} diff --git a/tests/multi-targets/src/bin/bin2.rs b/tests/multi-targets/src/bin/bin2.rs index 8c1fd445..dbea9e5c 100644 --- a/tests/multi-targets/src/bin/bin2.rs +++ b/tests/multi-targets/src/bin/bin2.rs @@ -1,3 +1,5 @@ fn main() { - println!("bin1"); + let args: Vec = std::env::args().skip(1).collect(); + let result = args.join(" "); + println!("{}", result); } diff --git a/tests/multi-targets/src/lib.rs b/tests/multi-targets/src/lib.rs index 8729d7cf..a9c7a3eb 100644 --- a/tests/multi-targets/src/lib.rs +++ b/tests/multi-targets/src/lib.rs @@ -2,6 +2,8 @@ pub mod lmod1; pub fn libf1() { println!("libf1"); + // Testing a Clippy warning (char_lit_as_u8). + 'x' as u8; } fn unused() { diff --git a/tests/multi-targets/src/main.rs b/tests/multi-targets/src/main.rs index 7569c1dc..6c0dd95d 100644 --- a/tests/multi-targets/src/main.rs +++ b/tests/multi-targets/src/main.rs @@ -1,3 +1,4 @@ + extern crate multi_targets; use multi_targets::*; diff --git a/tests/rust_test_common.py b/tests/rust_test_common.py new file mode 100644 index 00000000..0525202b --- /dev/null +++ b/tests/rust_test_common.py @@ -0,0 +1,128 @@ +import sublime +import queue +import sys +import os +import unittest +import time +# Used for debugging. +from pprint import pprint + +# Depends on how you install the plugin. +plugin = sys.modules.get('sublime-rust', + sys.modules.get('Rust Enhanced', None)) +if not plugin: + raise ValueError('Couldn\'t find Rust Enhanced plugin.') +plugin_path = tuple(plugin.__path__)[0] +if plugin_path.endswith('.sublime-package'): + raise ValueError('Cannot run test with compressed package.') +rust_proc = plugin.rust.rust_proc +rust_thread = plugin.rust.rust_thread +cargo_settings = plugin.rust.cargo_settings +cargo_config = plugin.rust.cargo_config +target_detect = plugin.rust.target_detect +messages = plugin.rust.messages +util = plugin.rust.util + + +class TestBase(unittest.TestCase): + + def setUp(self): + window = sublime.active_window() + # No necessary to set build system since tests call 'cargo_exec' + # directly. + # window.run_command('set_build_system', + # {'file': 'Packages/sublime-rust/RustEnhanced.sublime-build'}) + # Clear any rust project settings. + data = window.project_data() + if 'cargo_build' in data.get('settings', {}): + del data['settings']['cargo_build'] + window.set_project_data(data) + self.settings = sublime.load_settings('RustEnhanced.sublime-settings') + self._orig_show_panel = self.settings.get('show_panel_on_build') + self.settings.set('show_panel_on_build', False) + + def tearDown(self): + self.settings.set('show_panel_on_build', self._orig_show_panel) + + def _get_rust_thread(self): + """Waits for a rust thread to get started and returns it.""" + for n in range(500): + t = rust_thread.THREADS.get(sublime.active_window().id()) + if t: + return t + time.sleep(0.01) + raise AssertionError('Rust thread never started.') + + def _run_build(self, command='build', **kwargs): + # Unfortunately, you can't pass arbitrary args when running 'build'. + # Although running cargo_exec directly isn't exactly the same as + # running 'build', it's close enough (we aren't using any options in + # the default .sublime-build file). + # window.run_command('build', {'variant': variant}) + window = sublime.active_window() + kwargs['command'] = command + window.run_command('cargo_exec', kwargs) + + def _with_open_file(self, filename, f): + """Opens filename (relative to the plugin) in a new view, calls + f(view) to perform the tests. + """ + window = sublime.active_window() + path = os.path.join(plugin_path, filename) + if not os.path.exists(path): + # Unfortunately there doesn't seem to be a good way to detect a + # failure to load. + raise ValueError('Can\'t find path %r' % path) + view = window.open_file(path) + q = queue.Queue() + + def async_test_view(): + try: + # Wait for view to finish loading. + for n in range(500): + if view.is_loading(): + time.sleep(0.01) + else: + break + else: + raise AssertionError('View never loaded.') + f(view) + except Exception as e: + q.put(e) + else: + q.put(None) + + try: + sublime.set_timeout_async(async_test_view, 0) + msg = q.get() + if msg: + raise msg + finally: + window.focus_view(view) + window.run_command('close_file') + + def _cargo_clean(self, view_or_path): + if isinstance(view_or_path, sublime.View): + path = os.path.dirname(view_or_path.file_name()) + else: + path = view_or_path + rust_proc.check_output(sublime.active_window(), + 'cargo clean'.split(), + path) + + +class AlteredSetting(object): + + """Utility to help with temporarily changing a setting.""" + + def __init__(self, name, value): + self.name = name + self.value = value + self.settings = sublime.load_settings('RustEnhanced.sublime-settings') + + def __enter__(self): + self.orig = self.settings.get(self.name) + self.settings.set(self.name, self.value) + + def __exit__(self, type, value, traceback): + self.settings.set(self.name, self.orig) diff --git a/tests/slow-build/Cargo.lock b/tests/slow-build/Cargo.lock new file mode 100644 index 00000000..3038bebe --- /dev/null +++ b/tests/slow-build/Cargo.lock @@ -0,0 +1,4 @@ +[root] +name = "slow-build" +version = "0.1.0" + diff --git a/tests/slow-build/Cargo.toml b/tests/slow-build/Cargo.toml new file mode 100644 index 00000000..bd701e06 --- /dev/null +++ b/tests/slow-build/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "slow-build" +version = "0.1.0" +build = "build.rs" + +[dependencies] diff --git a/tests/slow-build/build.rs b/tests/slow-build/build.rs new file mode 100644 index 00000000..a4025503 --- /dev/null +++ b/tests/slow-build/build.rs @@ -0,0 +1,24 @@ +use std::thread; +use std::time::Duration; +use std::fs; + +fn touch(name: &str) { + let ents = fs::read_dir(".").unwrap(); + let nums = ents.filter_map(|e| { + let ent_name = e.unwrap().file_name().into_string().unwrap(); + if ent_name.starts_with(name) { + Some(ent_name[name.len()..].parse::().unwrap()) + } else { + None + } + }); + let max = nums.max().unwrap_or(0); + let fname = format!("{}{}", name, max+1); + fs::File::create(fname).unwrap(); +} + +fn main() { + touch("test-build-start-"); + thread::sleep(Duration::from_secs(3)); + touch("test-build-end-"); +} diff --git a/tests/slow-build/src/lib.rs b/tests/slow-build/src/lib.rs new file mode 100644 index 00000000..e69de29b diff --git a/tests/test_cargo_build.py b/tests/test_cargo_build.py new file mode 100644 index 00000000..05d399c1 --- /dev/null +++ b/tests/test_cargo_build.py @@ -0,0 +1,289 @@ +"""Tests for Cargo build.""" + +import fnmatch +import os +import sys +import time + +from rust_test_common import * + +package_root = os.path.join(plugin_path, + 'tests/multi-targets') + + +def exe(s): + return s + +if sys.platform == 'win32': + def exe(s): + return s + '.exe' + + +class TestCargoBuild(TestBase): + + def _run_build_wait(self, command='build', **kwargs): + self._run_build(command, **kwargs) + # Wait for it to finish. + self._get_rust_thread().join() + + def _get_build_output(self, window): + opanel = window.find_output_panel(plugin.rust.opanel.PANEL_NAME) + output = opanel.substr(sublime.Region(0, opanel.size())) + return output + + def setUp(self): + super(TestCargoBuild, self).setUp() + self._cargo_clean(package_root) + + def test_regular_build(self): + """Test plain Cargo build.""" + self._with_open_file('tests/multi-targets/src/main.rs', + self._test_regular_build) + + def _test_regular_build(self, view): + self._run_build_wait() + path = os.path.join(package_root, exe('target/debug/multi-targets')) + self.assertTrue(os.path.exists(path)) + + def test_build_with_target(self): + """Test Cargo build with target.""" + self._with_open_file('tests/multi-targets/src/main.rs', + self._test_build_with_target) + + def _test_build_with_target(self, view): + targets = [ + ('--bin bin1', [exe('bin1'), 'libmulti_targets.rlib']), + ('--bin bin2', [exe('bin2'), 'libmulti_targets.rlib']), + ('--bin otherbin', [exe('otherbin'), 'libmulti_targets.rlib']), + ('--bin multi-targets', [exe('multi-targets'), + 'libmulti_targets.rlib']), + ('--lib', ['libmulti_targets.rlib']), + # Not clear to me why it produces ex1-* files. + ('--example ex1', [exe('examples/ex1'), exe('examples/ex1-*'), + 'libmulti_targets.rlib']), + # I'm actually uncertain why Cargo builds all bins here. + ('--test test1', [exe('bin1'), exe('bin2'), exe('multi-targets'), + exe('otherbin'), + 'libmulti_targets.rlib', 'test1-*']), + # bench requires nightly + ] + window = view.window() + for target, expected_files in targets: + self._cargo_clean(package_root) + window.run_command('cargo_set_target', {'variant': 'build', + 'target': target}) + self._run_build_wait() + debug = os.path.join(package_root, 'target/debug') + files = os.listdir(debug) + files = files + [os.path.join('examples', x) for x in + os.listdir(os.path.join(debug, 'examples'))] + files = [x for x in files if + os.path.isfile(os.path.join(debug, x)) and + not x.startswith('.') and + not x.endswith('.pdb')] + files.sort() + expected_files.sort() + for file, expected_file in zip(files, expected_files): + if not fnmatch.fnmatch(file, expected_file): + raise AssertionError('Lists differ: %r != %r' % ( + files, expected_files)) + + def test_profile(self): + """Test changing the profile.""" + self._with_open_file('tests/multi-targets/src/main.rs', + self._test_profile) + + def _test_profile(self, view): + window = view.window() + window.run_command('cargo_set_profile', {'target': None, + 'profile': 'release'}) + self._run_build_wait() + self.assertTrue(os.path.exists( + os.path.join(package_root, exe('target/release/multi-targets')))) + self.assertFalse(os.path.exists( + os.path.join(package_root, 'target/debug'))) + + self._cargo_clean(package_root) + window.run_command('cargo_set_profile', {'target': None, + 'profile': 'dev'}) + self._run_build_wait() + self.assertFalse(os.path.exists( + os.path.join(package_root, exe('target/release/multi-targets')))) + self.assertTrue(os.path.exists( + os.path.join(package_root, 'target/debug'))) + + def test_target_triple(self): + """Test target triple.""" + self._with_open_file('tests/multi-targets/src/main.rs', + self._test_target_triple) + + def _test_target_triple(self, view): + window = view.window() + # Use a fake triple, since we don't want to assume what you have + # installed. + window.run_command('cargo_set_triple', {'target': None, + 'target_triple': 'a-b-c'}) + settings = cargo_settings.CargoSettings(window) + settings.load() + cmd = settings.get_command(cargo_settings.CARGO_COMMANDS['build']) + self.assertEqual(cmd, ['cargo', 'build', '--target', 'a-b-c', + '--message-format=json']) + + def test_toolchain(self): + """Test changing toolchain.""" + self._with_open_file('tests/multi-targets/src/main.rs', + self._test_toolchain) + + def _test_toolchain(self, view): + window = view.window() + # Variant + window.run_command('cargo_set_toolchain', {'which': 'variant', + 'variant': 'build', + 'toolchain': 'nightly'}) + settings = cargo_settings.CargoSettings(window) + settings.load() + cmd = settings.get_command(cargo_settings.CARGO_COMMANDS['build']) + self.assertEqual(cmd, ['cargo', '+nightly', 'build', + '--message-format=json']) + + # Variant clear. + window.run_command('cargo_set_toolchain', {'which': 'variant', + 'variant': 'build', + 'toolchain': None}) + settings.load() + cmd = settings.get_command(cargo_settings.CARGO_COMMANDS['build']) + self.assertEqual(cmd, ['cargo', 'build', + '--message-format=json']) + + # Target + window.run_command('cargo_set_toolchain', {'which': 'target', + 'target': '--bin bin1', + 'toolchain': 'nightly'}) + window.run_command('cargo_set_target', {'variant': 'build', + 'target': '--bin bin1'}) + settings.load() + cmd = settings.get_command(cargo_settings.CARGO_COMMANDS['build']) + self.assertEqual(cmd, ['cargo', '+nightly', 'build', '--bin', 'bin1', + '--message-format=json']) + + def test_auto_target(self): + """Test run with "auto" target.""" + self._with_open_file('tests/multi-targets/src/bin/bin1.rs', + self._test_auto_target) + + def _test_auto_target(self, view): + window = view.window() + window.run_command('cargo_set_target', {'variant': 'run', + 'target': 'auto'}) + self._run_build_wait('run') + output = self._get_build_output(window) + # (?m) enables multiline mode. + self.assertRegex(output, '(?m)^bin1$') + + def test_run_with_args(self): + """Test run with args.""" + self._with_open_file('tests/multi-targets/src/bin/bin2.rs', + self._test_run_with_args) + + def _test_run_with_args(self, view): + window = view.window() + self._run_build_wait('run', + settings={'extra_run_args': 'this is a test', + 'target': '--bin bin2'}) + output = self._get_build_output(window) + self.assertRegex(output, '(?m)^this is a test$') + + def test_test(self): + """Test "Test" variant.""" + self._with_open_file('tests/multi-targets/src/bin/bin1.rs', + self._test_test) + + def _test_test(self, view): + window = view.window() + self._run_build_wait('test') + output = self._get_build_output(window) + self.assertRegex(output, '(?m)^test sample_test1 \.\.\. ok$') + self.assertRegex(output, '(?m)^test sample_test2 \.\.\. ok$') + + def test_test_with_args(self): + """Test "Test (with args) variant.""" + self._with_open_file('tests/multi-targets/tests/test2.rs', + self._test_test_with_args) + + def _test_test_with_args(self, view): + window = view.window() + self._run_build_wait('test', + settings={'extra_run_args': 'sample_test2'}) + output = self._get_build_output(window) + self.assertNotRegex(output, '(?m)^test sample_test1 \.\.\. ') + self.assertRegex(output, '(?m)^test sample_test2 \.\.\. ok') + + def test_bench(self): + """Test "Bench" variant.""" + self._with_open_file('tests/multi-targets/benches/bench1.rs', + self._test_bench) + + def _test_bench(self, view): + window = view.window() + window.run_command('cargo_set_toolchain', {'which': 'variant', + 'variant': 'bench', + 'toolchain': 'nightly'}) + self._run_build_wait('bench') + output = self._get_build_output(window) + self.assertRegex(output, '(?m)^test example1 \.\.\. bench:') + self.assertRegex(output, '(?m)^test example2 \.\.\. bench:') + + def test_clean(self): + """Test "Clean" variant.""" + self._with_open_file('tests/multi-targets/src/main.rs', + self._test_clean) + + def _test_clean(self, view): + self._run_build_wait() + target = os.path.join(package_root, exe('target/debug/multi-targets')) + self.assertTrue(os.path.exists(target)) + self._run_build_wait('clean') + self.assertFalse(os.path.exists(target)) + + def test_document(self): + """Test "Document" variant.""" + self._with_open_file('tests/multi-targets/src/lib.rs', + self._test_document) + + def _test_document(self, view): + target = os.path.join(package_root, + 'target/doc/multi_targets/index.html') + self.assertFalse(os.path.exists(target)) + self._run_build_wait('doc') + self.assertTrue(os.path.exists(target)) + + def test_clippy(self): + """Test "Clippy" variant.""" + self._with_open_file('tests/multi-targets/src/lib.rs', + self._test_document) + + def _test_clippy(self, view): + window = view.window() + window.run_command('cargo_set_toolchain', {'which': 'variant', + 'variant': 'clippy', + 'toolchain': 'nightly'}) + self._run_build_wait('clippy') + # This is a relatively simple test to verify Clippy has run. + msgs = messages.WINDOW_MESSAGES[window.id()] + lib_msgs = msgs['paths'][os.path.join(package_root, 'src/lib.rs')] + for msg in lib_msgs: + if 'char_lit_as_u8' in msg['message']: + break + else: + raise AssertionError('Failed to find char_lit_as_u8') + + def test_script(self): + """Test "Script" variant.""" + self._with_open_file('tests/multi-targets/mystery.rs', + self._test_script) + + def _test_script(self, view): + window = view.window() + self._run_build_wait('script') + output = self._get_build_output(window) + self.assertRegex(output, '(?m)^Hello Mystery$') diff --git a/tests/test_interrupt.py b/tests/test_interrupt.py new file mode 100644 index 00000000..ae007088 --- /dev/null +++ b/tests/test_interrupt.py @@ -0,0 +1,244 @@ +"""Tests to exercise interrupting rust threads.""" + +import sublime + +import glob +import os +import time +import types +from rust_test_common import * + + +pattern = os.path.normpath( + os.path.join(plugin_path, 'tests/slow-build/test-build')) + + +class TestInterrupt(TestBase): + + def setUp(self): + super(TestInterrupt, self).setUp() + self._cleanup() + self.terminated = [] + + def tearDown(self): + super(TestInterrupt, self).tearDown() + self._cleanup() + + def _cleanup(self): + [os.unlink(x) for x in self._files()] + + def _wrap_terminate(self, r_thread): + """Add wrapper around RustProc.terminate() to catch when it is + terminated.""" + def terminate(s): + self.terminated.append(s) + return r_thread.__class__.terminate(s) + r_thread.terminate = types.MethodType(terminate, r_thread) + + def test_slow_check(self): + """Test interrupting syntax check. + + This works by launching a thread to start the test, waiting 1 second, + then launching another thread which should interrupt the first. + + The slow-build crate has a build.rs which forces the build to take + about 3 seconds to complete. + + Unfortunately there is not a simple way to check if the build process + is running, so it just drops some files (like "test-build-start-#") to + indicate that it started and stopped. Not perfect, but it should + work. + + This test is sensitive to timings, so it may fail on a slow/busy + computer. If it's a problem, the sleeps can be made longer. + """ + self._with_open_file('tests/slow-build/src/lib.rs', + self._test_slow_check) + + def _test_slow_check(self, view): + self._cargo_clean(view) + + # Keep track of when a thread is terminated. + t1 = plugin.SyntaxCheckPlugin.RustSyntaxCheckThread(view) + t2 = plugin.SyntaxCheckPlugin.RustSyntaxCheckThread(view) + self._wrap_terminate(t1) + self._wrap_terminate(t2) + + # Start the syntax check threads. + t1.start() + + self._wait_for_start() + start = time.time() + + # Start a new thread to interrupt the first. + t2.start() + # Let the thread spin up. + time.sleep(0.5) + self.assertFalse(t1.is_alive()) + t1.join() + t2.join() + duration = time.time() - start + self.assertAlmostEqual(duration, 4.0, delta=1.0) + self.assertEqual(self.terminated, [t1]) + self.assertEqual(self._files(), + [pattern + '-start-1', + pattern + '-start-2', + pattern + '-end-1']) + + def test_build_cancel(self): + """Test manually canceling a build.""" + # So it doesn't hide the UnitTest output panel. + self._with_open_file('tests/slow-build/src/lib.rs', + self._test_build_cancel) + + def _test_build_cancel(self, view): + self._cargo_clean(view) + window = view.window() + self._run_build() + self._wait_for_start() + t = rust_thread.THREADS[view.window().id()] + self._wrap_terminate(t) + window.run_command('rust_cancel') + # Sleep long enough to make sure the build didn't continue running. + time.sleep(4) + self.assertEqual(self.terminated, [t]) + # Start, but no end. + self.assertEqual(self._files(), [pattern + '-start-1']) + + def test_syntax_check_cancel(self): + """Test manually canceling syntax check.""" + self._with_open_file('tests/slow-build/src/lib.rs', + self._test_syntax_check_cancel) + + def _test_syntax_check_cancel(self, view): + self._cargo_clean(view) + t = plugin.SyntaxCheckPlugin.RustSyntaxCheckThread(view) + self._wrap_terminate(t) + t.start() + self._wait_for_start() + view.window().run_command('rust_cancel') + # Sleep long enough to make sure the build didn't continue running. + time.sleep(4) + self.assertEqual(self.terminated, [t]) + # Start, but no end. + self.assertEqual(self._files(), [pattern + '-start-1']) + + def test_syntax_check_while_build(self): + """Test starting a syntax check while build is running.""" + self._with_open_file('tests/slow-build/src/lib.rs', + self._test_syntax_check_while_build) + + def _test_syntax_check_while_build(self, view): + self._cargo_clean(view) + window = view.window() + self._run_build() + self._wait_for_start() + build_t = rust_thread.THREADS[window.id()] + self._wrap_terminate(build_t) + # Start a syntax check, it should not be allowed to proceed. + check_t = plugin.SyntaxCheckPlugin.RustSyntaxCheckThread(view) + self._wrap_terminate(check_t) + # This thread will silently exit without running. + check_t.start() + time.sleep(4) + self.assertEqual(self.terminated, []) + self.assertEqual(self._files(), + [pattern + '-start-1', + pattern + '-end-1']) + + def test_build_while_syntax_check(self): + """Test starting a build while a syntax check is running.""" + self._with_open_file('tests/slow-build/src/lib.rs', + self._test_build_while_syntax_check) + + def _test_build_while_syntax_check(self, view): + self._cargo_clean(view) + window = view.window() + check_t = plugin.SyntaxCheckPlugin.RustSyntaxCheckThread(view) + self._wrap_terminate(check_t) + check_t.start() + self._wait_for_start() + # Should silently kill the syntax check thread. + self._run_build() + build_t = rust_thread.THREADS[window.id()] + self._wrap_terminate(build_t) + time.sleep(4) + self.assertEqual(self.terminated, [check_t]) + self.assertEqual(self._files(), + [pattern + '-start-1', + pattern + '-start-2', + pattern + '-end-1']) + + def test_build_with_save(self): + """Test starting a build with a dirty file.""" + self._with_open_file('tests/slow-build/src/lib.rs', + self._test_build_with_save) + + def _test_build_with_save(self, view): + self._cargo_clean(view) + window = view.window() + # Trigger on_save for syntax checking. + view.run_command('save') + # Doing this immediately afterwards should cancel the syntax check + # before it gets a chance to do much. + self._run_build() + build_t = rust_thread.THREADS[window.id()] + self._wrap_terminate(build_t) + time.sleep(4) + self.assertEqual(self._files(), + [pattern + '-start-1', + pattern + '-end-1']) + # Clear dirty flag so that closing the view does not pop up a + # confirmation box. + view.run_command('revert') + + def test_concurrent_build(self): + """Test starting builds at the same time.""" + self._with_open_file('tests/slow-build/src/lib.rs', + self._test_concurrent_build) + + def _test_concurrent_build(self, view): + ok_value = True + + def ok_cancel_dialog(msg, ok_title=None): + return ok_value + + orig_ok_cancel_dialog = sublime.ok_cancel_dialog + sublime.ok_cancel_dialog = ok_cancel_dialog + try: + self._cargo_clean(view) + window = view.window() + self._run_build() + self._wait_for_start() + build_t = rust_thread.THREADS[window.id()] + self._wrap_terminate(build_t) + # Start a second build. + self._run_build() + time.sleep(1) + self.assertEqual(self.terminated, [build_t]) + # Start again, but hit cancel. + ok_value = False + self._run_build() + time.sleep(4) + # Should not have interrupted. + self.assertEqual(self.terminated, [build_t]) + self.assertEqual(self._files(), + [pattern + '-start-1', + pattern + '-start-2', + pattern + '-end-1']) + finally: + sublime.ok_cancel_dialog = orig_ok_cancel_dialog + + def _wait_for_start(self): + for _ in range(50): + time.sleep(0.1) + if self._files() == [pattern + '-start-1']: + break + else: + raise AssertionError('Did not catch initial start: %r' % ( + self._files(),)) + + def _files(self): + files = glob.glob(pattern + '-*') + files.sort(key=os.path.getctime) + return files diff --git a/tests/test_syntax_check.py b/tests/test_syntax_check.py index 05aa5957..07e4068c 100755 --- a/tests/test_syntax_check.py +++ b/tests/test_syntax_check.py @@ -1,108 +1,14 @@ -import os -import queue -import re -import sys -import time -import unittest -import sublime -from pprint import pprint -# Depends on how you install the plugin. -plugin = sys.modules.get('sublime-rust', sys.modules.get('Rust Enhanced', None)) -if not plugin: - raise ValueError('Couldn\'t find Rust Enhanced plugin.') -plugin_path = tuple(plugin.__path__)[0] -if plugin_path.endswith('.sublime-package'): - raise ValueError('Cannot run test with compressed package.') - """Tests to exercise the on-save syntax checking. This currently runs on Rust 1.15. """ -# TODO -# - manual config targets - -class TestSyntaxCheck(unittest.TestCase): - - def _with_open_file(self, filename, f): - """Opens filename (relative to the plugin) in a new view, calls - f(view) to perform the tests. - """ - window = sublime.active_window() - path = os.path.join(plugin_path, filename) - view = window.open_file(path) - q = queue.Queue() - - def async_test_view(): - try: - # Wait for view to finish loading. - for n in range(500): - if view.is_loading(): - time.sleep(0.01) - else: - break - else: - raise AssertionError('View never loaded.') - # Run the tests on this view. - f(view) - except Exception as e: - q.put(e) - else: - q.put(None) - - try: - sublime.set_timeout_async(async_test_view, 0) - msg = q.get() - if msg: - raise msg - finally: - window.focus_view(view) - window.run_command('close_file') - - def test_multi_targets(self): - """Test automatic target detection.""" - - expected_targets = [ - # Exact target name matches. - ('src/lib.rs', [('src/lib.rs', '--lib')]), - ('src/main.rs', [('src/main.rs', '--bin multi-targets')]), - ('src/bin/bin1.rs', [('src/bin/bin1.rs', '--bin bin1')]), - ('src/bin/bin2.rs', [('src/bin/bin2.rs', '--bin bin2')]), - ('src/altmain.rs', [('src/altmain.rs', '--bin otherbin')]), - ('examples/ex1.rs', [('examples/ex1.rs', '--example ex1')]), - ('examples/ex2.rs', [('examples/ex2.rs', '--example ex2')]), - ('examples/exlib.rs', [('examples/exlib.rs', '--example exlib')]), - ('tests/test1.rs', [('tests/test1.rs', '--test test1')]), - ('tests/test2.rs', [('tests/test2.rs', '--test test2')]), - ('benches/bench1.rs', [('benches/bench1.rs', '--bench bench1')]), - ('benches/bench2.rs', [('benches/bench2.rs', '--bench bench2')]), - # Random module in src/, defaults to --lib. - ('src/lmod1.rs', [('src/lib.rs', '--lib')]), - # Target failure. Perhaps this should run rustc directly? - ('mystery.rs', []), - ('build.rs', []), - # Shared module in test, not possible to easily determine which - # test it belongs to. - ('tests/common/helpers.rs', [('tests/test1.rs', '--test test1'), - ('tests/test2.rs', '--test test2')]), - # proc-macro kind - ('pmacro/src/lib.rs', [('pmacro/src/lib.rs', '--lib')]), - ] - for (path, targets) in expected_targets: - path = os.path.join('tests', 'multi-targets', path) - targets = [(os.path.normpath( - os.path.join(plugin_path, 'tests', 'multi-targets', x[0])), x[1]) for x in targets] - self._with_open_file(path, lambda view: self._test_multi_targets(view, targets)) +import re +from rust_test_common import * - def _test_multi_targets(self, view, expected_targets): - expected_targets.sort() - # Check the targets match expectation. - e = plugin.SyntaxCheckPlugin.rustPluginSyntaxCheckEvent() - targets = e.determine_targets(view.settings(), view.file_name()) - targets.sort() - self.assertEqual(targets, expected_targets) +class TestSyntaxCheck(TestBase): def test_messages(self): """Test message generation. @@ -128,14 +34,16 @@ def test_messages(self): 'error-tests/tests/arg-count-mismatch.rs', # "children" with spans 'error-tests/tests/binop-mul-bool.rs', - # This is currently broken. - #'error-tests/tests/const-err.rs', + # This is currently broken (-Zno-trans does not produce errors). + # 'error-tests/tests/const-err.rs', # Macro-expansion test. 'error-tests/tests/dead-code-ret.rs', # "code" test 'error-tests/tests/E0005.rs', # unicode in JSON 'error-tests/tests/test_unicode.rs', + # message with suggestion + 'error-tests/tests/cast-to-unsized-trait-object-suggestion.rs', # error in a cfg(test) section 'error-tests/src/lib.rs', # Workspace tests. @@ -150,22 +58,36 @@ def test_messages(self): def _test_messages(self, view): # Trigger the generation of messages. - cwd = os.path.dirname(view.file_name()) - e = plugin.SyntaxCheckPlugin.rustPluginSyntaxCheckEvent() phantoms = [] regions = [] + def collect_phantoms(v, key, region, content, layout, on_navigate): if v == view: phantoms.append((region, content)) + def collect_regions(v, key, regions, scope, icon, flags): if v == view: regions.extend(regions) - e._add_phantom = collect_phantoms - e._add_regions = collect_regions + + m = plugin.rust.messages + orig_add_phantom = m._sublime_add_phantom + orig_add_regions = m._sublime_add_regions + m._sublime_add_phantom = collect_phantoms + m._sublime_add_regions = collect_regions + try: + self._test_messages2(view, phantoms, regions) + finally: + m._sublime_add_phantom = orig_add_phantom + m._sublime_add_regions = orig_add_regions + + def _test_messages2(self, view, phantoms, regions): + e = plugin.SyntaxCheckPlugin.RustSyntaxCheckEvent() # Force Cargo to recompile. - e.run_cargo(['clean'], cwd=cwd) + self._cargo_clean(view) # os.utime(view.file_name()) 1 second resolution is not enough - e.on_post_save_async(view) + e.on_post_save(view) + # Wait for it to finish. + self._get_rust_thread().join() pattern = '(\^+)(WARN|ERR|HELP|NOTE) (.+)' expected_messages = view.find_all(pattern) for emsg_r in expected_messages: diff --git a/tests/test_target_detect.py b/tests/test_target_detect.py new file mode 100644 index 00000000..6e47851e --- /dev/null +++ b/tests/test_target_detect.py @@ -0,0 +1,55 @@ +"""Tests for automatic target detection.""" + +from rust_test_common import * + +# TODO +# - manual config targets + + +class TestTargetDetect(TestBase): + + def test_multi_targets(self): + """Test automatic target detection.""" + + expected_targets = [ + # Exact target name matches. + ('src/lib.rs', [('src/lib.rs', '--lib')]), + ('src/main.rs', [('src/main.rs', '--bin multi-targets')]), + ('src/bin/bin1.rs', [('src/bin/bin1.rs', '--bin bin1')]), + ('src/bin/bin2.rs', [('src/bin/bin2.rs', '--bin bin2')]), + ('src/altmain.rs', [('src/altmain.rs', '--bin otherbin')]), + ('examples/ex1.rs', [('examples/ex1.rs', '--example ex1')]), + ('examples/ex2.rs', [('examples/ex2.rs', '--example ex2')]), + ('examples/exlib.rs', [('examples/exlib.rs', '--example exlib')]), + ('tests/test1.rs', [('tests/test1.rs', '--test test1')]), + ('tests/test2.rs', [('tests/test2.rs', '--test test2')]), + ('benches/bench1.rs', [('benches/bench1.rs', '--bench bench1')]), + ('benches/bench2.rs', [('benches/bench2.rs', '--bench bench2')]), + # Random module in src/, defaults to --lib. + ('src/lmod1.rs', [('src/lib.rs', '--lib')]), + # Target failure. Perhaps this should run rustc directly? + ('mystery.rs', []), + ('build.rs', []), + # Shared module in test, not possible to easily determine which + # test it belongs to. + ('tests/common/helpers.rs', [('tests/test1.rs', '--test test1'), + ('tests/test2.rs', '--test test2')]), + # proc-macro kind + ('pmacro/src/lib.rs', [('pmacro/src/lib.rs', '--lib')]), + + ] + for (path, targets) in expected_targets: + path = os.path.join('tests', 'multi-targets', path) + targets = [(os.path.normpath( + os.path.join(plugin_path, 'tests', 'multi-targets', x[0])), + x[1].split()) for x in targets] + self._with_open_file(path, + lambda view: self._test_multi_targets(view, targets)) + + def _test_multi_targets(self, view, expected_targets): + expected_targets.sort() + # Check the targets match expectation. + t = target_detect.TargetDetector(view.window()) + targets = t.determine_targets(view.file_name()) + targets.sort() + self.assertEqual(targets, expected_targets) From 621dbe781eb13daeff3ca62acacca83bf08a95ce Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Mon, 13 Mar 2017 09:11:44 -0700 Subject: [PATCH 02/32] Fix wrapping of commands in GitHub flavored markdown. --- docs/build.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/build.md b/docs/build.md index 5380a74c..e0e12e54 100644 --- a/docs/build.md +++ b/docs/build.md @@ -30,16 +30,16 @@ Ctrl-Shift-B / ⌘-Shift-B). They are: Variant | Command | Description ------- | ------- | ----------- -(Default) | cargo build | Builds the project. -Run | cargo run | Runs the binary. -Run (with args)... | cargo run -- *args* | Runs the binary with optional arguments you specify. -Test | cargo test | Runs unit and integration tests. -Test (with args)... | cargo test -- *args* | Runs the test with optional arguments you specify. -Bench | cargo bench | Runs benchmarks. -Clean | cargo clean | Removes all built files. -Document | cargo doc | Builds package documentation. -Clippy | cargo clippy | Runs [Clippy](https://github.com/Manishearth/rust-clippy). Clippy must be installed, and currently requires the nightly toolchain. -Script | cargo script $path | Runs [Cargo Script](https://github.com/DanielKeep/cargo-script). Cargo Script must be installed. This is an addon that allows you to run a Rust source file like a script (without a Cargo.toml manifest). +(Default) | cargo build | Builds the project. +Run | cargo run | Runs the binary. +Run (with args)... | cargo run -⁠-⁠ *args* | Runs the binary with optional arguments you specify. +Test | cargo test | Runs unit and integration tests. +Test (with args)... | cargo test -⁠-⁠ *args* | Runs the test with optional arguments you specify. +Bench | cargo bench | Runs benchmarks. +Clean | cargo clean | Removes all built files. +Document | cargo doc | Builds package documentation. +Clippy | cargo clippy | Runs [Clippy](https://github.com/Manishearth/rust-clippy). Clippy must be installed, and currently requires the nightly toolchain. +Script | cargo script $path | Runs [Cargo Script](https://github.com/DanielKeep/cargo-script). Cargo Script must be installed. This is an addon that allows you to run a Rust source file like a script (without a Cargo.toml manifest). ## Cargo Project Settings From d2e13ee3ce8fb604790e85fff7c5fb80e68ddb99 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Thu, 16 Mar 2017 16:12:53 -0700 Subject: [PATCH 03/32] Minor fixes to unittests for Rust 1.16. --- rust/__init__.py | 1 + rust/semver.py | 349 ++++++++++++++++++ rust/util.py | 14 + tests/error-tests/src/lib.rs | 14 +- tests/test_syntax_check.py | 39 +- tests/test_target_detect.py | 5 +- .../workspace1/src/anothermod/mod.rs | 6 +- tests/workspace/workspace2/src/lib.rs | 4 +- tests/workspace/workspace2/src/somemod.rs | 6 +- 9 files changed, 410 insertions(+), 28 deletions(-) create mode 100644 rust/semver.py diff --git a/rust/__init__.py b/rust/__init__.py index e69de29b..01edd27e 100644 --- a/rust/__init__.py +++ b/rust/__init__.py @@ -0,0 +1 @@ +from . import semver diff --git a/rust/semver.py b/rust/semver.py new file mode 100644 index 00000000..d8b9af6e --- /dev/null +++ b/rust/semver.py @@ -0,0 +1,349 @@ +# https://github.com/k-bx/python-semver +# +# Copyright (c) 2013, Konstantine Rybnikov +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright notice, this +# list of conditions and the following disclaimer in the documentation and/or +# other materials provided with the distribution. +# +# Neither the name of the {organization} nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +""" +Python helper for Semantic Versioning (http://semver.org/) +""" + +import collections +import re +import sys + + +__version__ = '2.7.5' +__author__ = 'Kostiantyn Rybnikov' +__author_email__ = 'k-bx@k-bx.com' + +_REGEX = re.compile( + r""" + ^ + (?P(?:0|[1-9][0-9]*)) + \. + (?P(?:0|[1-9][0-9]*)) + \. + (?P(?:0|[1-9][0-9]*)) + (\-(?P + (?:0|[1-9A-Za-z-][0-9A-Za-z-]*) + (\.(?:0|[1-9A-Za-z-][0-9A-Za-z-]*))* + ))? + (\+(?P + [0-9A-Za-z-]+ + (\.[0-9A-Za-z-]+)* + ))? + $ + """, re.VERBOSE) + +_LAST_NUMBER = re.compile(r'(?:[^\d]*(\d+)[^\d]*)+') + +if not hasattr(__builtins__, 'cmp'): + def cmp(a, b): + return (a > b) - (a < b) + + +def parse(version): + """Parse version to major, minor, patch, pre-release, build parts. + + :param version: version string + :return: dictionary with the keys 'build', 'major', 'minor', 'patch', + and 'prerelease'. The prerelease or build keys can be None + if not provided + :rtype: dict + """ + match = _REGEX.match(version) + if match is None: + raise ValueError('%s is not valid SemVer string' % version) + + version_parts = match.groupdict() + + version_parts['major'] = int(version_parts['major']) + version_parts['minor'] = int(version_parts['minor']) + version_parts['patch'] = int(version_parts['patch']) + + return version_parts + + +VersionInfo = collections.namedtuple( + 'VersionInfo', 'major minor patch prerelease build') + +# Only change it for Python > 3 as it is readonly +# for version 2 +if sys.version_info > (3, 0): + VersionInfo.__doc__ = """ +:param int major: version when you make incompatible API changes. +:param int minor: version when you add functionality in + a backwards-compatible manner. +:param int patch: version when you make backwards-compatible bug fixes. +:param str prerelease: an optional prerelease string +:param str build: an optional build string + +>>> import semver +>>> ver = semver.parse('3.4.5-pre.2+build.4') +>>> ver +{'build': 'build.4', 'major': 3, 'minor': 4, 'patch': 5, +'prerelease': 'pre.2'} +""" + + +def parse_version_info(version): + """Parse version string to a VersionInfo instance. + + :param version: version string + :return: a :class:`VersionInfo` instance + :rtype: :class:`VersionInfo` + """ + parts = parse(version) + version_info = VersionInfo( + parts['major'], parts['minor'], parts['patch'], + parts['prerelease'], parts['build']) + + return version_info + + +def compare(ver1, ver2): + """Compare two versions + + :param ver1: version string 1 + :param ver2: version string 2 + :return: The return value is negative if ver1 < ver2, + zero if ver1 == ver2 and strictly positive if ver1 > ver2 + :rtype: int + """ + def nat_cmp(a, b): + def convert(text): + return int(text) if re.match('[0-9]+', text) else text + + def split_key(key): + return [convert(c) for c in key.split('.')] + + def cmp_prerelease_tag(a, b): + if isinstance(a, int) and isinstance(b, int): + return cmp(a, b) + elif isinstance(a, int): + return -1 + elif isinstance(b, int): + return 1 + else: + return cmp(a, b) + + a, b = a or '', b or '' + a_parts, b_parts = split_key(a), split_key(b) + for sub_a, sub_b in zip(a_parts, b_parts): + cmp_result = cmp_prerelease_tag(sub_a, sub_b) + if cmp_result != 0: + return cmp_result + else: + return cmp(len(a), len(b)) + + def compare_by_keys(d1, d2): + for key in ['major', 'minor', 'patch']: + v = cmp(d1.get(key), d2.get(key)) + if v: + return v + + rc1, rc2 = d1.get('prerelease'), d2.get('prerelease') + rccmp = nat_cmp(rc1, rc2) + + if not rccmp: + return 0 + if not rc1: + return 1 + elif not rc2: + return -1 + + return rccmp + + v1, v2 = parse(ver1), parse(ver2) + + return compare_by_keys(v1, v2) + + +def match(version, match_expr): + """Compare two versions through a comparison + + :param str version: a version string + :param str match_expr: operator and version; valid operators are + < smaller than + > greater than + >= greator or equal than + <= smaller or equal than + == equal + != not equal + :return: True if the expression matches the version, otherwise False + :rtype: bool + """ + prefix = match_expr[:2] + if prefix in ('>=', '<=', '==', '!='): + match_version = match_expr[2:] + elif prefix and prefix[0] in ('>', '<'): + prefix = prefix[0] + match_version = match_expr[1:] + else: + raise ValueError("match_expr parameter should be in format , " + "where is one of " + "['<', '>', '==', '<=', '>=', '!=']. " + "You provided: %r" % match_expr) + + possibilities_dict = { + '>': (1,), + '<': (-1,), + '==': (0,), + '!=': (-1, 1), + '>=': (0, 1), + '<=': (-1, 0) + } + + possibilities = possibilities_dict[prefix] + cmp_res = compare(version, match_version) + + return cmp_res in possibilities + + +def max_ver(ver1, ver2): + """Returns the greater version of two versions + + :param ver1: version string 1 + :param ver2: version string 2 + :return: the greater version of the two + :rtype: :class:`VersionInfo` + """ + cmp_res = compare(ver1, ver2) + if cmp_res == 0 or cmp_res == 1: + return ver1 + else: + return ver2 + + +def min_ver(ver1, ver2): + """Returns the smaller version of two versions + + :param ver1: version string 1 + :param ver2: version string 2 + :return: the smaller version of the two + :rtype: :class:`VersionInfo` + """ + cmp_res = compare(ver1, ver2) + if cmp_res == 0 or cmp_res == -1: + return ver1 + else: + return ver2 + + +def format_version(major, minor, patch, prerelease=None, build=None): + """Format a version according to the Semantic Versioning specification + + :param str major: the required major part of a version + :param str minor: the required minor part of a version + :param str patch: the required patch part of a version + :param str prerelease: the optional prerelease part of a version + :param str build: the optional build part of a version + :return: the formatted string + :rtype: str + """ + version = "%d.%d.%d" % (major, minor, patch) + if prerelease is not None: + version = version + "-%s" % prerelease + + if build is not None: + version = version + "+%s" % build + + return version + + +def _increment_string(string): + """ + Look for the last sequence of number(s) in a string and increment, from: + http://code.activestate.com/recipes/442460-increment-numbers-in-a-string/#c1 + """ + match = _LAST_NUMBER.search(string) + if match: + next_ = str(int(match.group(1)) + 1) + start, end = match.span(1) + string = string[:max(end - len(next_), start)] + next_ + string[end:] + return string + + +def bump_major(version): + """Raise the major part of the version + + :param: version string + :return: the raised version string + :rtype: str + """ + verinfo = parse(version) + return format_version(verinfo['major'] + 1, 0, 0) + + +def bump_minor(version): + """Raise the minor part of the version + + :param: version string + :return: the raised version string + :rtype: str + """ + verinfo = parse(version) + return format_version(verinfo['major'], verinfo['minor'] + 1, 0) + + +def bump_patch(version): + """Raise the patch part of the version + + :param: version string + :return: the raised version string + :rtype: str + """ + verinfo = parse(version) + return format_version(verinfo['major'], verinfo['minor'], + verinfo['patch'] + 1) + + +def bump_prerelease(version): + """Raise the prerelease part of the version + + :param: version string + :return: the raised version string + :rtype: str + """ + verinfo = parse(version) + verinfo['prerelease'] = _increment_string(verinfo['prerelease'] or 'rc.0') + return format_version(verinfo['major'], verinfo['minor'], verinfo['patch'], + verinfo['prerelease']) + + +def bump_build(version): + """Raise the build part of the version + + :param: version string + :return: the raised version string + :rtype: str + """ + verinfo = parse(version) + verinfo['build'] = _increment_string(verinfo['build'] or 'build.0') + return format_version(verinfo['major'], verinfo['minor'], verinfo['patch'], + verinfo['prerelease'], verinfo['build']) diff --git a/rust/util.py b/rust/util.py index 240ae5f8..2f6d6c64 100644 --- a/rust/util.py +++ b/rust/util.py @@ -53,3 +53,17 @@ def debug(msg, *args): n = threading.current_thread().name print('%s +%.3f ' % (n, d), end='') print(msg % args) + + +def get_rustc_version(window, cwd): + """Returns the rust version for the given directory. + + :Returns: A string such as '1.16.0' or '1.17.0-nightly'. + """ + from . import rust_proc + output = rust_proc.check_output(window, ['rustc', '--version'], cwd) + # Example outputs: + # rustc 1.15.1 (021bd294c 2017-02-08) + # rustc 1.16.0-beta.2 (bc15d5281 2017-02-16) + # rustc 1.17.0-nightly (306035c21 2017-02-18) + return output.split()[1] diff --git a/tests/error-tests/src/lib.rs b/tests/error-tests/src/lib.rs index 59005a96..35479dde 100644 --- a/tests/error-tests/src/lib.rs +++ b/tests/error-tests/src/lib.rs @@ -1,15 +1,19 @@ #[cfg(test)] mod tests { fn bad(a: DoesNotExist) { - // ^ERR undefined or not in scope - // ^^ERR type name - // ^^^HELP no candidates + // ^ERR(<1.16.0) undefined or not in scope + // ^^ERR(<1.16.0) type name + // ^^^HELP(<1.16.0) no candidates + // ^^^^ERR(>=1.16.0) not found in this scope + // ^^^^^ERR(>=1.16.0) cannot find type `DoesNotExist` } #[test] fn it_works() { asdf - // ^ERR unresolved name - // ^^ERR unresolved name + // ^ERR(<1.16.0) unresolved name + // ^^ERR(<1.16.0) unresolved name + // ^^^ERR(>=1.16.0) not found in this scope + // ^^^^ERR(>=1.16.0) cannot find value } } diff --git a/tests/test_syntax_check.py b/tests/test_syntax_check.py index 07e4068c..c4de1e0b 100755 --- a/tests/test_syntax_check.py +++ b/tests/test_syntax_check.py @@ -24,6 +24,9 @@ def test_messages(self): formatting of messages. Hopefully these examples are relatively stable for now. """ + self.rustc_version = util.get_rustc_version(sublime.active_window(), + plugin_path) + to_test = [ 'multi-targets/src/lib.rs', 'multi-targets/src/lmod1.rs', @@ -88,7 +91,7 @@ def _test_messages2(self, view, phantoms, regions): e.on_post_save(view) # Wait for it to finish. self._get_rust_thread().join() - pattern = '(\^+)(WARN|ERR|HELP|NOTE) (.+)' + pattern = '(\^+)(WARN|ERR|HELP|NOTE)(\([^)]+\))? (.+)' expected_messages = view.find_all(pattern) for emsg_r in expected_messages: row, col = view.rowcol(emsg_r.begin()) @@ -103,20 +106,24 @@ def _test_messages2(self, view, phantoms, regions): 'NOTE': 'note', 'HELP': 'help', }[msg_type] - msg_content = m.group(3) - for i, (region, content) in enumerate(phantoms): - # python 3.4 can use html.unescape() - content = content.replace(' ', ' ')\ - .replace('&', '&')\ - .replace('<', '<')\ - .replace('>', '>') - r_row, r_col = view.rowcol(region.end()) - if r_row == msg_row and msg_content in content: - self.assertIn(msg_type_text, content) - break - else: - raise AssertionError('Did not find expected message "%s:%s" on line %r for file %r' % ( - msg_type, msg_content, msg_row, view.file_name())) - del phantoms[i] + semver = m.group(3) + msg_content = m.group(4) + if not semver or \ + plugin.rust.semver.match(self.rustc_version, semver[1:-1]): + for i, (region, content) in enumerate(phantoms): + # python 3.4 can use html.unescape() + content = content.replace(' ', ' ')\ + .replace('&', '&')\ + .replace('<', '<')\ + .replace('>', '>') + r_row, r_col = view.rowcol(region.end()) + print('Checking for %r in %r' % (msg_content, content)) + if r_row == msg_row and msg_content in content: + self.assertIn(msg_type_text, content) + break + else: + raise AssertionError('Did not find expected message "%s:%s" on line %r for file %r' % ( + msg_type, msg_content, msg_row, view.file_name())) + del phantoms[i] if len(phantoms): raise AssertionError('Got extra phantoms for %r: %r' % (view.file_name(), phantoms)) diff --git a/tests/test_target_detect.py b/tests/test_target_detect.py index 6e47851e..880a1de3 100644 --- a/tests/test_target_detect.py +++ b/tests/test_target_detect.py @@ -20,7 +20,10 @@ def test_multi_targets(self): ('src/altmain.rs', [('src/altmain.rs', '--bin otherbin')]), ('examples/ex1.rs', [('examples/ex1.rs', '--example ex1')]), ('examples/ex2.rs', [('examples/ex2.rs', '--example ex2')]), - ('examples/exlib.rs', [('examples/exlib.rs', '--example exlib')]), + # Unfortunately the fix for this missed the 1.16 deadline, wait + # for 1.17 to uncomment this. See + # https://github.com/rust-lang/cargo/pull/3668 + # ('examples/exlib.rs', [('examples/exlib.rs', '--example exlib')]), ('tests/test1.rs', [('tests/test1.rs', '--test test1')]), ('tests/test2.rs', [('tests/test2.rs', '--test test2')]), ('benches/bench1.rs', [('benches/bench1.rs', '--bench bench1')]), diff --git a/tests/workspace/workspace1/src/anothermod/mod.rs b/tests/workspace/workspace1/src/anothermod/mod.rs index 12d1afc0..1b6140eb 100644 --- a/tests/workspace/workspace1/src/anothermod/mod.rs +++ b/tests/workspace/workspace1/src/anothermod/mod.rs @@ -1,5 +1,7 @@ fn f() { asdf(); - // ^ERR unresolved name - // ^^ERR unresolved name `asdf` + // ^ERR(<1.16.0) unresolved name + // ^^ERR(<1.16.0) unresolved name `asdf` + // ^^^ERR(>=1.16.0) not found in this scope + // ^^^^ERR(>=1.16.0) cannot find function } diff --git a/tests/workspace/workspace2/src/lib.rs b/tests/workspace/workspace2/src/lib.rs index 1009be60..d5094026 100644 --- a/tests/workspace/workspace2/src/lib.rs +++ b/tests/workspace/workspace2/src/lib.rs @@ -5,8 +5,8 @@ trait Trait {} pub fn f() { let x = Box::new(0u32); let y: &Trait = x; - // ^ERR expected &Trait, found box + // ^ERR expected &Trait, found // ^^ERR mismatched types // ^^^NOTE expected type `&Trait` - // ^^^^NOTE found type `Box` + // ^^^^NOTE(<1.16.0) found type } diff --git a/tests/workspace/workspace2/src/somemod.rs b/tests/workspace/workspace2/src/somemod.rs index 19bb1fa0..8607dbc5 100644 --- a/tests/workspace/workspace2/src/somemod.rs +++ b/tests/workspace/workspace2/src/somemod.rs @@ -1,6 +1,8 @@ fn f() { someerr - // ^ERR unresolved name - // ^^ERR unresolved name `someerr` + // ^ERR(<1.16.0) unresolved name + // ^^ERR(<1.16.0) unresolved name `someerr` + // ^^^ERR(>=1.16.0) not found in this scope + // ^^^^ERR(>=1.16.0) cannot find value } From 81aadd9eeecbcbbf150ef962e10b742f3032d071 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Fri, 17 Mar 2017 15:06:01 -0700 Subject: [PATCH 04/32] Add support for "cargo check". --- RustEnhanced.sublime-build | 4 ++ SyntaxCheckPlugin.py | 24 ++++++++---- rust/cargo_settings.py | 9 +++++ rust/messages.py | 10 ++++- tests/error-tests/examples/err_ex.rs | 3 ++ tests/error-tests/src/lib.rs | 8 ++-- tests/rust_test_common.py | 9 +++++ tests/test_cargo_build.py | 56 +++++++++++++++++++--------- tests/test_syntax_check.py | 44 +++++++++++++++++----- 9 files changed, 127 insertions(+), 40 deletions(-) create mode 100644 tests/error-tests/examples/err_ex.rs diff --git a/RustEnhanced.sublime-build b/RustEnhanced.sublime-build index e24b182e..9488da5f 100644 --- a/RustEnhanced.sublime-build +++ b/RustEnhanced.sublime-build @@ -15,6 +15,10 @@ "wants_run_args": true } }, + { + "name": "Check", + "command": "check", + }, { "name": "Test", "command": "test", diff --git a/SyntaxCheckPlugin.py b/SyntaxCheckPlugin.py index fb29a857..18345a80 100755 --- a/SyntaxCheckPlugin.py +++ b/SyntaxCheckPlugin.py @@ -103,13 +103,23 @@ def get_rustc_messages(self): td = target_detect.TargetDetector(self.window) targets = td.determine_targets(self.triggered_file_name) for (target_src, target_args) in targets: - cmd = ['cargo', 'rustc'] - cmd.extend(target_args) - cmd.extend(['--', '-Zno-trans', '-Zunstable-options', - '--error-format=json']) - if util.get_setting('rust_syntax_checking_include_tests', True): - if not ('--test' in target_args or '--bench' in target_args): - cmd.append('--test') + method = util.get_setting('rust_syntax_checking_method', 'no-trans') + if method == 'check': + cmd = ['cargo', 'check', '--message-format=json'] + cmd.extend(target_args) + else: + cmd = ['cargo', 'rustc'] + cmd.extend(target_args) + cmd.extend(['--', '-Zno-trans', '-Zunstable-options', + '--error-format=json']) + if util.get_setting('rust_syntax_checking_include_tests', True): + if not ('--test' in target_args or '--bench' in target_args): + # Including the test harness has a few drawbacks. + # missing_docs lint is disabled (see + # https://github.com/rust-lang/sublime-rust/issues/156) + # It also disables the "main function not found" error for + # binaries. + cmd.append('--test') p = rust_proc.RustProc() self.current_target_src = target_src p.run(self.window, cmd, self.cwd, self) diff --git a/rust/cargo_settings.py b/rust/cargo_settings.py index 4d8f811e..8de76127 100644 --- a/rust/cargo_settings.py +++ b/rust/cargo_settings.py @@ -59,6 +59,15 @@ 'allows_features': True, 'allows_json': True, }, + 'check': { + 'name': 'Check', + 'command': 'check', + 'allows_target': True, + 'allows_target_triple': True, + 'allows_release': True, + 'allows_features': True, + 'allows_json': True, + }, 'test': { 'name': 'Test', 'command': 'test', diff --git a/rust/messages.py b/rust/messages.py index 32b1df96..c3334add 100644 --- a/rust/messages.py +++ b/rust/messages.py @@ -345,7 +345,7 @@ def add_rust_messages(window, cwd, info, target_path, msg_cb): - `window`: Sublime Window object. - `cwd`: Directory where cargo/rustc was run. - - `info`: Dictionary of messages from rustc. + - `info`: Dictionary of messages from rustc or cargo. - `target_path`: Absolute path to the top-level source file of the target (lib.rs, main.rs, etc.). May be None if it is not known. - `msg_cb`: Function called for each message (if not None). Parameters @@ -358,6 +358,14 @@ def add_rust_messages(window, cwd, info, target_path, msg_cb): - `message`: Text of the message. - `level`: Rust level ('error', 'warning', 'note', etc.) """ + # cargo check emits in a slightly different format. + if 'reason' in info: + if info['reason'] == 'compiler-message': + info = info['message'] + else: + # cargo may emit various other messages, like + # 'compiler-artifact' or 'build-script-executed'. + return _add_rust_messages(window, cwd, info, target_path, msg_cb, {}) diff --git a/tests/error-tests/examples/err_ex.rs b/tests/error-tests/examples/err_ex.rs new file mode 100644 index 00000000..12fbe066 --- /dev/null +++ b/tests/error-tests/examples/err_ex.rs @@ -0,0 +1,3 @@ +fn main() { + asdf(); +} diff --git a/tests/error-tests/src/lib.rs b/tests/error-tests/src/lib.rs index 35479dde..89cf75f4 100644 --- a/tests/error-tests/src/lib.rs +++ b/tests/error-tests/src/lib.rs @@ -4,8 +4,8 @@ mod tests { // ^ERR(<1.16.0) undefined or not in scope // ^^ERR(<1.16.0) type name // ^^^HELP(<1.16.0) no candidates - // ^^^^ERR(>=1.16.0) not found in this scope - // ^^^^^ERR(>=1.16.0) cannot find type `DoesNotExist` + // ^^^^ERR(>=1.16.0,test) not found in this scope + // ^^^^^ERR(>=1.16.0,test) cannot find type `DoesNotExist` } #[test] @@ -13,7 +13,7 @@ mod tests { asdf // ^ERR(<1.16.0) unresolved name // ^^ERR(<1.16.0) unresolved name - // ^^^ERR(>=1.16.0) not found in this scope - // ^^^^ERR(>=1.16.0) cannot find value + // ^^^ERR(>=1.16.0,test) not found in this scope + // ^^^^ERR(>=1.16.0,test) cannot find value } } diff --git a/tests/rust_test_common.py b/tests/rust_test_common.py index 0525202b..a151a2bc 100644 --- a/tests/rust_test_common.py +++ b/tests/rust_test_common.py @@ -22,6 +22,15 @@ target_detect = plugin.rust.target_detect messages = plugin.rust.messages util = plugin.rust.util +semver = plugin.rust.semver + + +def unescape(s): + # python 3.4 can use html.unescape() + return s.replace(' ', ' ')\ + .replace('&', '&')\ + .replace('<', '<')\ + .replace('>', '>') class TestBase(unittest.TestCase): diff --git a/tests/test_cargo_build.py b/tests/test_cargo_build.py index 05d399c1..6169c052 100644 --- a/tests/test_cargo_build.py +++ b/tests/test_cargo_build.py @@ -2,12 +2,12 @@ import fnmatch import os +import re import sys -import time from rust_test_common import * -package_root = os.path.join(plugin_path, +multi_target_root = os.path.join(plugin_path, 'tests/multi-targets') @@ -33,7 +33,7 @@ def _get_build_output(self, window): def setUp(self): super(TestCargoBuild, self).setUp() - self._cargo_clean(package_root) + self._cargo_clean(multi_target_root) def test_regular_build(self): """Test plain Cargo build.""" @@ -42,7 +42,7 @@ def test_regular_build(self): def _test_regular_build(self, view): self._run_build_wait() - path = os.path.join(package_root, exe('target/debug/multi-targets')) + path = os.path.join(multi_target_root, exe('target/debug/multi-targets')) self.assertTrue(os.path.exists(path)) def test_build_with_target(self): @@ -69,11 +69,11 @@ def _test_build_with_target(self, view): ] window = view.window() for target, expected_files in targets: - self._cargo_clean(package_root) + self._cargo_clean(multi_target_root) window.run_command('cargo_set_target', {'variant': 'build', 'target': target}) self._run_build_wait() - debug = os.path.join(package_root, 'target/debug') + debug = os.path.join(multi_target_root, 'target/debug') files = os.listdir(debug) files = files + [os.path.join('examples', x) for x in os.listdir(os.path.join(debug, 'examples'))] @@ -99,18 +99,18 @@ def _test_profile(self, view): 'profile': 'release'}) self._run_build_wait() self.assertTrue(os.path.exists( - os.path.join(package_root, exe('target/release/multi-targets')))) + os.path.join(multi_target_root, exe('target/release/multi-targets')))) self.assertFalse(os.path.exists( - os.path.join(package_root, 'target/debug'))) + os.path.join(multi_target_root, 'target/debug'))) - self._cargo_clean(package_root) + self._cargo_clean(multi_target_root) window.run_command('cargo_set_profile', {'target': None, 'profile': 'dev'}) self._run_build_wait() self.assertFalse(os.path.exists( - os.path.join(package_root, exe('target/release/multi-targets')))) + os.path.join(multi_target_root, exe('target/release/multi-targets')))) self.assertTrue(os.path.exists( - os.path.join(package_root, 'target/debug'))) + os.path.join(multi_target_root, 'target/debug'))) def test_target_triple(self): """Test target triple.""" @@ -218,6 +218,22 @@ def _test_test_with_args(self, view): self.assertNotRegex(output, '(?m)^test sample_test1 \.\.\. ') self.assertRegex(output, '(?m)^test sample_test2 \.\.\. ok') + def test_check(self): + """Test "Check" variant.""" + rustc_version = util.get_rustc_version(sublime.active_window(), + plugin_path) + if plugin.rust.semver.match(rustc_version, '<1.16.0'): + print('Skipping "Check" test, need rustc >= 1.16') + return + self._with_open_file('tests/error-tests/examples/err_ex.rs', + self._test_check) + + def _test_check(self, view): + self._run_build_wait('check', + settings={'target': '--example err_ex'}) + self._check_added_message(view.window(), view.file_name(), + r'not found in this scope') + def test_bench(self): """Test "Bench" variant.""" self._with_open_file('tests/multi-targets/benches/bench1.rs', @@ -240,7 +256,8 @@ def test_clean(self): def _test_clean(self, view): self._run_build_wait() - target = os.path.join(package_root, exe('target/debug/multi-targets')) + target = os.path.join(multi_target_root, + exe('target/debug/multi-targets')) self.assertTrue(os.path.exists(target)) self._run_build_wait('clean') self.assertFalse(os.path.exists(target)) @@ -251,7 +268,7 @@ def test_document(self): self._test_document) def _test_document(self, view): - target = os.path.join(package_root, + target = os.path.join(multi_target_root, 'target/doc/multi_targets/index.html') self.assertFalse(os.path.exists(target)) self._run_build_wait('doc') @@ -260,7 +277,7 @@ def _test_document(self, view): def test_clippy(self): """Test "Clippy" variant.""" self._with_open_file('tests/multi-targets/src/lib.rs', - self._test_document) + self._test_clippy) def _test_clippy(self, view): window = view.window() @@ -269,13 +286,16 @@ def _test_clippy(self, view): 'toolchain': 'nightly'}) self._run_build_wait('clippy') # This is a relatively simple test to verify Clippy has run. + self._check_added_message(window, view.file_name(), r'char_lit_as_u8') + + def _check_added_message(self, window, filename, pattern): msgs = messages.WINDOW_MESSAGES[window.id()] - lib_msgs = msgs['paths'][os.path.join(package_root, 'src/lib.rs')] - for msg in lib_msgs: - if 'char_lit_as_u8' in msg['message']: + path_msgs = msgs['paths'][filename] + for msg in path_msgs: + if re.search(pattern, unescape(msg['message'])): break else: - raise AssertionError('Failed to find char_lit_as_u8') + raise AssertionError('Failed to find %r' % pattern) def test_script(self): """Test "Script" variant.""" diff --git a/tests/test_syntax_check.py b/tests/test_syntax_check.py index c4de1e0b..c032bf24 100755 --- a/tests/test_syntax_check.py +++ b/tests/test_syntax_check.py @@ -20,6 +20,13 @@ def test_messages(self): // ^ERR expected 1 parameter // ^^ERR this function takes 1 parameter + You can place restrictions on the message in parenthesis after the + level (comma separated). This can be a semver check, or the word + "test" to indicate that this message only shows up in a cfg(test) + block. Examples: + // ^ERR(<1.16.0) error msg before 1.16 + // ^^ERR(>=1.16.0,test) error msg after 1.16, test block only + These tests are somewhat fragile, as new versions of Rust change the formatting of messages. Hopefully these examples are relatively stable for now. @@ -78,12 +85,18 @@ def collect_regions(v, key, regions, scope, icon, flags): m._sublime_add_phantom = collect_phantoms m._sublime_add_regions = collect_regions try: - self._test_messages2(view, phantoms, regions) + for method in ('no-trans', 'check'): + if method == 'check' and \ + semver.match(self.rustc_version, '<1.16.0'): + print('Skipping check, need rust >= 1.16.') + return + with AlteredSetting('rust_syntax_checking_method', method): + self._test_messages2(view, phantoms, regions, method) finally: m._sublime_add_phantom = orig_add_phantom m._sublime_add_regions = orig_add_regions - def _test_messages2(self, view, phantoms, regions): + def _test_messages2(self, view, phantoms, regions, method): e = plugin.SyntaxCheckPlugin.RustSyntaxCheckEvent() # Force Cargo to recompile. self._cargo_clean(view) @@ -93,6 +106,22 @@ def _test_messages2(self, view, phantoms, regions): self._get_rust_thread().join() pattern = '(\^+)(WARN|ERR|HELP|NOTE)(\([^)]+\))? (.+)' expected_messages = view.find_all(pattern) + + def restriction_check(restrictions): + if not restrictions: + return True + checks = restrictions[1:-1].split(',') + for check in checks: + if check == 'test': + if method == 'check': + # 'cargo check' currently does not handle cfg(test) + # blocks. + return False + else: + if not semver.match(self.rustc_version, check): + return False + return True + for emsg_r in expected_messages: row, col = view.rowcol(emsg_r.begin()) text = view.substr(emsg_r) @@ -106,16 +135,11 @@ def _test_messages2(self, view, phantoms, regions): 'NOTE': 'note', 'HELP': 'help', }[msg_type] - semver = m.group(3) + restrictions = m.group(3) msg_content = m.group(4) - if not semver or \ - plugin.rust.semver.match(self.rustc_version, semver[1:-1]): + if restriction_check(restrictions): for i, (region, content) in enumerate(phantoms): - # python 3.4 can use html.unescape() - content = content.replace(' ', ' ')\ - .replace('&', '&')\ - .replace('<', '<')\ - .replace('>', '>') + content = unescape(content) r_row, r_col = view.rowcol(region.end()) print('Checking for %r in %r' % (msg_content, content)) if r_row == msg_row and msg_content in content: From c2704f88212f31315366ff9ee06ac8fc8afc71ef Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Fri, 17 Mar 2017 16:53:29 -0700 Subject: [PATCH 05/32] Support clippy for on-save checking. --- SyntaxCheckPlugin.py | 23 ++++++++++++++---- rust/cargo_settings.py | 17 ++++++------- rust/messages.py | 15 ++++++++++-- rust/util.py | 16 +++++++++++++ tests/error-tests/examples/clippy_ex.rs | 17 +++++++++++++ tests/multi-targets/src/lib.rs | 4 +--- tests/rust_test_common.py | 4 ++-- tests/test_cargo_build.py | 2 +- tests/test_syntax_check.py | 32 ++++++++++++++++++------- 9 files changed, 99 insertions(+), 31 deletions(-) create mode 100644 tests/error-tests/examples/clippy_ex.rs diff --git a/SyntaxCheckPlugin.py b/SyntaxCheckPlugin.py index 18345a80..cbcec0ea 100755 --- a/SyntaxCheckPlugin.py +++ b/SyntaxCheckPlugin.py @@ -30,9 +30,6 @@ # - Errors generated by compiling an extern crate do not not output as # json. -# TODO: -# - clippy support - class RustSyntaxCheckEvent(sublime_plugin.EventListener): @@ -80,7 +77,19 @@ def __init__(self, view): def run(self): self.triggered_file_name = os.path.abspath(self.view.file_name()) - self.cwd = os.path.dirname(self.triggered_file_name) + if util.get_setting('rust_syntax_checking_method') == 'clippy': + # Clippy must run in the same directory as Cargo.toml. + # See https://github.com/Manishearth/rust-clippy/issues/1515 + cwd = util.find_cargo_manifest( + os.path.dirname(self.triggered_file_name)) + if cwd is None: + print('Rust Enhanced skipping on-save syntax check.') + print('Failed to find Cargo.toml from %r' % self.triggered_file_name) + print('Clippy requires a Cargo.toml to exist.') + return + self.cwd = os.path.dirname(cwd) + else: + self.cwd = os.path.dirname(self.triggered_file_name) self.view.set_status('rust-check', 'Rust syntax check running...') self.this_view_found = False @@ -107,6 +116,8 @@ def get_rustc_messages(self): if method == 'check': cmd = ['cargo', 'check', '--message-format=json'] cmd.extend(target_args) + elif method == 'clippy': + cmd = ['cargo', '+nightly', 'clippy', '--message-format=json'] else: cmd = ['cargo', 'rustc'] cmd.extend(target_args) @@ -135,6 +146,10 @@ def on_begin(self, proc): pass def on_data(self, proc, data): + # Debugging on-save checking problems requires viewing output here, + # but it is difficult to segregate useful messages (like "thread + # 'main' panicked") from all the other output. Perhaps make a debug + # print setting? pass def on_error(self, proc, message): diff --git a/rust/cargo_settings.py b/rust/cargo_settings.py index 8de76127..8029d916 100644 --- a/rust/cargo_settings.py +++ b/rust/cargo_settings.py @@ -220,16 +220,13 @@ def _determine_working_directory(self): return working_dir def _find_cargo_manifest(self, cwd): - while True: - path = os.path.join(cwd, 'Cargo.toml') - if os.path.exists(path): - self.manifest_dir = cwd - self.manifest_path = path - return True - parent = os.path.dirname(cwd) - if parent == cwd: - return False - cwd = parent + path = util.find_cargo_manifest(cwd) + if path: + self.manifest_path = path + self.manifest_dir = os.path.dirname(path) + return True + else: + return False def _active_view_is_rust(self): view = self.window.active_view() diff --git a/rust/messages.py b/rust/messages.py index c3334add..23403714 100644 --- a/rust/messages.py +++ b/rust/messages.py @@ -6,6 +6,7 @@ import html import itertools import os +import re import webbrowser from pprint import pprint @@ -25,6 +26,9 @@ WINDOW_MESSAGES = {} +LINK_PATTERN = r'https?://[-a-zA-Z0-9@:%._+~#=]{2,256}\.[a-zA-Z]{2,6}\b[-a-zA-Z0-9@:%_+.~#?&/=]*' + + def clear_messages(window): WINDOW_MESSAGES.pop(window.id(), None) for view in window.views(): @@ -50,18 +54,23 @@ def add_message(window, path, level, span, is_main, message): try: messages_by_path = WINDOW_MESSAGES[wid]['paths'] except KeyError: + # This is an OrderedDict to handle next/prev message. messages_by_path = collections.OrderedDict() WINDOW_MESSAGES[wid] = { 'paths': messages_by_path, 'msg_index': (-1, -1) } messages = messages_by_path.setdefault(path, []) - messages.append({ + to_add = { 'level': level, 'span': span, 'is_main': is_main, 'message': message, - }) + } + if to_add in messages: + # Don't add duplicates. + return + messages.append(to_add) view = window.find_open_file(path) if view: _show_phantom(view, level, span, message) @@ -483,6 +492,8 @@ def _add_message(path, span_region, is_main, message, extra=''): # (doesn't line up perfectly), not sure why. escaped_message = html.escape(message, quote=False).\ replace('\n', '
').replace(' ', ' ') + escaped_message = re.sub(LINK_PATTERN, r'\g<0>', + escaped_message) content = msg_template.format( cls=cls, level=info['level'], diff --git a/rust/util.py b/rust/util.py index 2f6d6c64..1d0dedd9 100644 --- a/rust/util.py +++ b/rust/util.py @@ -4,6 +4,7 @@ import textwrap import threading import time +import os def index_with(l, cb): @@ -67,3 +68,18 @@ def get_rustc_version(window, cwd): # rustc 1.16.0-beta.2 (bc15d5281 2017-02-16) # rustc 1.17.0-nightly (306035c21 2017-02-18) return output.split()[1] + + +def find_cargo_manifest(path): + """Find the Cargo.toml file in the given path, or any of its parents. + + :Returns: The path where Cargo.toml is found, or None. + """ + while True: + manifest = os.path.join(path, 'Cargo.toml') + if os.path.exists(manifest): + return manifest + parent = os.path.dirname(path) + if parent == path: + return None + path = parent diff --git a/tests/error-tests/examples/clippy_ex.rs b/tests/error-tests/examples/clippy_ex.rs new file mode 100644 index 00000000..f24af24d --- /dev/null +++ b/tests/error-tests/examples/clippy_ex.rs @@ -0,0 +1,17 @@ +// Testing a Clippy warning (char_lit_as_u8). + +fn clippy_example() { + println!("libf1"); + 'x' as u8; + // ^WARN casting character literal + // ^^NOTE #[warn(char_lit_as_u8)] + // ^^^HELP Consider using a byte + // ^^^^HELP for further information + // ^^^^^WARN statement with no effect + // ^^^^^^NOTE #[warn(no_effect)] + // ^^^^^^^HELP for further information +} + +fn main() { + clippy_example(); +} diff --git a/tests/multi-targets/src/lib.rs b/tests/multi-targets/src/lib.rs index a9c7a3eb..2237545f 100644 --- a/tests/multi-targets/src/lib.rs +++ b/tests/multi-targets/src/lib.rs @@ -2,11 +2,9 @@ pub mod lmod1; pub fn libf1() { println!("libf1"); - // Testing a Clippy warning (char_lit_as_u8). - 'x' as u8; } fn unused() { } // ^WARN function is never used - +// ^^NOTE(clippy) #[warn(dead_code)] diff --git a/tests/rust_test_common.py b/tests/rust_test_common.py index a151a2bc..68f29cd7 100644 --- a/tests/rust_test_common.py +++ b/tests/rust_test_common.py @@ -72,7 +72,7 @@ def _run_build(self, command='build', **kwargs): kwargs['command'] = command window.run_command('cargo_exec', kwargs) - def _with_open_file(self, filename, f): + def _with_open_file(self, filename, f, **kwargs): """Opens filename (relative to the plugin) in a new view, calls f(view) to perform the tests. """ @@ -95,7 +95,7 @@ def async_test_view(): break else: raise AssertionError('View never loaded.') - f(view) + f(view, **kwargs) except Exception as e: q.put(e) else: diff --git a/tests/test_cargo_build.py b/tests/test_cargo_build.py index 6169c052..1f78b013 100644 --- a/tests/test_cargo_build.py +++ b/tests/test_cargo_build.py @@ -276,7 +276,7 @@ def _test_document(self, view): def test_clippy(self): """Test "Clippy" variant.""" - self._with_open_file('tests/multi-targets/src/lib.rs', + self._with_open_file('tests/error-tests/examples/clippy_ex.rs', self._test_clippy) def _test_clippy(self, view): diff --git a/tests/test_syntax_check.py b/tests/test_syntax_check.py index c032bf24..49e249da 100755 --- a/tests/test_syntax_check.py +++ b/tests/test_syntax_check.py @@ -62,11 +62,26 @@ def test_messages(self): 'workspace/workspace2/src/lib.rs', 'workspace/workspace2/src/somemod.rs', ] + methods = ['no-trans'] + if semver.match(self.rustc_version, '>=1.16.0'): + methods.append('check') + else: + print('Skipping check, need rust >= 1.16.') for path in to_test: path = os.path.join('tests', path) - self._with_open_file(path, self._test_messages) + self._with_open_file(path, self._test_messages, + methods=methods) - def _test_messages(self, view): + def test_clippy_messages(self): + """Test clippy messages.""" + to_test = [ + 'tests/error-tests/examples/clippy_ex.rs', + 'tests/multi-targets/src/lib.rs', + ] + for path in to_test: + self._with_open_file(path, self._test_messages, methods=['clippy']) + + def _test_messages(self, view, methods=None): # Trigger the generation of messages. phantoms = [] regions = [] @@ -85,11 +100,7 @@ def collect_regions(v, key, regions, scope, icon, flags): m._sublime_add_phantom = collect_phantoms m._sublime_add_regions = collect_regions try: - for method in ('no-trans', 'check'): - if method == 'check' and \ - semver.match(self.rustc_version, '<1.16.0'): - print('Skipping check, need rust >= 1.16.') - return + for method in methods: with AlteredSetting('rust_syntax_checking_method', method): self._test_messages2(view, phantoms, regions, method) finally: @@ -115,7 +126,11 @@ def restriction_check(restrictions): if check == 'test': if method == 'check': # 'cargo check' currently does not handle cfg(test) - # blocks. + # blocks (see + # https://github.com/rust-lang/cargo/issues/3431) + return False + elif check == 'clippy': + if method != 'clippy': return False else: if not semver.match(self.rustc_version, check): @@ -141,7 +156,6 @@ def restriction_check(restrictions): for i, (region, content) in enumerate(phantoms): content = unescape(content) r_row, r_col = view.rowcol(region.end()) - print('Checking for %r in %r' % (msg_content, content)) if r_row == msg_row and msg_content in content: self.assertIn(msg_type_text, content) break From b64b5a59e04121e10351af86367d2e8838b7d835 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Sat, 18 Mar 2017 11:54:47 -0700 Subject: [PATCH 06/32] Fix on-save syntax check running clippy multiple times. --- SyntaxCheckPlugin.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/SyntaxCheckPlugin.py b/SyntaxCheckPlugin.py index cbcec0ea..4119abc4 100755 --- a/SyntaxCheckPlugin.py +++ b/SyntaxCheckPlugin.py @@ -109,15 +109,21 @@ def get_rustc_messages(self): :raises rust_proc.ProcessTerminatedError: Check was canceled. """ + method = util.get_setting('rust_syntax_checking_method', 'no-trans') + if method == 'clippy': + cmd = ['cargo', '+nightly', 'clippy', '--message-format=json'] + p = rust_proc.RustProc() + p.run(self.window, cmd, self.cwd, self) + p.wait() + return + + # "no-trans" or "check" methods. td = target_detect.TargetDetector(self.window) targets = td.determine_targets(self.triggered_file_name) for (target_src, target_args) in targets: - method = util.get_setting('rust_syntax_checking_method', 'no-trans') if method == 'check': cmd = ['cargo', 'check', '--message-format=json'] cmd.extend(target_args) - elif method == 'clippy': - cmd = ['cargo', '+nightly', 'clippy', '--message-format=json'] else: cmd = ['cargo', 'rustc'] cmd.extend(target_args) From 4b0ee0fe5ff85639c9e156815de51d0052a6edae Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Sat, 18 Mar 2017 14:46:34 -0700 Subject: [PATCH 07/32] Add ability to configure cargo build features. --- RustEnhanced.sublime-commands | 4 + docs/build.md | 3 + rust/cargo_config.py | 113 +++++++++++++++++++++------ rust/cargo_settings.py | 13 +++ tests/multi-targets/Cargo.toml | 8 ++ tests/multi-targets/src/bin/feats.rs | 14 ++++ tests/test_cargo_build.py | 43 +++++++++- 7 files changed, 171 insertions(+), 27 deletions(-) create mode 100644 tests/multi-targets/src/bin/feats.rs diff --git a/RustEnhanced.sublime-commands b/RustEnhanced.sublime-commands index 256ab927..822a095c 100644 --- a/RustEnhanced.sublime-commands +++ b/RustEnhanced.sublime-commands @@ -31,4 +31,8 @@ "caption": "Rust: Set Cargo Toolchain", "command": "cargo_set_toolchain" }, + { + "caption": "Rust: Set Cargo Features", + "command": "cargo_set_features" + }, ] diff --git a/docs/build.md b/docs/build.md index e0e12e54..85a05c1c 100644 --- a/docs/build.md +++ b/docs/build.md @@ -59,6 +59,7 @@ Command | Description Rust: Set Cargo Target | Set the Cargo target (`--lib`, `--example foo`, etc.) for each build variant. The "Automatic Detection" option will attempt to determine which target to use based on the current active view in Sublime (a test file will use `--test` or a binary will use `--bin`, etc.). Rust: Set Cargo Build Profile | Set whether or not to use the `--release` flag. Rust: Set Cargo Target Triple | Set the target triple (such as `x86_64-apple-darwin`). +Rust: Set Cargo Features | Set the Cargo build features to use. Rust: Set Cargo Toolchain | Set the Rust toolchain to use (`nightly`, `beta`, etc.). Use the Targets > "All Targets" to set globally. Caution: If you have not created a `sublime-project` file, then any changes @@ -117,6 +118,8 @@ Setting Name | Description `target_triple` | If set, uses the `--target` flag with the given value. `toolchain` | The Rust toolchain to use (such as `nightly` or `beta`). `target` | The Cargo target (such as `"--bin myprog"`). Applies to `variants` only. Can be `"auto"` (see "Set Cargo Target" above). +`no_default_features` | If True, sets the `--no-default-features` flag. +`features` | A string with a space separated list of features to pass to the `--features` flag. Set to "ALL" to pass the `--all-features` flag. `extra_cargo_args` | Extra arguments passed to Cargo (before the `--` flags separator). `extra_run_args` | Extra arguments passed to Cargo (after the `--` flags separator). diff --git a/rust/cargo_config.py b/rust/cargo_config.py index 735d8092..ff683bf7 100644 --- a/rust/cargo_config.py +++ b/rust/cargo_config.py @@ -83,7 +83,7 @@ def show_next_question(self): item_info = getattr(self, 'items_' + q)() if not isinstance(item_info, dict): item_info = {'items': item_info} - items = item_info['items'] + f_selected = getattr(self, 'selected_' + q, None) def make_choice(value): @@ -94,34 +94,45 @@ def make_choice(value): self._sequence.extend(next) self.show_next_question() - def wrapper(index): - if index != -1: - chosen = items[index][1] - RECENT_CHOICES[q] = chosen - make_choice(chosen) - if q in self.input: make_choice(self.input[q]) - elif item_info.get('skip_if_one', False) and len(items) == 1: - wrapper(0) else: - # If the user manually edits the config and enters custom values - # then it won't show up in the list (because it is not an exact - # match). Add it so that it is a valid choice (assuming the user - # entered a valid value). - if 'default' in item_info: - default_index = index_with(items, - lambda x: x[1] == item_info['default']) - if default_index == -1: - items.append((item_info['default'], item_info['default'])) - # Determine the default selection. - # Use the default provided by the items_ method, else - # use the most recently used value. - default = index_with(items, - lambda x: x[1] == item_info.get('default', - RECENT_CHOICES.get(q, '_NO_DEFAULT_SENTINEL_'))) - display_items = [x[0] for x in items] - self.window.show_quick_panel(display_items, wrapper, 0, default) + if 'items' in item_info: + def wrapper(index): + if index != -1: + chosen = item_info['items'][index][1] + RECENT_CHOICES[q] = chosen + make_choice(chosen) + + items = item_info['items'] + if item_info.get('skip_if_one', False) and len(items) == 1: + wrapper(0) + else: + # If the user manually edits the config and enters custom + # values then it won't show up in the list (because it is + # not an exact match). Add it so that it is a valid + # choice (assuming the user entered a valid value). + if 'default' in item_info: + default_index = index_with(items, + lambda x: x[1] == item_info['default']) + if default_index == -1: + items.append((item_info['default'], + item_info['default'])) + # Determine the default selection. + # Use the default provided by the items_ method, else + # use the most recently used value. + default = index_with(items, + lambda x: x[1] == item_info.get('default', + RECENT_CHOICES.get(q, '_NO_DEFAULT_SENTINEL_'))) + display_items = [x[0] for x in items] + self.window.show_quick_panel(display_items, wrapper, 0, + default) + elif 'caption' in item_info: + self.window.show_input_panel(item_info['caption'], + item_info.get('default', ''), + make_choice, None, None) + else: + raise ValueError(item_info) def items_package(self): # path/to/package: package_info @@ -365,3 +376,53 @@ def done(self): self.choices['toolchain']) else: raise AssertionError(self.choices['which']) + + +class CargoSetFeatures(CargoConfigBase): + + sequence = ['package', 'target', 'no_default_features', 'features'] + + def items_no_default_features(self): + current = self.settings.get_with_target(self.choices['package'], + self.choices['target'], + 'no_default_features', False) + items = [ + ('Include default features.', False), + ('Do not include default features.', True) + ] + return { + 'items': items, + 'default': current, + } + + def items_features(self): + features = self.settings.get_with_target(self.choices['package'], + self.choices['target'], + 'features', None) + if features is None: + package_path = self.choices['package'] + available_features = self.packages[package_path].get('features', {}) + items = list(available_features.keys()) + # Remove the "default" entry. + if 'default' in items: + del items[items.index('default')] + if not self.choices['no_default_features']: + # Don't show default features, (they are already included). + for ft in available_features['default']: + if ft in items: + del items[items.index(ft)] + features = ' '.join(items) + return { + 'caption': 'Choose features (space separated, use "ALL" to use all features)', + 'default': features, + } + + def done(self): + self.settings.set_with_target(self.choices['package'], + self.choices['target'], + 'no_default_features', + self.choices['no_default_features']) + self.settings.set_with_target(self.choices['package'], + self.choices['target'], + 'features', + self.choices['features']) diff --git a/rust/cargo_settings.py b/rust/cargo_settings.py index 8029d916..3acd1fab 100644 --- a/rust/cargo_settings.py +++ b/rust/cargo_settings.py @@ -321,6 +321,19 @@ def get(key, default=None): if cmd_info.get('allows_json'): result.append('--message-format=json') + # features + if cmd_info.get('allows_features', False): + v = get('no_default_features', False) + if v: + result.append('--no-default-features') + v = get('features', None) + if v: + if v.upper() == 'ALL': + result.append('--all-features') + else: + result.append('--features') + result.append(v) + # Add path from current active view (mainly for "cargo script"). if cmd_info.get('wants_view_path', False): if not self._active_view_is_rust(): diff --git a/tests/multi-targets/Cargo.toml b/tests/multi-targets/Cargo.toml index 41809c83..a397040d 100644 --- a/tests/multi-targets/Cargo.toml +++ b/tests/multi-targets/Cargo.toml @@ -7,6 +7,10 @@ build = "build.rs" [features] nightly = [] +default = ["feat1"] +feat1 = [] +feat2 = [] +feat3 = [] [[bin]] name = "otherbin" @@ -27,6 +31,10 @@ path = "src/bin/bin1.rs" name = "bin2" path = "src/bin/bin2.rs" +[[bin]] +name = "feats" +path = "src/bin/feats.rs" + [[example]] name = "ex1" path = "examples/ex1.rs" diff --git a/tests/multi-targets/src/bin/feats.rs b/tests/multi-targets/src/bin/feats.rs new file mode 100644 index 00000000..297805b6 --- /dev/null +++ b/tests/multi-targets/src/bin/feats.rs @@ -0,0 +1,14 @@ +fn main() { + print!("feats: "); + let mut v = Vec::new(); + if cfg!(feature="feat1") { + v.push("feat1"); + } + if cfg!(feature="feat2") { + v.push("feat2") + } + if cfg!(feature="feat3") { + v.push("feat3") + } + println!("{}", v.join(" ")); +} diff --git a/tests/test_cargo_build.py b/tests/test_cargo_build.py index 1f78b013..4d15e03a 100644 --- a/tests/test_cargo_build.py +++ b/tests/test_cargo_build.py @@ -63,7 +63,7 @@ def _test_build_with_target(self, view): 'libmulti_targets.rlib']), # I'm actually uncertain why Cargo builds all bins here. ('--test test1', [exe('bin1'), exe('bin2'), exe('multi-targets'), - exe('otherbin'), + exe('otherbin'), exe('feats'), 'libmulti_targets.rlib', 'test1-*']), # bench requires nightly ] @@ -307,3 +307,44 @@ def _test_script(self, view): self._run_build_wait('script') output = self._get_build_output(window) self.assertRegex(output, '(?m)^Hello Mystery$') + + def test_features(self): + """Test feature selection.""" + self._with_open_file('tests/multi-targets/src/bin/feats.rs', + self._test_features) + + def _test_features(self, view): + window = view.window() + window.run_command('cargo_set_target', {'variant': 'run', + 'target': '--bin feats'}) + self._run_build_wait('run') + output = self._get_build_output(window) + self.assertRegex(output, '(?m)^feats: feat1$') + + window.run_command('cargo_set_features', {'target': None, + 'no_default_features': True, + 'features': ''}) + self._run_build_wait('run') + output = self._get_build_output(window) + self.assertRegex(output, '(?m)^feats: $') + + window.run_command('cargo_set_features', {'target': None, + 'no_default_features': False, + 'features': 'feat3'}) + self._run_build_wait('run') + output = self._get_build_output(window) + self.assertRegex(output, '(?m)^feats: feat1 feat3$') + + window.run_command('cargo_set_features', {'target': None, + 'no_default_features': True, + 'features': 'feat2 feat3'}) + self._run_build_wait('run') + output = self._get_build_output(window) + self.assertRegex(output, '(?m)^feats: feat2 feat3$') + + window.run_command('cargo_set_features', {'target': None, + 'no_default_features': True, + 'features': 'ALL'}) + self._run_build_wait('run') + output = self._get_build_output(window) + self.assertRegex(output, '(?m)^feats: feat1 feat2 feat3$') From 4b39081daec3ffc5e676a56d370a0da413fb4a80 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Sun, 19 Mar 2017 11:24:52 -0700 Subject: [PATCH 08/32] Support setting environment variables. This includes a dependency on shellenv to capture the user's environment from their login shell. --- RustEnhanced.sublime-settings | 9 +++++- cargo_build.py | 10 ++++--- dependencies.json | 7 +++++ docs/build.md | 1 + rust/cargo_settings.py | 22 +++++++++++++-- rust/rust_proc.py | 38 +++++++++++++++---------- tests/multi-targets/Cargo.toml | 4 +++ tests/multi-targets/src/bin/penv.rs | 5 ++++ tests/test_cargo_build.py | 44 +++++++++++++++++++++++++---- 9 files changed, 113 insertions(+), 27 deletions(-) create mode 100644 dependencies.json create mode 100644 tests/multi-targets/src/bin/penv.rs diff --git a/RustEnhanced.sublime-settings b/RustEnhanced.sublime-settings index aec6d9fa..024a45c8 100644 --- a/RustEnhanced.sublime-settings +++ b/RustEnhanced.sublime-settings @@ -13,7 +13,14 @@ "rust_syntax_error_color": "#F00", // Color of warning messages. - "rust_syntax_warning_color":"#FF0" + "rust_syntax_warning_color":"#FF0", + + // Specify environment variables to add when running Cargo. + // "rust_env": {"PATH": "$PATH:$HOME/.cargo/bin"} + + // If true, will use the environment from the user's login shell when + // running Cargo. + "rust_include_shell_env": true, // If your cargo project has several build targets, it's possible to specify mapping of // source code filenames to the target names to enable syntax checking. diff --git a/cargo_build.py b/cargo_build.py index 0556a508..9b32853b 100644 --- a/cargo_build.py +++ b/cargo_build.py @@ -67,16 +67,18 @@ def run(self): self.settings.load() except cargo_settings.LoadSettingsError: return - cmd = self.settings.get_command(self.command_info, - self.initial_settings) - if not cmd: + cmd_info = self.settings.get_command(self.command_info, + self.initial_settings) + if not cmd_info: return messages.clear_messages(self.window) p = rust_proc.RustProc() listener = opanel.OutputListener(self.window, self.settings.manifest_dir) try: - p.run(self.window, cmd, self.settings.manifest_dir, listener) + p.run(self.window, cmd_info['command'], + self.settings.manifest_dir, listener, + env=cmd_info['env']) p.wait() except rust_proc.ProcessTerminatedError: return diff --git a/dependencies.json b/dependencies.json new file mode 100644 index 00000000..0c350320 --- /dev/null +++ b/dependencies.json @@ -0,0 +1,7 @@ +{ + "*": { + "*": [ + "shellenv" + ] + } +} diff --git a/docs/build.md b/docs/build.md index 85a05c1c..181ec9b4 100644 --- a/docs/build.md +++ b/docs/build.md @@ -122,6 +122,7 @@ Setting Name | Description `features` | A string with a space separated list of features to pass to the `--features` flag. Set to "ALL" to pass the `--all-features` flag. `extra_cargo_args` | Extra arguments passed to Cargo (before the `--` flags separator). `extra_run_args` | Extra arguments passed to Cargo (after the `--` flags separator). +`env` | Object of environment variables to add when running Cargo. The extra args settings support standard Sublime variable expansion (see [Build System diff --git a/rust/cargo_settings.py b/rust/cargo_settings.py index 3acd1fab..b8960875 100644 --- a/rust/cargo_settings.py +++ b/rust/cargo_settings.py @@ -259,7 +259,12 @@ def get_cargo_metadata(self, cwd): cwd=cwd)[0] def get_command(self, cmd_info, initial_settings={}): - """Generates the command arguments for running Cargo.""" + """Generates the command arguments for running Cargo. + + :Returns: A dictionary with the keys: + - `command`: The command to run as a list of strings. + - `env`: Dictionary of environment variables (or None). + """ command = cmd_info['command'] result = ['cargo'] pdata = self.project_data.get('settings', {})\ @@ -359,4 +364,17 @@ def expand(s): result.append('--') result.extend(shlex.split(extra_run_args)) - return result + # Compute the environment. + env = pdata.get('defaults', {}).get('env', {}) + env.update(vdata.get('env', {})) + env.update(pdata.get('targets', {}).get(target, {}).get('env', {})) + env.update(initial_settings.get('env', {})) + for k, v in env.items(): + env[k] = os.path.expandvars(v) + if not env: + env = None + + return { + 'command': result, + 'env': env, + } diff --git a/rust/rust_proc.py b/rust/rust_proc.py index edc85775..366e091c 100644 --- a/rust/rust_proc.py +++ b/rust/rust_proc.py @@ -10,6 +10,7 @@ import sys import threading import time +import shellenv from . import util @@ -17,6 +18,9 @@ PROCS = {} PROCS_LOCK = threading.Lock() +# Environment (as s dict) from the user's login shell. +USER_SHELL_ENV = None + class ProcessTerminatedError(Exception): """Process was terminated by another thread.""" @@ -135,13 +139,14 @@ class RustProc(object): # The thread used for reading output. _stdout_thread = None - def run(self, window, cmd, cwd, listener): + def run(self, window, cmd, cwd, listener, env=None): """Run the process. :param window: Sublime window. :param cmd: The command to run (list of strings). :param cwd: The directory where to run the command. :param listener: `ProcListener` to receive the output. + :param env: Dictionary of environment variables to add. :raises ProcessTermiantedError: Process was terminated by another thread. @@ -164,24 +169,27 @@ def run(self, window, cmd, cwd, listener): with PROCS_LOCK: PROCS[window.id()] = self listener.on_begin(self) - # This is similar to how Sublime 'exec' works. - # XXX: TODO: - # - Allow user to specify 'env', and merge into environment. - # - Allow user to specify 'path', like '$PATH;C:\\new\path' + + # Configure the environment. + self.env = os.environ.copy() + if util.get_setting('rust_include_shell_env', True): + global USER_SHELL_ENV + if USER_SHELL_ENV is None: + USER_SHELL_ENV = shellenv.get_env()[1] + self.env.update(USER_SHELL_ENV) + + rust_env = util.get_setting('rust_env') + if rust_env: + for k, v in rust_env.items(): + rust_env[k] = os.path.expandvars(v) + self.env.update(rust_env) + + if env: + self.env.update(env) # XXX: Debug config. util.debug('Rust running: %s', self.cmd) - self.env = os.environ.copy() - if sys.platform == 'darwin': - # Because setting a global PATH on OS X is tricky, hard-code this. - # TODO: Grab this from settings. - cargo_dir = os.path.expanduser('~/.cargo/bin') - if cargo_dir not in self.env.get('PATH', '') \ - and os.path.exists(cargo_dir): - self.env['PATH'] = cargo_dir + os.pathsep + \ - self.env.get('PATH', '') - if sys.platform == 'win32': # Prevent a console window from popping up. startupinfo = subprocess.STARTUPINFO() diff --git a/tests/multi-targets/Cargo.toml b/tests/multi-targets/Cargo.toml index a397040d..862dd2ce 100644 --- a/tests/multi-targets/Cargo.toml +++ b/tests/multi-targets/Cargo.toml @@ -35,6 +35,10 @@ path = "src/bin/bin2.rs" name = "feats" path = "src/bin/feats.rs" +[[bin]] +name = "penv" +path = "src/bin/penv.rs" + [[example]] name = "ex1" path = "examples/ex1.rs" diff --git a/tests/multi-targets/src/bin/penv.rs b/tests/multi-targets/src/bin/penv.rs new file mode 100644 index 00000000..3174b3a1 --- /dev/null +++ b/tests/multi-targets/src/bin/penv.rs @@ -0,0 +1,5 @@ +fn main() { + for (key, value) in std::env::vars() { + println!("{}={}", key, value); + } +} diff --git a/tests/test_cargo_build.py b/tests/test_cargo_build.py index 4d15e03a..0ee31110 100644 --- a/tests/test_cargo_build.py +++ b/tests/test_cargo_build.py @@ -63,7 +63,7 @@ def _test_build_with_target(self, view): 'libmulti_targets.rlib']), # I'm actually uncertain why Cargo builds all bins here. ('--test test1', [exe('bin1'), exe('bin2'), exe('multi-targets'), - exe('otherbin'), exe('feats'), + exe('otherbin'), exe('feats'), exe('penv'), 'libmulti_targets.rlib', 'test1-*']), # bench requires nightly ] @@ -125,7 +125,8 @@ def _test_target_triple(self, view): 'target_triple': 'a-b-c'}) settings = cargo_settings.CargoSettings(window) settings.load() - cmd = settings.get_command(cargo_settings.CARGO_COMMANDS['build']) + cmd_info = cargo_settings.CARGO_COMMANDS['build'] + cmd = settings.get_command(cmd_info)['command'] self.assertEqual(cmd, ['cargo', 'build', '--target', 'a-b-c', '--message-format=json']) @@ -142,7 +143,8 @@ def _test_toolchain(self, view): 'toolchain': 'nightly'}) settings = cargo_settings.CargoSettings(window) settings.load() - cmd = settings.get_command(cargo_settings.CARGO_COMMANDS['build']) + cmd_info = cargo_settings.CARGO_COMMANDS['build'] + cmd = settings.get_command(cmd_info)['command'] self.assertEqual(cmd, ['cargo', '+nightly', 'build', '--message-format=json']) @@ -151,7 +153,8 @@ def _test_toolchain(self, view): 'variant': 'build', 'toolchain': None}) settings.load() - cmd = settings.get_command(cargo_settings.CARGO_COMMANDS['build']) + cmd_info = cargo_settings.CARGO_COMMANDS['build'] + cmd = settings.get_command(cmd_info)['command'] self.assertEqual(cmd, ['cargo', 'build', '--message-format=json']) @@ -162,7 +165,7 @@ def _test_toolchain(self, view): window.run_command('cargo_set_target', {'variant': 'build', 'target': '--bin bin1'}) settings.load() - cmd = settings.get_command(cargo_settings.CARGO_COMMANDS['build']) + cmd = settings.get_command(cmd_info)['command'] self.assertEqual(cmd, ['cargo', '+nightly', 'build', '--bin', 'bin1', '--message-format=json']) @@ -348,3 +351,34 @@ def _test_features(self, view): self._run_build_wait('run') output = self._get_build_output(window) self.assertRegex(output, '(?m)^feats: feat1 feat2 feat3$') + + def test_rust_env(self): + """Test setting rust_env.""" + self._with_open_file('tests/multi-targets/src/bin/penv.rs', + self._test_rust_env) + + def _test_rust_env(self, view): + window = view.window() + with AlteredSetting('rust_env', {'RUST_TEST_ENV': '1234567890'}): + window.run_command('cargo_set_target', {'variant': 'run', + 'target': '--bin penv'}) + self._run_build_wait('run') + output = self._get_build_output(window) + self.assertRegex(output, '(?m)^RUST_TEST_ENV=1234567890$') + + def test_build_env(self): + """Test setting build environment variables.""" + self._with_open_file('tests/multi-targets/src/bin/penv.rs', + self._test_build_env) + + def _test_build_env(self, view): + window = view.window() + settings = cargo_settings.CargoSettings(window) + settings.load() + settings.set_with_target(multi_target_root, '--bin penv', 'env', + {'RUST_BUILD_ENV_TEST': 'abcdef'}) + window.run_command('cargo_set_target', {'variant': 'run', + 'target': '--bin penv'}) + self._run_build_wait('run') + output = self._get_build_output(window) + self.assertRegex(output, '(?m)^RUST_BUILD_ENV_TEST=abcdef$') From caa482fc9a9bf0136af09a109b1f0ad6cb2938d7 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Sun, 19 Mar 2017 13:49:46 -0700 Subject: [PATCH 09/32] Normalize paths when dealing with settings. This fixes some problems running tests on Windows. --- rust/cargo_settings.py | 4 ++++ rust/util.py | 1 + 2 files changed, 5 insertions(+) diff --git a/rust/cargo_settings.py b/rust/cargo_settings.py index b8960875..67ae1954 100644 --- a/rust/cargo_settings.py +++ b/rust/cargo_settings.py @@ -164,6 +164,7 @@ def load(self): Any changes to the Cargo build settings will be lost if you close the window.""")) def get_with_target(self, path, target, key, default=None): + path = os.path.normpath(path) pdata = self.project_data.get('settings', {})\ .get('cargo_build', {})\ .get('paths', {})\ @@ -175,6 +176,7 @@ def get_with_target(self, path, target, key, default=None): return d.get(key, default) def get_with_variant(self, path, variant, key, default=None): + path = os.path.normpath(path) vdata = self.project_data.get('settings', {})\ .get('cargo_build', {})\ .get('paths', {})\ @@ -184,6 +186,7 @@ def get_with_variant(self, path, variant, key, default=None): return vdata.get(key, default) def set_with_target(self, path, target, key, value): + path = os.path.normpath(path) pdata = self.project_data.setdefault('settings', {})\ .setdefault('cargo_build', {})\ .setdefault('paths', {})\ @@ -196,6 +199,7 @@ def set_with_target(self, path, target, key, value): self.window.set_project_data(self.project_data) def set_with_variant(self, path, variant, key, value): + path = os.path.normpath(path) vdata = self.project_data.setdefault('settings', {})\ .setdefault('cargo_build', {})\ .setdefault('paths', {})\ diff --git a/rust/util.py b/rust/util.py index 1d0dedd9..5ea58c00 100644 --- a/rust/util.py +++ b/rust/util.py @@ -75,6 +75,7 @@ def find_cargo_manifest(path): :Returns: The path where Cargo.toml is found, or None. """ + path = os.path.normpath(path) while True: manifest = os.path.join(path, 'Cargo.toml') if os.path.exists(manifest): From 5f53d83a968f4a742ccb3013912f6ac1e37f2c22 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Sun, 19 Mar 2017 13:50:38 -0700 Subject: [PATCH 10/32] Disable on-load message display for tests. This was causing random breakage (particularly on Windows). --- cargo_build.py | 7 ++++++- tests/rust_test_common.py | 6 +++++- tests/test_syntax_check.py | 2 ++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/cargo_build.py b/cargo_build.py index 9b32853b..386b52cd 100644 --- a/cargo_build.py +++ b/cargo_build.py @@ -84,6 +84,11 @@ def run(self): return +# This is used by the test code. Due to the async nature of the on_load event, +# it can cause problems with the rapid loading of views. +ON_LOAD_MESSAGES_ENABLED = True + + class CargoEventListener(sublime_plugin.EventListener): """Every time a new file is loaded, check if is a Rust file with messages, @@ -91,7 +96,7 @@ class CargoEventListener(sublime_plugin.EventListener): """ def on_load(self, view): - if 'source.rust' in view.scope_name(0): + if ON_LOAD_MESSAGES_ENABLED and 'source.rust' in view.scope_name(0): # For some reason, view.window() returns None here. # Use set_timeout to give it time to attach to a window. sublime.set_timeout( diff --git a/tests/rust_test_common.py b/tests/rust_test_common.py index 68f29cd7..a359a3ab 100644 --- a/tests/rust_test_common.py +++ b/tests/rust_test_common.py @@ -49,9 +49,11 @@ def setUp(self): self.settings = sublime.load_settings('RustEnhanced.sublime-settings') self._orig_show_panel = self.settings.get('show_panel_on_build') self.settings.set('show_panel_on_build', False) + plugin.cargo_build.ON_LOAD_MESSAGES_ENABLED = False def tearDown(self): self.settings.set('show_panel_on_build', self._orig_show_panel) + plugin.cargo_build.ON_LOAD_MESSAGES_ENABLED = True def _get_rust_thread(self): """Waits for a rust thread to get started and returns it.""" @@ -115,9 +117,11 @@ def _cargo_clean(self, view_or_path): path = os.path.dirname(view_or_path.file_name()) else: path = view_or_path - rust_proc.check_output(sublime.active_window(), + window = sublime.active_window() + rust_proc.check_output(window, 'cargo clean'.split(), path) + messages.clear_messages(window) class AlteredSetting(object): diff --git a/tests/test_syntax_check.py b/tests/test_syntax_check.py index 49e249da..9276933b 100755 --- a/tests/test_syntax_check.py +++ b/tests/test_syntax_check.py @@ -103,6 +103,8 @@ def collect_regions(v, key, regions, scope, icon, flags): for method in methods: with AlteredSetting('rust_syntax_checking_method', method): self._test_messages2(view, phantoms, regions, method) + phantoms.clear() + regions.clear() finally: m._sublime_add_phantom = orig_add_phantom m._sublime_add_regions = orig_add_regions From 160a7f2d1d6acf5c0387ecd86294bda149596da6 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Sun, 19 Mar 2017 14:34:56 -0700 Subject: [PATCH 11/32] Fix race condition in tests manifested on linux. --- tests/test_interrupt.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/test_interrupt.py b/tests/test_interrupt.py index ae007088..e16e2d91 100644 --- a/tests/test_interrupt.py +++ b/tests/test_interrupt.py @@ -96,7 +96,7 @@ def _test_build_cancel(self, view): window = view.window() self._run_build() self._wait_for_start() - t = rust_thread.THREADS[view.window().id()] + t = self._get_rust_thread() self._wrap_terminate(t) window.run_command('rust_cancel') # Sleep long enough to make sure the build didn't continue running. @@ -133,7 +133,7 @@ def _test_syntax_check_while_build(self, view): window = view.window() self._run_build() self._wait_for_start() - build_t = rust_thread.THREADS[window.id()] + build_t = self._get_rust_thread() self._wrap_terminate(build_t) # Start a syntax check, it should not be allowed to proceed. check_t = plugin.SyntaxCheckPlugin.RustSyntaxCheckThread(view) @@ -159,8 +159,9 @@ def _test_build_while_syntax_check(self, view): check_t.start() self._wait_for_start() # Should silently kill the syntax check thread. + v = sublime.active_window().active_view() self._run_build() - build_t = rust_thread.THREADS[window.id()] + build_t = self._get_rust_thread() self._wrap_terminate(build_t) time.sleep(4) self.assertEqual(self.terminated, [check_t]) @@ -182,7 +183,7 @@ def _test_build_with_save(self, view): # Doing this immediately afterwards should cancel the syntax check # before it gets a chance to do much. self._run_build() - build_t = rust_thread.THREADS[window.id()] + build_t = self._get_rust_thread() self._wrap_terminate(build_t) time.sleep(4) self.assertEqual(self._files(), @@ -210,7 +211,7 @@ def ok_cancel_dialog(msg, ok_title=None): window = view.window() self._run_build() self._wait_for_start() - build_t = rust_thread.THREADS[window.id()] + build_t = self._get_rust_thread() self._wrap_terminate(build_t) # Start a second build. self._run_build() From b2bc6ed3dc9459973bcc27e46e604049c2e586ee Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Tue, 21 Mar 2017 12:58:03 -0700 Subject: [PATCH 12/32] Add support for custom build variants. This includes some significant changes to how the current package is selected. It should work a little better if you have multiple packages. --- RustEnhanced.sublime-commands | 4 + SyntaxCheckPlugin.py | 8 +- cargo_build.py | 91 +++++++-- docs/build.md | 45 ++++- rust/cargo_config.py | 367 ++++++++++++++++++++++++++++++---- rust/cargo_settings.py | 121 ++--------- rust/util.py | 24 ++- tests/test_cargo_build.py | 12 +- tests/test_interrupt.py | 5 - 9 files changed, 499 insertions(+), 178 deletions(-) diff --git a/RustEnhanced.sublime-commands b/RustEnhanced.sublime-commands index 822a095c..4ca8768d 100644 --- a/RustEnhanced.sublime-commands +++ b/RustEnhanced.sublime-commands @@ -35,4 +35,8 @@ "caption": "Rust: Set Cargo Features", "command": "cargo_set_features" }, + { + "caption": "Rust: Create New Cargo Build Variant", + "command": "cargo_create_new_build" + } ] diff --git a/SyntaxCheckPlugin.py b/SyntaxCheckPlugin.py index 4119abc4..5d642618 100755 --- a/SyntaxCheckPlugin.py +++ b/SyntaxCheckPlugin.py @@ -43,7 +43,7 @@ def on_post_save(self, view): return enabled = util.get_setting('rust_syntax_checking', True) - if enabled and 'source.rust' in view.scope_name(0): + if enabled and util.active_view_is_rust(view=view): t = RustSyntaxCheckThread(view) t.start() elif not enabled: @@ -80,14 +80,12 @@ def run(self): if util.get_setting('rust_syntax_checking_method') == 'clippy': # Clippy must run in the same directory as Cargo.toml. # See https://github.com/Manishearth/rust-clippy/issues/1515 - cwd = util.find_cargo_manifest( - os.path.dirname(self.triggered_file_name)) - if cwd is None: + self.cwd = util.find_cargo_manifest(self.triggered_file_name) + if self.cwd is None: print('Rust Enhanced skipping on-save syntax check.') print('Failed to find Cargo.toml from %r' % self.triggered_file_name) print('Clippy requires a Cargo.toml to exist.') return - self.cwd = os.path.dirname(cwd) else: self.cwd = os.path.dirname(self.triggered_file_name) diff --git a/cargo_build.py b/cargo_build.py index 386b52cd..bedf86ed 100644 --- a/cargo_build.py +++ b/cargo_build.py @@ -1,5 +1,6 @@ """Sublime commands for the cargo build system.""" +import functools import sublime import sublime_plugin from .rust import (rust_proc, rust_thread, opanel, util, messages, @@ -23,19 +24,79 @@ class CargoExecCommand(sublime_plugin.WindowCommand): - `command_info`: Dictionary of values the defines how the cargo command is constructed. See `command_settings.CARGO_COMMANDS`. - `settings`: Dictionary of settings overriding anything set in the - Sublime project settings (see `command_settings`). + Sublime project settings (see `command_settings` module). """ + # The combined command info from `command_settings` and whatever the user + # passed in. + command_info = None + # Dictionary of initial settings passed in by the user. + initial_settings = None + # CargoSettings instance. + settings = None + # Directory where to run the command. + working_dir = None + # Path used for the settings key. This is typically `working_dir` except + # for `cargo script`, in which case it is the path to the .rs source file. + settings_path = None + def run(self, command=None, command_info=None, settings=None): + if command is None: + return self.window.run_command('build', {'select': True}) + self.command = command self.command_info = cargo_settings.CARGO_COMMANDS\ .get(command, {}).copy() if command_info: self.command_info.update(command_info) self.initial_settings = settings if settings else {} + self.settings = cargo_settings.CargoSettings(self.window) + self.settings.load() + self._determine_working_path(self._run_check_for_args) + + def _determine_working_path(self, on_done): + """Determine where Cargo should be run. + + This may trigger some Sublime user interaction if necessary. + """ + working_dir = self.initial_settings.get('working_dir') + if working_dir: + self.working_dir = working_dir + self.settings_path = working_dir + return on_done() + script_path = self.initial_settings.get('script_path') + if script_path: + self.working_dir = os.path.dirname(script_path) + self.settings_path = script_path + return on_done() + + if self.command_info.get('requires_manifest', True): + cmd = CargoConfigPackage(self.window) + cmd.run(functools.partial(self._on_manifest_choice, on_done)) + else: + # For now, assume you need a Rust file if not needing a manifest + # (for `cargo script`). + view = self.window.active_view() + if util.active_view_is_rust(view=view): + self.settings_path = view.file_name() + self.working_dir = os.path.dirname(self.settings_path) + return on_done() + else: + sublime.error_message(util.multiline_fix(""" + Error: Could not determine what Rust source file to use. + + Open a Rust source file as the active Sublime view.""")) + return + + def _on_manifest_choice(self, on_done, package_path): + self.settings_path = package_path + self.working_dir = package_path + on_done() + + def _run_check_for_args(self): if self.command_info.get('wants_run_args', False) and \ - 'extra_run_args' not in self.initial_settings: + not self.initial_settings.get('extra_run_args'): self.window.show_input_panel('Enter extra args:', - LAST_EXTRA_ARGS.get(command, ''), + LAST_EXTRA_ARGS.get(self.command, ''), self._on_extra_args, None, None) else: self._run() @@ -46,8 +107,9 @@ def _on_extra_args(self, args): self._run() def _run(self): - t = CargoExecThread(self.window, - self.command_info, self.initial_settings) + t = CargoExecThread(self.window, self.settings, + self.command_info, self.initial_settings, + self.settings_path, self.working_dir) t.start() @@ -56,28 +118,27 @@ class CargoExecThread(rust_thread.RustThread): silently_interruptible = False name = 'Cargo Exec' - def __init__(self, window, command_info, initial_settings): + def __init__(self, window, settings, command_info, initial_settings, + settings_path, working_dir): super(CargoExecThread, self).__init__(window) + self.settings = settings self.command_info = command_info self.initial_settings = initial_settings + self.settings_path = settings_path + self.working_dir = working_dir def run(self): - self.settings = cargo_settings.CargoSettings(self.window) - try: - self.settings.load() - except cargo_settings.LoadSettingsError: - return cmd_info = self.settings.get_command(self.command_info, + self.settings_path, self.initial_settings) if not cmd_info: return messages.clear_messages(self.window) p = rust_proc.RustProc() - listener = opanel.OutputListener(self.window, - self.settings.manifest_dir) + listener = opanel.OutputListener(self.window, self.working_dir) try: p.run(self.window, cmd_info['command'], - self.settings.manifest_dir, listener, + self.working_dir, listener, env=cmd_info['env']) p.wait() except rust_proc.ProcessTerminatedError: @@ -96,7 +157,7 @@ class CargoEventListener(sublime_plugin.EventListener): """ def on_load(self, view): - if ON_LOAD_MESSAGES_ENABLED and 'source.rust' in view.scope_name(0): + if ON_LOAD_MESSAGES_ENABLED and util.active_view_is_rust(view=view): # For some reason, view.window() returns None here. # Use set_timeout to give it time to attach to a window. sublime.set_timeout( diff --git a/docs/build.md b/docs/build.md index 181ec9b4..d05a4ca6 100644 --- a/docs/build.md +++ b/docs/build.md @@ -67,13 +67,16 @@ you make will be lost if you close the Sublime window. ### Settings -Settings are stored in your `sublime-project` file under the `"settings"` key. -Settings are organized per Cargo package. The top-level keys for each package are: +Settings are stored in your `sublime-project` file under `"cargo_build"` in +the `"settings"` key. Settings are organized per Cargo package in the +`"paths"` object. Paths can either be directories to a Cargo package, or the +path to a Rust source file (when used with `cargo script`). The top-level +keys for each package are: Key | Description --- | ----------- `"defaults"` | Default settings used if not set per target or variant. -`"targets"` | Settings per target. +`"targets"` | Settings per target (such as `"--lib"` or `"--bin foo"`). `"variants"` | Settings per build variant. An example of a `sublime-project` file: @@ -114,6 +117,8 @@ The available settings are: Setting Name | Description ------------ | ----------- +`working_dir` | The directory where to run Cargo. If not specified, attempts to detect from the active view, or displays a panel to choose a Cargo package. +`script_path` | Path to a `.rs` script, used by `cargo script` if you want to hard-code a specific script to run. `release` | If true, uses the `--release` flag. `target_triple` | If set, uses the `--target` flag with the given value. `toolchain` | The Rust toolchain to use (such as `nightly` or `beta`). @@ -136,8 +141,32 @@ folders). If you have multiple Cargo projects in your Sublime window, the build system will use the currently active view to attempt to determine which project to -build. - -## Custom Variants (Advanced) - -TODO +build. Otherwise it will show an input panel to select a package. + +## Custom Build Variants (Advanced) + +You can define your own build system that takes advantage of the Cargo +settings. This is useful if you want to quickly switch between different +configurations, or to add support for Cargo commands that are not already included. + +The build variants are stored in your `.sublime-project` file. To assist you +in configuring a build variant, there is a Sublime command called `"Rust: +Create New Cargo Build Variant"` which you can access from the Command +Palette. It will ask a series of questions, and when it is done it will +automatically add the new build variant to your `.sublime-project` file. Then +use the "Build With..." command (Ctrl-Shift-B / ⌘-Shift-B) to select and +execute your new variant. The command will also copy over the stock build +variants so you do not need to switch between build systems. + +You can manually edit your `.sublime-project` file to change the settings. The settings described above are under the `"settings"` key. Additionally, there is a `"command_info"` key which describes the features the command supports. The available values are: + +Setting Name | Default | Description +------------ | ------- | ----------- +`allows_target` | False | If True, the command accepts cargo filters for determining which target to build (`--lib`, `--bin foo`, `--example bar`, etc.). Can also be a sequence of strings like `["bin", "example"]` to specify a subset of targets it supports. +`allows_target_triple` | False | If True, the command accepts triples like `--target x86_64-apple-darwin`. +`allows_release` | False | If True, allows `--release` flag. +`allows_features` | False | If True, allows feature flags. +`allows_json` | False | If True, allows `--message-format=json` flag. +`requires_manifest` | True | If True, the command must be run in a directory with a `Cargo.toml` manifest. +`requires_view_path` | False | If True, then the active view must be a Rust source file, and the path to that file will be passed into Cargo (used mainly by `cargo script`). +`wants_run_args` | False | If True, it will ask for extra args to pass to the executable (after the `--` flag separator). diff --git a/rust/cargo_config.py b/rust/cargo_config.py index ff683bf7..e2860297 100644 --- a/rust/cargo_config.py +++ b/rust/cargo_config.py @@ -3,17 +3,23 @@ See `cargo_settings` for more details on how settings work. """ +import getpass import os import re +import sublime import sublime_plugin -from .cargo_settings import CargoSettings, CARGO_COMMANDS, LoadSettingsError +from .cargo_settings import CargoSettings, CARGO_COMMANDS from .util import index_with -from . import rust_proc +from . import rust_proc, util # Keep track of recent choices to set the default value. RECENT_CHOICES = {} +class CancelCommandError(Exception): + """Raised when the command should stop.""" + + class CargoConfigBase(sublime_plugin.WindowCommand): """Base class for cargo config commands. @@ -53,18 +59,23 @@ class CargoConfigBase(sublime_plugin.WindowCommand): sequence_index = 0 # Dictionary of selections made during the interactive process. choices = None + # If True, the command wants the 'package' choice to fetch metadata from + # Cargo. + package_wants_metadata = True + # This is a dictionary populated by the `items_package` method. + # Key is the path to a package, the value is the metadata from Cargo. + # This is used by other questions (like `items_target`) to get more + # information about the chosen package. + packages = None def run(self, **kwargs): + self.choices = {} self.sequence_index = 0 # Copy, since WindowCommand reuses objects. self._sequence = self.sequence[:] self.input = kwargs self.settings = CargoSettings(self.window) - try: - self.settings.load() - except LoadSettingsError: - return - self.choices = {} + self.settings.load() self.show_next_question() def done(self): @@ -80,7 +91,10 @@ def show_next_question(self): self.done() return - item_info = getattr(self, 'items_' + q)() + try: + item_info = getattr(self, 'items_' + q)() + except CancelCommandError: + return if not isinstance(item_info, dict): item_info = {'items': item_info} @@ -89,9 +103,13 @@ def show_next_question(self): def make_choice(value): self.choices[q] = value if f_selected: - next = f_selected(value) + try: + next = f_selected(value) + except CancelCommandError: + return if next: - self._sequence.extend(next) + i = self.sequence_index + self._sequence[i:i] = next self.show_next_question() if q in self.input: @@ -135,34 +153,64 @@ def wrapper(index): raise ValueError(item_info) def items_package(self): - # path/to/package: package_info + # If there is a manifest under the current view, use that by default. + view = self.window.active_view() + if view.file_name(): + manifest_dir = util.find_cargo_manifest(view.file_name()) + if manifest_dir: + if self.package_wants_metadata: + metadata = get_cargo_metadata(self.window, manifest_dir) + if metadata: + for package in metadata['packages']: + package_dir = os.path.dirname(package['manifest_path']) + if package_dir == manifest_dir: + self.packages = { + manifest_dir: package + } + return { + 'items': [(manifest_dir, manifest_dir)], + 'skip_if_one': True, + } + + # Otherwise, hunt for all manifest files and show a list. + folders = self.window.folders() self.packages = {} - - def _add_manifest(path): - manifest = self.settings.get_cargo_metadata(path) - if manifest: - for package in manifest['packages']: - manifest_dir = os.path.dirname(package['manifest_path']) - if manifest_dir not in self.packages: - self.packages[manifest_dir] = package - else: - # Manifest load failure, let it slide. - print('Failed to load Cargo manifest in %r' % path) - - _add_manifest(self.settings.manifest_dir) - skeys = self.settings.project_data.get('settings', {})\ - .get('cargo_build', {})\ - .get('paths', {}).keys() - for path in skeys: - if path not in self.packages: - _add_manifest(path) - - items = [('Package:' + package['name'], path) + for folder in folders: + folder_parent = os.path.dirname(folder) + for dirpath, dirs, files, in os.walk(folder): + for exclude in ('.git', '.svn'): + if exclude in dirs: + dirs.remove(exclude) + if 'Cargo.toml' in files: + metadata = get_cargo_metadata(self.window, dirpath) + if metadata: + for package in metadata['packages']: + manifest_dir = os.path.dirname(package['manifest_path']) + rel = os.path.relpath(manifest_dir, folder_parent) + package['sublime_relative'] = rel + if manifest_dir not in self.packages: + self.packages[manifest_dir] = package + else: + # Manifest load failure, let it slide. + print('Failed to load Cargo manifest in %r' % dirpath) + + if len(self.packages) == 0: + sublime.error_message(util.multiline_fix(""" + Error: Cannot determine Rust package to use. + + Open a Rust file to determine which package to use, or add a folder with a Cargo.toml file to your Sublime project.""")) + raise CancelCommandError + + def display_name(package): + return ['Package: %s' % (package['name'],), + package['sublime_relative']] + + items = [(display_name(package), path) for path, package in self.packages.items()] items.sort(key=lambda x: x[0]) return { 'items': items, - 'skip_if_one': True + 'skip_if_one': True, } def items_target(self): @@ -184,8 +232,7 @@ def items_target(self): pass else: print('Rust: Unsupported target found: %s' % kind) - items = [('All Targets', None), - ('Automatic Detection', 'auto')] + items = [('All Targets', None)] for kind, values in kinds.items(): allowed = True if self.choices.get('variant', None): @@ -202,12 +249,29 @@ def items_variant(self): for key, info in CARGO_COMMANDS.items(): if self.filter_variant(info): result.append((info['name'], key)) + result.sort() return result def filter_variant(self, x): return True +class CargoConfigPackage(CargoConfigBase): + + """This is a fake command used by cargo_build to reuse the code to choose + a Cargo package.""" + + sequence = ['package'] + package_wants_metadata = False + + def run(self, on_done): + self._on_done = on_done + super(CargoConfigPackage, self).run() + + def done(self): + self._on_done(self.choices['package']) + + class CargoSetProfile(CargoConfigBase): sequence = ['package', 'target', 'profile'] @@ -241,6 +305,7 @@ def filter_variant(self, info): def items_target(self): items = super(CargoSetTarget, self).items_target() + items.insert(1, ('Automatic Detection', 'auto')) default = self.settings.get_with_variant(self.choices['package'], self.choices['variant'], 'target') @@ -265,7 +330,7 @@ def items_target_triple(self): # "rustc --print target-list", but that does not tell # us which targets are installed. triples = rust_proc.check_output(self.window, - 'rustup target list'.split(), self.settings.manifest_dir)\ + 'rustup target list'.split(), self.choices['package'])\ .splitlines() current = self.settings.get_with_target(self.choices['package'], self.choices['target'], @@ -333,7 +398,7 @@ def items_toolchain(self): def _toolchain_list(self): output = rust_proc.check_output(self.window, 'rustup toolchain list'.split(), - self.settings.manifest_dir) + self.choices['package']) output = output.splitlines() system_default = index_with(output, lambda x: x.endswith(' (default)')) if system_default != -1: @@ -426,3 +491,231 @@ def done(self): self.choices['target'], 'features', self.choices['features']) + + +class CargoCreateNewBuild(CargoConfigBase): + + """Command to create a new build variant, stored in the user's + `.sublime-project` file.""" + + sequence = ['command'] + + def items_command(self): + if self.window.project_data() is None: + sublime.error_message(util.multiline_fix(""" + Error: This command requires a .sublime-project file. + + Save your Sublime project and try again.""")) + raise CancelCommandError + result = [] + for key, info in CARGO_COMMANDS.items(): + result.append((info['name'], key)) + result.sort() + result.append(('New Command', 'NEW_COMMAND')) + return result + + def selected_command(self, command): + if command == 'NEW_COMMAND': + return ['new_command', 'allows_target', 'allows_target_triple', + 'allows_release', 'allows_features', 'allows_json', + 'requires_manifest', 'requires_view_path', 'wants_run_args', + 'name'] + else: + cinfo = CARGO_COMMANDS[command] + result = [] + if cinfo.get('requires_manifest', True): + result.append('package') + result.append('name') + return result + + def items_package(self): + result = super(CargoCreateNewBuild, self).items_package() + if len(result['items']) > 1: + result['items'].insert(0, (['Any Package', + 'This build variant is not tied to any particular Cargo package.'], + None)) + return result + + def selected_package(self, package): + if package: + cinfo = CARGO_COMMANDS[self.choices['command']] + if cinfo.get('allows_target', False): + return ['target'] + + def items_new_command(self): + return { + 'caption': 'Enter the Cargo subcommand to run:', + } + + def selected_new_command(self, command): + if not command: + sublime.error_message('Error: You must enter a command to run.') + raise CancelCommandError + + def items_allows_target(self): + return [ + ('Command %r supports Cargo filters (--bin, --example, etc.)' % ( + self.choices['new_command']), True), + ('Command %r does not support target filters' % ( + self.choices['new_command'],), False) + ] + + def items_allows_target_triple(self): + return [ + ('Command %r supports --target triple flag' % ( + self.choices['new_command']), True), + ('Command %r does not support --target' % ( + self.choices['new_command'],), False) + ] + + def items_allows_release(self): + return [ + ('Command %r supports --release flag' % ( + self.choices['new_command']), True), + ('Command %r does not support --release' % ( + self.choices['new_command'],), False) + ] + + def items_allows_features(self): + return [ + ('Command %r supports --features flag' % ( + self.choices['new_command']), True), + ('Command %r does not support --features' % ( + self.choices['new_command'],), False) + ] + + def items_allows_json(self): + return [ + ('Command %r supports --message-format=json flag' % ( + self.choices['new_command']), True), + ('Command %r does not support JSON' % ( + self.choices['new_command'],), False) + ] + + def items_requires_manifest(self): + return [ + ('Command %r requires a Cargo.toml manifest' % ( + self.choices['new_command']), True), + ('Command %r does not require a manifest' % ( + self.choices['new_command'],), False) + ] + + def items_requires_view_path(self): + return [ + ('Do not include view path', False), + ('Include path of active sublime view on command line', True), + ] + + def items_wants_run_args(self): + return [ + ('Do not ask for more arguments', False), + ('Ask for extra command-line arguments each time', True), + ] + + def items_name(self): + name = '%s\'s %s' % (getpass.getuser(), + self.choices.get('new_command', self.choices['command'])) + target = self.choices.get('target', None) + if target: + target = target.replace('-', '') + name = name + ' %s' % (target,) + return { + 'caption': 'Enter a name for your new Cargo build system:', + 'default': name + } + + def selected_name(self, name): + if not name: + sublime.error_message('Error: You must enter a name.') + raise CancelCommandError + + def done(self): + proj_data = self.window.project_data() + systems = proj_data.setdefault('build_systems', []) + for system_index, system in enumerate(systems): + if system.get('target') == 'cargo_exec': + break + else: + system = self._stock_build_system() + system['name'] = 'Custom Cargo Build' + system_index = len(systems) + systems.append(system) + variants = system.setdefault('variants', []) + + # Add the defaults to make it easier to manually edit. + settings = { + 'release': False, + 'target_triple': '', + 'toolchain': '', + 'target': '', + 'no_default_features': False, + 'features': '', + 'extra_cargo_args': '', + 'extra_run_args': '', + 'env': {}, + } + cinfo = {} + result = { + 'name': self.choices['name'], + 'target': 'cargo_exec', + 'command': self.choices.get('new_command', + self.choices['command']), + 'settings': settings, + 'command_info': cinfo, + } + if self.choices['command'] == 'NEW_COMMAND': + for key in ['allows_target', 'allows_target_triple', + 'allows_release', 'allows_features', 'allows_json', + 'requires_manifest', 'requires_view_path', + 'wants_run_args']: + cinfo[key] = self.choices[key] + requires_view_path = cinfo.get('requires_view_path') + else: + if 'target' in self.choices: + settings['target'] = self.choices['target'] + if 'package' in self.choices: + settings['working_dir'] = self.choices['package'] + requires_view_path = CARGO_COMMANDS[self.choices['command']]\ + .get('requires_view_path', False) + + if requires_view_path and util.active_view_is_rust(): + settings['script_path'] = self.window.active_view().file_name() + + variants.insert(0, result) + self.window.set_project_data(proj_data) + self.window.run_command('set_build_system', {'index': system_index}) + + def _stock_build_system(self): + pkg_name = __name__.split('.')[0] + resource = 'Packages/%s/RustEnhanced.sublime-build' % pkg_name + return sublime.decode_value(sublime.load_resource(resource)) + + +def get_cargo_metadata(window, cwd): + """Load Cargo metadata. + + :returns: None on failure, otherwise a dictionary from Cargo: + - packages: List of packages: + - name + - manifest_path: Path to Cargo.toml. + - targets: List of target dictionaries: + - name: Name of target. + - src_path: Path of top-level source file. May be a + relative path. + - kind: List of kinds. May contain multiple entries if + `crate-type` specifies multiple values in Cargo.toml. + Lots of different types of values: + - Libraries: 'lib', 'rlib', 'dylib', 'staticlib', + 'proc-macro' + - Executables: 'bin', 'test', 'example', 'bench' + - build.rs: 'custom-build' + + :raises ProcessTermiantedError: Process was terminated by another thread. + """ + output = rust_proc.slurp_json(window, + 'cargo metadata --no-deps'.split(), + cwd=cwd) + if output: + return output[0] + else: + return None diff --git a/rust/cargo_settings.py b/rust/cargo_settings.py index 67ae1954..cbb92c33 100644 --- a/rust/cargo_settings.py +++ b/rust/cargo_settings.py @@ -7,38 +7,19 @@ ========== When the `cargo_exec` Sublime command is run, you pass in a named command to run. There is a default set of commands defined here in CARGO_COMMANDS (users -can create custom commands and pass them in with `command_info`). A command -has the following values that are used for figuring out how to construct the -command: - -- `name`: Human-readable name of the command (required). -- `command`: The command to pass to cargo (required). -- `allows_target`: If True, the command accepts cargo filters for determining - which target to build ("--lib", "--bin foo", "--example bar", etc.). Can - also be a sequence of strings like `('bin', 'example')` to specify a subset - of targets it supports. -- `allows_target_triple`: If True, the command accepts triples like - "--target x86_64-apple-darwin". -- `allows_release`: If True, allows "--release" flag. -- `allows_features`: If True, allows feature flags. -- `allows_json`: If True, allows "--message-format=json" flag. -- `wants_view_path`: If True, then the active view must be a Rust source file, - and the path to that file will be passed into Cargo (used mainly by "cargo - script"). -- `wants_run_args`: If True, `cargo_exec` will ask for extra args to pass to - the executable (after the `--` flag separator). +can create custom commands and pass them in with `command_info`). See +`docs/build.md` for a description of the different `command_info` values. Project Settings ================ Settings can be stored (under the "cargo_build" key) to alter how cargo is run. See `docs/build.md` for a description. - """ import sublime import os import shlex -from . import util, rust_proc, target_detect +from . import util, target_detect CARGO_COMMANDS = { 'build': { @@ -116,15 +97,12 @@ 'allows_release': False, 'allows_features': False, 'allows_json': False, - 'wants_view_path': True, + 'requires_view_path': True, + 'requires_manifest': False, }, } -class LoadSettingsError(Exception): - """Failed to load build settings.""" - - class CargoSettings(object): """Interface to Cargo project settings stored in `sublime-project` @@ -132,10 +110,6 @@ class CargoSettings(object): # Sublime window. window = None - # Directory where Cargo.toml manifest was found. - manifest_dir = None - # Version of `manifest_dir` with Cargo.toml on the end. - manifest_path = None # Data in the sublime project file. Empty dictionary if nothing is set. project_data = None @@ -148,14 +122,6 @@ def load(self): # Window does not have a Sublime project. self.project_data = {} - cwd = self._determine_working_directory() - if not cwd or not self._find_cargo_manifest(cwd): - sublime.error_message(util.multiline_fix(""" - Error: Cannot determine Rust package to use. - - Open a Rust file to determine which package to use.""")) - raise LoadSettingsError() - if self.window.project_file_name() is None: # XXX: Better way to display a warning? Is # sublime.error_message() reasonable? @@ -209,60 +175,7 @@ def set_with_variant(self, path, variant, key, value): vdata[key] = value self.window.set_project_data(self.project_data) - def _determine_working_directory(self): - working_dir = None - view = self.window.active_view() - if view and view.file_name(): - working_dir = os.path.dirname(view.file_name()) - else: - folders = self.window.folders() - if folders: - working_dir = folders[0] - if working_dir is None or not os.path.exists(working_dir): - return None - else: - return working_dir - - def _find_cargo_manifest(self, cwd): - path = util.find_cargo_manifest(cwd) - if path: - self.manifest_path = path - self.manifest_dir = os.path.dirname(path) - return True - else: - return False - - def _active_view_is_rust(self): - view = self.window.active_view() - if not view: - return False - return 'source.rust' in view.scope_name(0) - - def get_cargo_metadata(self, cwd): - """Load Cargo metadata. - - :returns: Dictionary from Cargo: - - packages: List of packages: - - name - - manifest_path: Path to Cargo.toml. - - targets: List of target dictionaries: - - name: Name of target. - - src_path: Path of top-level source file. May be a - relative path. - - kind: List of kinds. May contain multiple entries if - `crate-type` specifies multiple values in Cargo.toml. - Lots of different types of values: - - Libraries: 'lib', 'rlib', 'dylib', 'staticlib', - 'proc-macro' - - Executables: 'bin', 'test', 'example', 'bench' - - build.rs: 'custom-build' - - """ - return rust_proc.slurp_json(self.window, - 'cargo metadata --no-deps'.split(), - cwd=cwd)[0] - - def get_command(self, cmd_info, initial_settings={}): + def get_command(self, cmd_info, settings_path, initial_settings={}): """Generates the command arguments for running Cargo. :Returns: A dictionary with the keys: @@ -274,7 +187,7 @@ def get_command(self, cmd_info, initial_settings={}): pdata = self.project_data.get('settings', {})\ .get('cargo_build', {})\ .get('paths', {})\ - .get(self.manifest_dir, {}) + .get(settings_path, {}) vdata = pdata.get('variants', {})\ .get(command, {}) @@ -288,7 +201,7 @@ def vdata_get(key, default=None): if tcfg == 'auto': # If this fails, leave target as None and let Cargo sort it # out (it may display an error). - if self._active_view_is_rust(): + if util.active_view_is_rust(): td = target_detect.TargetDetector(self.window) view = self.window.active_view() targets = td.determine_targets(view.file_name()) @@ -327,7 +240,7 @@ def get(key, default=None): if v: result.append('--release') - if cmd_info.get('allows_json'): + if cmd_info.get('allows_json', False): result.append('--message-format=json') # features @@ -344,13 +257,15 @@ def get(key, default=None): result.append(v) # Add path from current active view (mainly for "cargo script"). - if cmd_info.get('wants_view_path', False): - if not self._active_view_is_rust(): - sublime.error_message(util.multiline_fix(""" - Cargo build command %r requires the current view to be a Rust source file.""" % command)) - return None - path = self.window.active_view().file_name() - result.append(path) + if cmd_info.get('requires_view_path', False): + script_path = get('script_path') + if not script_path: + if not util.active_view_is_rust(): + sublime.error_message(util.multiline_fix(""" + Cargo build command %r requires the current view to be a Rust source file.""" % command)) + return None + script_path = self.window.active_view().file_name() + result.append(script_path) def expand(s): return sublime.expand_variables(s, diff --git a/rust/util.py b/rust/util.py index 5ea58c00..c252cfa5 100644 --- a/rust/util.py +++ b/rust/util.py @@ -76,11 +76,33 @@ def find_cargo_manifest(path): :Returns: The path where Cargo.toml is found, or None. """ path = os.path.normpath(path) + if os.path.isfile(path): + path = os.path.dirname(path) while True: manifest = os.path.join(path, 'Cargo.toml') if os.path.exists(manifest): - return manifest + return path parent = os.path.dirname(path) if parent == path: return None path = parent + + +def active_view_is_rust(window=None, view=None): + """Determine if the current view is a Rust source file. + + :param window: The Sublime window (defaults to active window). + :param view: The view to check (defaults to active view). + + :Returns: True if it is a Rust source file, False if not. + """ + if view is None: + if window is None: + window = sublime.active_window() + view = window.active_view() + if not view: + return False + # Require it to be saved to disk. + if not view.file_name(): + return False + return 'source.rust' in view.scope_name(0) diff --git a/tests/test_cargo_build.py b/tests/test_cargo_build.py index 0ee31110..b1105bc8 100644 --- a/tests/test_cargo_build.py +++ b/tests/test_cargo_build.py @@ -126,7 +126,8 @@ def _test_target_triple(self, view): settings = cargo_settings.CargoSettings(window) settings.load() cmd_info = cargo_settings.CARGO_COMMANDS['build'] - cmd = settings.get_command(cmd_info)['command'] + manifest_dir = util.find_cargo_manifest(view.file_name()) + cmd = settings.get_command(cmd_info, manifest_dir)['command'] self.assertEqual(cmd, ['cargo', 'build', '--target', 'a-b-c', '--message-format=json']) @@ -144,7 +145,8 @@ def _test_toolchain(self, view): settings = cargo_settings.CargoSettings(window) settings.load() cmd_info = cargo_settings.CARGO_COMMANDS['build'] - cmd = settings.get_command(cmd_info)['command'] + manifest_dir = util.find_cargo_manifest(view.file_name()) + cmd = settings.get_command(cmd_info, manifest_dir)['command'] self.assertEqual(cmd, ['cargo', '+nightly', 'build', '--message-format=json']) @@ -154,7 +156,8 @@ def _test_toolchain(self, view): 'toolchain': None}) settings.load() cmd_info = cargo_settings.CARGO_COMMANDS['build'] - cmd = settings.get_command(cmd_info)['command'] + manifest_dir = util.find_cargo_manifest(view.file_name()) + cmd = settings.get_command(cmd_info, manifest_dir)['command'] self.assertEqual(cmd, ['cargo', 'build', '--message-format=json']) @@ -165,7 +168,8 @@ def _test_toolchain(self, view): window.run_command('cargo_set_target', {'variant': 'build', 'target': '--bin bin1'}) settings.load() - cmd = settings.get_command(cmd_info)['command'] + manifest_dir = util.find_cargo_manifest(view.file_name()) + cmd = settings.get_command(cmd_info, manifest_dir)['command'] self.assertEqual(cmd, ['cargo', '+nightly', 'build', '--bin', 'bin1', '--message-format=json']) diff --git a/tests/test_interrupt.py b/tests/test_interrupt.py index e16e2d91..98ad2c41 100644 --- a/tests/test_interrupt.py +++ b/tests/test_interrupt.py @@ -130,7 +130,6 @@ def test_syntax_check_while_build(self): def _test_syntax_check_while_build(self, view): self._cargo_clean(view) - window = view.window() self._run_build() self._wait_for_start() build_t = self._get_rust_thread() @@ -153,13 +152,11 @@ def test_build_while_syntax_check(self): def _test_build_while_syntax_check(self, view): self._cargo_clean(view) - window = view.window() check_t = plugin.SyntaxCheckPlugin.RustSyntaxCheckThread(view) self._wrap_terminate(check_t) check_t.start() self._wait_for_start() # Should silently kill the syntax check thread. - v = sublime.active_window().active_view() self._run_build() build_t = self._get_rust_thread() self._wrap_terminate(build_t) @@ -177,7 +174,6 @@ def test_build_with_save(self): def _test_build_with_save(self, view): self._cargo_clean(view) - window = view.window() # Trigger on_save for syntax checking. view.run_command('save') # Doing this immediately afterwards should cancel the syntax check @@ -208,7 +204,6 @@ def ok_cancel_dialog(msg, ok_title=None): sublime.ok_cancel_dialog = ok_cancel_dialog try: self._cargo_clean(view) - window = view.window() self._run_build() self._wait_for_start() build_t = self._get_rust_thread() From 35f30e78fcaa80956bcb04f697f9e74770ee7760 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Tue, 21 Mar 2017 13:49:50 -0700 Subject: [PATCH 13/32] Add support for a default path/package. --- RustEnhanced.sublime-commands | 4 ++++ cargo_build.py | 10 ++++++++++ docs/build.md | 5 +++-- rust/cargo_config.py | 29 ++++++++++++++++++++++++++--- rust/cargo_settings.py | 10 ++++++++++ 5 files changed, 53 insertions(+), 5 deletions(-) diff --git a/RustEnhanced.sublime-commands b/RustEnhanced.sublime-commands index 4ca8768d..7702716d 100644 --- a/RustEnhanced.sublime-commands +++ b/RustEnhanced.sublime-commands @@ -35,6 +35,10 @@ "caption": "Rust: Set Cargo Features", "command": "cargo_set_features" }, + { + "caption": "Rust: Set Default Path", + "command": "cargo_set_default_path" + }, { "caption": "Rust: Create New Cargo Build Variant", "command": "cargo_create_new_build" diff --git a/cargo_build.py b/cargo_build.py index bedf86ed..44d3e597 100644 --- a/cargo_build.py +++ b/cargo_build.py @@ -63,12 +63,22 @@ def _determine_working_path(self, on_done): self.working_dir = working_dir self.settings_path = working_dir return on_done() + script_path = self.initial_settings.get('script_path') if script_path: self.working_dir = os.path.dirname(script_path) self.settings_path = script_path return on_done() + default_path = self.settings.get('default_path') + if default_path: + self.settings_path = default_path + if os.path.isfile(default_path): + self.working_dir = os.path.dirname(default_path) + else: + self.working_dir = default_path + return on_done() + if self.command_info.get('requires_manifest', True): cmd = CargoConfigPackage(self.window) cmd.run(functools.partial(self._on_manifest_choice, on_done)) diff --git a/docs/build.md b/docs/build.md index d05a4ca6..a0eb1609 100644 --- a/docs/build.md +++ b/docs/build.md @@ -56,6 +56,7 @@ are: Command | Description ------- | ----------- +Rust: Set Default Path | Set the default Cargo package to build. If not specified, then it will detect it from the current view, or display a panel to choose from. Rust: Set Cargo Target | Set the Cargo target (`--lib`, `--example foo`, etc.) for each build variant. The "Automatic Detection" option will attempt to determine which target to use based on the current active view in Sublime (a test file will use `--test` or a binary will use `--bin`, etc.). Rust: Set Cargo Build Profile | Set whether or not to use the `--release` flag. Rust: Set Cargo Target Triple | Set the target triple (such as `x86_64-apple-darwin`). @@ -89,7 +90,7 @@ An example of a `sublime-project` file: "settings": { "cargo_build": { "paths": { - "path/to/package": { + "/path/to/package": { "defaults": { "release": true }, @@ -117,7 +118,7 @@ The available settings are: Setting Name | Description ------------ | ----------- -`working_dir` | The directory where to run Cargo. If not specified, attempts to detect from the active view, or displays a panel to choose a Cargo package. +`working_dir` | The directory where to run Cargo. If not specified, uses the value from `default_path`, otherwise attempts to detect from the active view, or displays a panel to choose a Cargo package. `script_path` | Path to a `.rs` script, used by `cargo script` if you want to hard-code a specific script to run. `release` | If true, uses the `--release` flag. `target_triple` | If set, uses the `--target` flag with the given value. diff --git a/rust/cargo_config.py b/rust/cargo_config.py index e2860297..ea1db772 100644 --- a/rust/cargo_config.py +++ b/rust/cargo_config.py @@ -62,6 +62,9 @@ class CargoConfigBase(sublime_plugin.WindowCommand): # If True, the command wants the 'package' choice to fetch metadata from # Cargo. package_wants_metadata = True + # If True, the 'package' choice will automatically use the manifest + # from the active view if it is available. + package_allows_active_view_shortcut = True # This is a dictionary populated by the `items_package` method. # Key is the path to a package, the value is the metadata from Cargo. # This is used by other questions (like `items_target`) to get more @@ -153,16 +156,18 @@ def wrapper(index): raise ValueError(item_info) def items_package(self): - # If there is a manifest under the current view, use that by default. view = self.window.active_view() - if view.file_name(): + if self.package_allows_active_view_shortcut and view.file_name(): + # If there is a manifest under the current view, use that by + # default. manifest_dir = util.find_cargo_manifest(view.file_name()) if manifest_dir: if self.package_wants_metadata: metadata = get_cargo_metadata(self.window, manifest_dir) if metadata: for package in metadata['packages']: - package_dir = os.path.dirname(package['manifest_path']) + package_dir = os.path.dirname( + package['manifest_path']) if package_dir == manifest_dir: self.packages = { manifest_dir: package @@ -493,6 +498,24 @@ def done(self): self.choices['features']) +class CargoSetDefaultPath(CargoConfigBase): + + sequence = ['package'] + package_allows_active_view_shortcut = False + + def items_package(self): + result = super(CargoSetDefaultPath, self).items_package() + items = result['items'] + items.insert(0, (['No Default', + 'Build will attempt to detect from the current view, or pop up a selection panel.'], + None)) + result['default'] = self.settings.get('default_path') + return result + + def done(self): + self.settings.set('default_path', self.choices['package']) + + class CargoCreateNewBuild(CargoConfigBase): """Command to create a new build variant, stored in the user's diff --git a/rust/cargo_settings.py b/rust/cargo_settings.py index cbb92c33..c6ebbee4 100644 --- a/rust/cargo_settings.py +++ b/rust/cargo_settings.py @@ -129,6 +129,16 @@ def load(self): Rust Enhanced Warning: This window does not have an associated sublime-project file. Any changes to the Cargo build settings will be lost if you close the window.""")) + def get(self, key, default=None): + return self.project_data.get('settings', {})\ + .get('cargo_build', {})\ + .get(key, default) + + def set(self, key, value): + self.project_data.setdefault('settings', {})\ + .setdefault('cargo_build', {})[key] = value + self.window.set_project_data(self.project_data) + def get_with_target(self, path, target, key, default=None): path = os.path.normpath(path) pdata = self.project_data.get('settings', {})\ From 44c99dbf629566bcfbe9473845d43b107cc46f36 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Tue, 21 Mar 2017 15:03:43 -0700 Subject: [PATCH 14/32] Add "Automatic" build variant. --- RustEnhanced.sublime-build | 4 +++ cargo_build.py | 61 +++++++++++++++++++++++++++++++++----- docs/build.md | 1 + rust/cargo_settings.py | 9 ++++++ rust/target_detect.py | 2 +- tests/test_cargo_build.py | 55 ++++++++++++++++++++++++++++++++++ 6 files changed, 124 insertions(+), 8 deletions(-) diff --git a/RustEnhanced.sublime-build b/RustEnhanced.sublime-build index 9488da5f..39f345cf 100644 --- a/RustEnhanced.sublime-build +++ b/RustEnhanced.sublime-build @@ -4,6 +4,10 @@ "command": "build", "variants": [ + { + "name": "Automatic", + "command": "auto", + }, { "name": "Run", "command": "run", diff --git a/cargo_build.py b/cargo_build.py index 44d3e597..941d2e89 100644 --- a/cargo_build.py +++ b/cargo_build.py @@ -4,7 +4,7 @@ import sublime import sublime_plugin from .rust import (rust_proc, rust_thread, opanel, util, messages, - cargo_settings) + cargo_settings, target_detect) from .rust.cargo_config import * # Maps command to an input string. Used to pre-populate the input panel with @@ -43,15 +43,62 @@ class CargoExecCommand(sublime_plugin.WindowCommand): def run(self, command=None, command_info=None, settings=None): if command is None: return self.window.run_command('build', {'select': True}) - self.command = command - self.command_info = cargo_settings.CARGO_COMMANDS\ - .get(command, {}).copy() - if command_info: - self.command_info.update(command_info) self.initial_settings = settings if settings else {} self.settings = cargo_settings.CargoSettings(self.window) self.settings.load() - self._determine_working_path(self._run_check_for_args) + if command == 'auto': + self._detect_auto_build() + else: + self.command = command + self.command_info = cargo_settings.CARGO_COMMANDS\ + .get(command, {}).copy() + if command_info: + self.command_info.update(command_info) + self._determine_working_path(self._run_check_for_args) + + def _detect_auto_build(self): + """Handle the "auto" build variant, which automatically picks a build + command based on the current view.""" + if not util.active_view_is_rust(): + sublime.error_message(util.multiline_fix(""" + Error: Could not determine what to build. + + Open a Rust source file as the active Sublime view. + """)) + return + td = target_detect.TargetDetector(self.window) + view = self.window.active_view() + targets = td.determine_targets(view.file_name()) + if len(targets) == 0: + sublime.error_message(util.multiline_fix(""" + Error: Could not determine what to build. + + Try using one of the explicit build variants. + """)) + return + + elif len(targets) == 1: + self._auto_choice_made(targets, 0) + + else: + # Can't determine a single target, let the user choose one. + display_items = [' '.join(x[1]) for x in targets] + on_done = functools.partial(self._auto_choice_made, targets) + self.window.show_quick_panel(display_items, on_done) + + def _auto_choice_made(self, targets, index): + if index != -1: + src_path, cmd_line = targets[index] + actions = { + '--bin': 'run', + '--example': 'run', + '--lib': 'build', + '--bench': 'bench', + '--test': 'test', + } + cmd = actions[cmd_line[0]] + self.initial_settings['target'] = ' '.join(cmd_line) + self.run(command=cmd, settings=self.initial_settings) def _determine_working_path(self, on_done): """Determine where Cargo should be run. diff --git a/docs/build.md b/docs/build.md index a0eb1609..b6c03806 100644 --- a/docs/build.md +++ b/docs/build.md @@ -31,6 +31,7 @@ Ctrl-Shift-B / ⌘-Shift-B). They are: Variant | Command | Description ------- | ------- | ----------- (Default) | cargo build | Builds the project. +Automatic | | Automatically detect the command to run based on the currently active view (tests do `test`, binaries and examples do `run`, libraries do `build`, benches do `bench`). Run | cargo run | Runs the binary. Run (with args)... | cargo run -⁠-⁠ *args* | Runs the binary with optional arguments you specify. Test | cargo test | Runs unit and integration tests. diff --git a/rust/cargo_settings.py b/rust/cargo_settings.py index c6ebbee4..53b834ab 100644 --- a/rust/cargo_settings.py +++ b/rust/cargo_settings.py @@ -22,6 +22,15 @@ from . import util, target_detect CARGO_COMMANDS = { + 'auto': { + 'name': 'Automatic', + 'command': 'auto', + 'allows_target': True, + 'allows_target_triple': True, + 'allows_release': True, + 'allows_features': True, + 'allows_json': True, + }, 'build': { 'name': 'Build', 'command': 'build', diff --git a/rust/target_detect.py b/rust/target_detect.py index 2dbc56b5..7b411cb6 100644 --- a/rust/target_detect.py +++ b/rust/target_detect.py @@ -153,7 +153,7 @@ def _targets_longest_matches(self, targets, file_name): break path_match = p # If the match is both --bin and --lib in the same directory, - # just do --lib. + # just do --bin. if found_bin and found_lib: result = [x for x in result if x[1][0] != '--bin'] return result diff --git a/tests/test_cargo_build.py b/tests/test_cargo_build.py index b1105bc8..8112d70a 100644 --- a/tests/test_cargo_build.py +++ b/tests/test_cargo_build.py @@ -386,3 +386,58 @@ def _test_build_env(self, view): self._run_build_wait('run') output = self._get_build_output(window) self.assertRegex(output, '(?m)^RUST_BUILD_ENV_TEST=abcdef$') + + def test_auto_build(self): + """Test "auto" build.""" + tests = [ + # This should probably automatically use nightly? + ('benches/bench1.rs', r'may not be used on the stable release channel'), + ('examples/ex1.rs', r'(?m)^ex1$'), + ('src/bin/bin1.rs', r'(?m)^bin1$'), + ('src/altmain.rs', r'(?m)^altmain$'), + ('src/lib.rs', r'\[Running: cargo build --lib'), + ('src/lmod1.rs', r'\[Running: cargo build --lib'), + ('src/main.rs', r'(?m)^Hello$'), + ('tests/test1.rs', r'(?m)^test sample_test1 \.\.\. ok$'), + ] + for path, pattern in tests: + self._with_open_file('tests/multi-targets/' + path, + self._test_auto_build, pattern=pattern) + + def _test_auto_build(self, view, pattern=None): + window = view.window() + self._run_build_wait('auto') + output = self._get_build_output(window) + self.assertRegex(output, pattern) + + def test_ambiguous_auto_build(self): + """Test "auto" build with indeterminate target.""" + self._with_open_file('tests/multi-targets/tests/common/helpers.rs', + self._test_ambiguous_auto_build) + + def _test_ambiguous_auto_build(self, view): + window = view.window() + sqp = window.__class__.show_quick_panel + window.__class__.show_quick_panel = self._quick_panel + try: + self._test_ambiguous_auto_build2(view) + finally: + window.__class__.show_quick_panel = sqp + + def _quick_panel(self, items, on_done, flags=0, + selected_index=-1, on_highlighted=None): + self.assertEqual(items, self.quick_panel_items) + on_done(self.quick_panel_index) + + def _test_ambiguous_auto_build2(self, view): + window = view.window() + self.quick_panel_items = ['--test test1', '--test test2'] + self.quick_panel_index = 0 + self._run_build_wait('auto') + output = self._get_build_output(window) + self.assertRegex(output, r'\[Running: cargo test --test test1 ') + + self.quick_panel_index = 1 + self._run_build_wait('auto') + output = self._get_build_output(window) + self.assertRegex(output, r'\[Running: cargo test --test test2 ') From e01b25ec3c5e2841d8d31a4adaf6b05cde553a96 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Wed, 29 Mar 2017 12:34:10 -0700 Subject: [PATCH 15/32] Stop looking for JSON output during Cargo build once compile is finished. This fixes issues with "cargo run" if your program outputs { at the start of a line. --- rust/rust_proc.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/rust/rust_proc.py b/rust/rust_proc.py index 366e091c..c1a0659e 100644 --- a/rust/rust_proc.py +++ b/rust/rust_proc.py @@ -5,6 +5,7 @@ import json import os +import re import signal import subprocess import sys @@ -266,6 +267,7 @@ def wait(self): return rc def _read_stdout(self): + decode_json = True while True: line = self.proc.stdout.readline() if not line: @@ -276,14 +278,14 @@ def _read_stdout(self): line = line.decode('utf-8') except: self.listener.on_error(self, - 'Error decoding UTF-8: %r' % line) + '[Error decoding UTF-8: %r]' % line) continue - if line.startswith('{'): + if decode_json and line.startswith('{'): try: result = json.loads(line) except: self.listener.on_error(self, - 'Error loading JSON from rust:\n%r' % line) + '[Error loading JSON from rust: %r]' % line) else: try: self.listener.on_json(self, result) @@ -291,6 +293,10 @@ def _read_stdout(self): self._cleanup() raise else: + if re.match('^\s*Finished', line): + # If using "cargo run", we don't want to capture lines + # starting with open bracket. + decode_json = False # Sublime always uses \n internally. line = line.replace('\r\n', '\n') self.listener.on_data(self, line) From cf81124d65278129d5f16a9c02a034b9dd187fb2 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Wed, 29 Mar 2017 13:58:56 -0700 Subject: [PATCH 16/32] Better fix for checking when we should stop looking for JSON output. The previous fix caused issues with Clippy. --- cargo_build.py | 15 +++++++++------ docs/build.md | 1 + rust/cargo_settings.py | 1 + rust/rust_proc.py | 23 ++++++++++++++++------- tests/test_cargo_build.py | 5 +++-- 5 files changed, 30 insertions(+), 15 deletions(-) diff --git a/cargo_build.py b/cargo_build.py index 941d2e89..fbbce27e 100644 --- a/cargo_build.py +++ b/cargo_build.py @@ -185,18 +185,21 @@ def __init__(self, window, settings, command_info, initial_settings, self.working_dir = working_dir def run(self): - cmd_info = self.settings.get_command(self.command_info, - self.settings_path, - self.initial_settings) - if not cmd_info: + cmd = self.settings.get_command(self.command_info, + self.settings_path, + self.initial_settings) + if not cmd: return messages.clear_messages(self.window) p = rust_proc.RustProc() listener = opanel.OutputListener(self.window, self.working_dir) + print('command_info=%r' % self.command_info) try: - p.run(self.window, cmd_info['command'], + p.run(self.window, cmd['command'], self.working_dir, listener, - env=cmd_info['env']) + env=cmd['env'], + decode_json=self.command_info.get('allows_json', False), + json_stop_pattern=self.command_info.get('json_stop_pattern')) p.wait() except rust_proc.ProcessTerminatedError: return diff --git a/docs/build.md b/docs/build.md index b6c03806..21f716d6 100644 --- a/docs/build.md +++ b/docs/build.md @@ -169,6 +169,7 @@ Setting Name | Default | Description `allows_release` | False | If True, allows `--release` flag. `allows_features` | False | If True, allows feature flags. `allows_json` | False | If True, allows `--message-format=json` flag. +`json_stop_pattern` | None | A regular expression matched against Cargo's output to detect when it should stop looking for JSON messages (used by `cargo run` to stop looking for JSON messages once compilation is finished). `requires_manifest` | True | If True, the command must be run in a directory with a `Cargo.toml` manifest. `requires_view_path` | False | If True, then the active view must be a Rust source file, and the path to that file will be passed into Cargo (used mainly by `cargo script`). `wants_run_args` | False | If True, it will ask for extra args to pass to the executable (after the `--` flag separator). diff --git a/rust/cargo_settings.py b/rust/cargo_settings.py index 53b834ab..5031ee76 100644 --- a/rust/cargo_settings.py +++ b/rust/cargo_settings.py @@ -48,6 +48,7 @@ 'allows_release': True, 'allows_features': True, 'allows_json': True, + 'json_stop_pattern': '^\s*Running ', }, 'check': { 'name': 'Check', diff --git a/rust/rust_proc.py b/rust/rust_proc.py index c1a0659e..5047f210 100644 --- a/rust/rust_proc.py +++ b/rust/rust_proc.py @@ -140,7 +140,8 @@ class RustProc(object): # The thread used for reading output. _stdout_thread = None - def run(self, window, cmd, cwd, listener, env=None): + def run(self, window, cmd, cwd, listener, env=None, + decode_json=True, json_stop_pattern=None): """Run the process. :param window: Sublime window. @@ -148,6 +149,12 @@ def run(self, window, cmd, cwd, listener, env=None): :param cwd: The directory where to run the command. :param listener: `ProcListener` to receive the output. :param env: Dictionary of environment variables to add. + :param decode_json: If True, will check for lines starting with `{` to + decode as a JSON message. + :param json_stop_pattern: Regular expression used to detect when it + should stop looking for JSON messages. This is used by `cargo + run` so that it does not capture output from the user's program + that might start with an open curly brace. :raises ProcessTermiantedError: Process was terminated by another thread. @@ -157,6 +164,8 @@ def run(self, window, cmd, cwd, listener, env=None): self.listener = listener self.start_time = time.time() self.window = window + self.decode_json = decode_json + self.json_stop_pattern = json_stop_pattern from . import rust_thread try: @@ -267,7 +276,6 @@ def wait(self): return rc def _read_stdout(self): - decode_json = True while True: line = self.proc.stdout.readline() if not line: @@ -280,7 +288,7 @@ def _read_stdout(self): self.listener.on_error(self, '[Error decoding UTF-8: %r]' % line) continue - if decode_json and line.startswith('{'): + if self.decode_json and line.startswith('{'): try: result = json.loads(line) except: @@ -293,10 +301,11 @@ def _read_stdout(self): self._cleanup() raise else: - if re.match('^\s*Finished', line): - # If using "cargo run", we don't want to capture lines - # starting with open bracket. - decode_json = False + print('Checking pattern %r to line %r' % (self.json_stop_pattern, line)) + if self.json_stop_pattern and \ + re.match(self.json_stop_pattern, line): + # Stop looking for JSON open curly bracket. + self.decode_json = False # Sublime always uses \n internally. line = line.replace('\r\n', '\n') self.listener.on_data(self, line) diff --git a/tests/test_cargo_build.py b/tests/test_cargo_build.py index 8112d70a..e8ce9073 100644 --- a/tests/test_cargo_build.py +++ b/tests/test_cargo_build.py @@ -194,11 +194,12 @@ def test_run_with_args(self): def _test_run_with_args(self, view): window = view.window() + # Curly braces to ensure it is not captured as JSON. self._run_build_wait('run', - settings={'extra_run_args': 'this is a test', + settings={'extra_run_args': '{this is a test}', 'target': '--bin bin2'}) output = self._get_build_output(window) - self.assertRegex(output, '(?m)^this is a test$') + self.assertRegex(output, '(?m)^{this is a test}$') def test_test(self): """Test "Test" variant.""" From a60e264843c0b227a2fddf96a180fb3ed4144720 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Fri, 31 Mar 2017 14:38:00 -0700 Subject: [PATCH 17/32] Remove debug print left behind. --- cargo_build.py | 1 - rust/rust_proc.py | 1 - 2 files changed, 2 deletions(-) diff --git a/cargo_build.py b/cargo_build.py index fbbce27e..c07950a4 100644 --- a/cargo_build.py +++ b/cargo_build.py @@ -193,7 +193,6 @@ def run(self): messages.clear_messages(self.window) p = rust_proc.RustProc() listener = opanel.OutputListener(self.window, self.working_dir) - print('command_info=%r' % self.command_info) try: p.run(self.window, cmd['command'], self.working_dir, listener, diff --git a/rust/rust_proc.py b/rust/rust_proc.py index 5047f210..4bca4350 100644 --- a/rust/rust_proc.py +++ b/rust/rust_proc.py @@ -301,7 +301,6 @@ def _read_stdout(self): self._cleanup() raise else: - print('Checking pattern %r to line %r' % (self.json_stop_pattern, line)) if self.json_stop_pattern and \ re.match(self.json_stop_pattern, line): # Stop looking for JSON open curly bracket. From 41b23d785ead6221dcfc3dcdabae01e14f1d4e94 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Thu, 27 Apr 2017 17:07:54 -0700 Subject: [PATCH 18/32] Minor updates for rust 1.17. --- tests/error-tests/tests/test_unicode.rs | 1 + tests/multi-targets/src/altmain.rs | 1 + tests/multi-targets/src/lib.rs | 2 +- tests/multi-targets/src/lmod1.rs | 1 + tests/multi-targets/tests/common/helpers.rs | 2 ++ tests/test_syntax_check.py | 12 +++++------- 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/tests/error-tests/tests/test_unicode.rs b/tests/error-tests/tests/test_unicode.rs index 7bdbc2d3..73c4475c 100644 --- a/tests/error-tests/tests/test_unicode.rs +++ b/tests/error-tests/tests/test_unicode.rs @@ -3,4 +3,5 @@ fn main() { let foo = "❤"; // ^WARN unused variable + // ^^NOTE(>=1.17.0) #[warn(unused_variables)] } diff --git a/tests/multi-targets/src/altmain.rs b/tests/multi-targets/src/altmain.rs index b4459935..5ec73939 100644 --- a/tests/multi-targets/src/altmain.rs +++ b/tests/multi-targets/src/altmain.rs @@ -5,3 +5,4 @@ fn main() { fn warning_example() { } // ^WARN function is never used +// ^^NOTE(>=1.17.0) #[warn(dead_code)] diff --git a/tests/multi-targets/src/lib.rs b/tests/multi-targets/src/lib.rs index 2237545f..852192b2 100644 --- a/tests/multi-targets/src/lib.rs +++ b/tests/multi-targets/src/lib.rs @@ -7,4 +7,4 @@ pub fn libf1() { fn unused() { } // ^WARN function is never used -// ^^NOTE(clippy) #[warn(dead_code)] +// ^^NOTE(>=1.17.0) #[warn(dead_code)] diff --git a/tests/multi-targets/src/lmod1.rs b/tests/multi-targets/src/lmod1.rs index c4b1255f..dc327e2a 100644 --- a/tests/multi-targets/src/lmod1.rs +++ b/tests/multi-targets/src/lmod1.rs @@ -2,6 +2,7 @@ pub fn fmod1() { println!("fmod1"); d(); // ^WARN deprecated + // ^^NOTE(>=1.17.0) #[warn(deprecated)] } #[deprecated] diff --git a/tests/multi-targets/tests/common/helpers.rs b/tests/multi-targets/tests/common/helpers.rs index a92c107c..69c9b90d 100644 --- a/tests/multi-targets/tests/common/helpers.rs +++ b/tests/multi-targets/tests/common/helpers.rs @@ -4,8 +4,10 @@ pub fn helper() { } // ^WARN function is never used +// ^^NOTE(>=1.17.0) #[warn(dead_code)] pub fn unused() { } // ^WARN function is never used +// ^^NOTE(>=1.17.0) #[warn(dead_code)] diff --git a/tests/test_syntax_check.py b/tests/test_syntax_check.py index 9276933b..6078f94e 100755 --- a/tests/test_syntax_check.py +++ b/tests/test_syntax_check.py @@ -10,6 +10,11 @@ class TestSyntaxCheck(TestBase): + def setUp(self): + super(TestSyntaxCheck, self).setUp() + self.rustc_version = util.get_rustc_version(sublime.active_window(), + plugin_path) + def test_messages(self): """Test message generation. @@ -31,9 +36,6 @@ def test_messages(self): formatting of messages. Hopefully these examples are relatively stable for now. """ - self.rustc_version = util.get_rustc_version(sublime.active_window(), - plugin_path) - to_test = [ 'multi-targets/src/lib.rs', 'multi-targets/src/lmod1.rs', @@ -76,7 +78,6 @@ def test_clippy_messages(self): """Test clippy messages.""" to_test = [ 'tests/error-tests/examples/clippy_ex.rs', - 'tests/multi-targets/src/lib.rs', ] for path in to_test: self._with_open_file(path, self._test_messages, methods=['clippy']) @@ -131,9 +132,6 @@ def restriction_check(restrictions): # blocks (see # https://github.com/rust-lang/cargo/issues/3431) return False - elif check == 'clippy': - if method != 'clippy': - return False else: if not semver.match(self.rustc_version, check): return False From d50615836236c337cad3cf3d233ee96a25be1560 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Sat, 6 May 2017 15:20:06 -0700 Subject: [PATCH 19/32] Change message tests to check the region of the message. --- tests/error-tests/benches/bench_err.rs | 4 +- tests/error-tests/examples/clippy_ex.rs | 14 +- tests/error-tests/src/lib.rs | 18 +- tests/error-tests/tests/E0005.rs | 4 +- tests/error-tests/tests/arg-count-mismatch.rs | 9 +- tests/error-tests/tests/binop-mul-bool.rs | 4 +- ...cast-to-unsized-trait-object-suggestion.rs | 12 +- tests/error-tests/tests/dead-code-ret.rs | 4 +- tests/error-tests/tests/test_unicode.rs | 4 +- tests/multi-targets/src/altmain.rs | 8 +- tests/multi-targets/src/lib.rs | 8 +- tests/multi-targets/src/lmod1.rs | 4 +- tests/multi-targets/tests/common/helpers.rs | 16 +- tests/test_syntax_check.py | 170 ++++++++++++++---- .../workspace1/src/anothermod/mod.rs | 8 +- tests/workspace/workspace1/src/lib.rs | 10 +- tests/workspace/workspace2/src/lib.rs | 8 +- tests/workspace/workspace2/src/somemod.rs | 8 +- 18 files changed, 207 insertions(+), 106 deletions(-) diff --git a/tests/error-tests/benches/bench_err.rs b/tests/error-tests/benches/bench_err.rs index 7ac88ada..c1185fa5 100644 --- a/tests/error-tests/benches/bench_err.rs +++ b/tests/error-tests/benches/bench_err.rs @@ -1,6 +1,6 @@ // Can't have a regular bench because [feature(test)] is restricted // to nightly. -#[asdf] -// ^ERR The attribute `asdf` is currently unknown + #[asdf] +// ^^^^^^^ERR The attribute `asdf` is currently unknown fn f() {} diff --git a/tests/error-tests/examples/clippy_ex.rs b/tests/error-tests/examples/clippy_ex.rs index f24af24d..1e414483 100644 --- a/tests/error-tests/examples/clippy_ex.rs +++ b/tests/error-tests/examples/clippy_ex.rs @@ -3,13 +3,13 @@ fn clippy_example() { println!("libf1"); 'x' as u8; - // ^WARN casting character literal - // ^^NOTE #[warn(char_lit_as_u8)] - // ^^^HELP Consider using a byte - // ^^^^HELP for further information - // ^^^^^WARN statement with no effect - // ^^^^^^NOTE #[warn(no_effect)] - // ^^^^^^^HELP for further information +// ^^^^^^^^^WARN casting character literal +// ^^^^^^^^^NOTE #[warn(char_lit_as_u8)] +// ^^^^^^^^^HELP Consider using a byte +// ^^^^^^^^^HELP for further information +// ^^^^^^^^^^WARN statement with no effect +// ^^^^^^^^^^NOTE #[warn(no_effect)] +// ^^^^^^^^^^HELP for further information } fn main() { diff --git a/tests/error-tests/src/lib.rs b/tests/error-tests/src/lib.rs index 89cf75f4..2cf33213 100644 --- a/tests/error-tests/src/lib.rs +++ b/tests/error-tests/src/lib.rs @@ -1,19 +1,19 @@ #[cfg(test)] mod tests { fn bad(a: DoesNotExist) { - // ^ERR(<1.16.0) undefined or not in scope - // ^^ERR(<1.16.0) type name - // ^^^HELP(<1.16.0) no candidates - // ^^^^ERR(>=1.16.0,test) not found in this scope - // ^^^^^ERR(>=1.16.0,test) cannot find type `DoesNotExist` +// ^^^^^^^^^^^^ERR(<1.16.0) undefined or not in scope +// ^^^^^^^^^^^^ERR(<1.16.0) type name +// ^^^^^^^^^^^^HELP(<1.16.0) no candidates +// ^^^^^^^^^^^^ERR(>=1.16.0,test) not found in this scope +// ^^^^^^^^^^^^ERR(>=1.16.0,test) cannot find type `DoesNotExist` } #[test] fn it_works() { asdf - // ^ERR(<1.16.0) unresolved name - // ^^ERR(<1.16.0) unresolved name - // ^^^ERR(>=1.16.0,test) not found in this scope - // ^^^^ERR(>=1.16.0,test) cannot find value +// ^^^^ERR(<1.16.0) unresolved name +// ^^^^ERR(<1.16.0) unresolved name +// ^^^^ERR(>=1.16.0,test) not found in this scope +// ^^^^ERR(>=1.16.0,test) cannot find value } } diff --git a/tests/error-tests/tests/E0005.rs b/tests/error-tests/tests/E0005.rs index 0e7a7156..0122b8f3 100644 --- a/tests/error-tests/tests/E0005.rs +++ b/tests/error-tests/tests/E0005.rs @@ -11,6 +11,6 @@ fn main() { let x = Some(1); let Some(y) = x; - // ^ERR pattern `None` not covered - // ^^ERR refutable pattern in local binding +// ^^^^^^^ERR pattern `None` not covered +// ^^^^^^^ERR refutable pattern in local binding } diff --git a/tests/error-tests/tests/arg-count-mismatch.rs b/tests/error-tests/tests/arg-count-mismatch.rs index 25245ccd..91f05767 100644 --- a/tests/error-tests/tests/arg-count-mismatch.rs +++ b/tests/error-tests/tests/arg-count-mismatch.rs @@ -10,11 +10,12 @@ // error-pattern: parameters were supplied -fn f(x: isize) { } -// ^ERR defined here +/*BEGIN*/fn f(x: isize) { +}/*END*/ +// ~ERR defined here // children without spans, spans with no labels // Should display error (with link) and a note of expected type. fn main() { let i: (); i = f(); } -// ^ERR expected 1 parameter -// ^^ERR this function takes 1 parameter +// ^^^ERR expected 1 parameter +// ^^^ERR this function takes 1 parameter diff --git a/tests/error-tests/tests/binop-mul-bool.rs b/tests/error-tests/tests/binop-mul-bool.rs index 5df43512..45df6189 100644 --- a/tests/error-tests/tests/binop-mul-bool.rs +++ b/tests/error-tests/tests/binop-mul-bool.rs @@ -11,5 +11,5 @@ // error-pattern:`*` cannot be applied to type `bool` fn main() { let x = true * false; } -// ^ERR binary operation -// ^^NOTE an implementation of +// ^^^^ERR binary operation +// ^^^^NOTE an implementation of diff --git a/tests/error-tests/tests/cast-to-unsized-trait-object-suggestion.rs b/tests/error-tests/tests/cast-to-unsized-trait-object-suggestion.rs index a30fad08..85b51444 100644 --- a/tests/error-tests/tests/cast-to-unsized-trait-object-suggestion.rs +++ b/tests/error-tests/tests/cast-to-unsized-trait-object-suggestion.rs @@ -10,11 +10,11 @@ fn main() { &1 as Send; - // ^ERR cast to unsized type - // ^^HELP try casting to - // ^^^HELP &1 as &Send +// ^^^^^^^^^^ERR cast to unsized type +// ^^^^HELP try casting to +// ^^^^HELP &1 as &Send Box::new(1) as Send; - // ^ERR cast to unsized type - // ^^HELP try casting to a `Box` instead: - // ^^^HELP Box::new(1) as Box; +// ^^^^^^^^^^^^^^^^^^^ERR cast to unsized type +// ^^^^HELP try casting to a `Box` instead: +// ^^^^HELP Box::new(1) as Box; } diff --git a/tests/error-tests/tests/dead-code-ret.rs b/tests/error-tests/tests/dead-code-ret.rs index 5b9afdca..6e33dad9 100644 --- a/tests/error-tests/tests/dead-code-ret.rs +++ b/tests/error-tests/tests/dead-code-ret.rs @@ -11,12 +11,12 @@ // error-pattern: unreachable statement #![deny(unreachable_code)] -// ^NOTE lint level defined here +// ^^^^^^^^^^^^^^^^NOTE lint level defined here fn main() { return; println!("Paul is dead"); - // ^ERR unreachable statement +// ^^^^^^^^^^^^^^^^^^^^^^^^^ERR unreachable statement } // This is a test of macro expansion, should print error on println! diff --git a/tests/error-tests/tests/test_unicode.rs b/tests/error-tests/tests/test_unicode.rs index 73c4475c..b2487179 100644 --- a/tests/error-tests/tests/test_unicode.rs +++ b/tests/error-tests/tests/test_unicode.rs @@ -2,6 +2,6 @@ fn main() { let foo = "❤"; - // ^WARN unused variable - // ^^NOTE(>=1.17.0) #[warn(unused_variables)] +// ^^^WARN unused variable +// ^^^NOTE(>=1.17.0) #[warn(unused_variables)] } diff --git a/tests/multi-targets/src/altmain.rs b/tests/multi-targets/src/altmain.rs index 5ec73939..5c792d5a 100644 --- a/tests/multi-targets/src/altmain.rs +++ b/tests/multi-targets/src/altmain.rs @@ -2,7 +2,7 @@ fn main() { println!("altmain"); } -fn warning_example() { -} -// ^WARN function is never used -// ^^NOTE(>=1.17.0) #[warn(dead_code)] +/*BEGIN*/fn warning_example() { +}/*END*/ +// ~WARN function is never used +// ~NOTE(>=1.17.0) #[warn(dead_code)] diff --git a/tests/multi-targets/src/lib.rs b/tests/multi-targets/src/lib.rs index 852192b2..d8e3f210 100644 --- a/tests/multi-targets/src/lib.rs +++ b/tests/multi-targets/src/lib.rs @@ -4,7 +4,7 @@ pub fn libf1() { println!("libf1"); } -fn unused() { -} -// ^WARN function is never used -// ^^NOTE(>=1.17.0) #[warn(dead_code)] +/*BEGIN*/fn unused() { +}/*END*/ +// ~WARN function is never used +// ~NOTE(>=1.17.0) #[warn(dead_code)] diff --git a/tests/multi-targets/src/lmod1.rs b/tests/multi-targets/src/lmod1.rs index dc327e2a..b85830de 100644 --- a/tests/multi-targets/src/lmod1.rs +++ b/tests/multi-targets/src/lmod1.rs @@ -1,8 +1,8 @@ pub fn fmod1() { println!("fmod1"); d(); - // ^WARN deprecated - // ^^NOTE(>=1.17.0) #[warn(deprecated)] +// ^WARN deprecated +// ^NOTE(>=1.17.0) #[warn(deprecated)] } #[deprecated] diff --git a/tests/multi-targets/tests/common/helpers.rs b/tests/multi-targets/tests/common/helpers.rs index 69c9b90d..f3067e26 100644 --- a/tests/multi-targets/tests/common/helpers.rs +++ b/tests/multi-targets/tests/common/helpers.rs @@ -1,13 +1,13 @@ // Example of a module shared among test code. -pub fn helper() { +/*BEGIN*/pub fn helper() { -} -// ^WARN function is never used -// ^^NOTE(>=1.17.0) #[warn(dead_code)] +}/*END*/ +// ~WARN function is never used +// ~NOTE(>=1.17.0) #[warn(dead_code)] -pub fn unused() { +/*BEGIN*/pub fn unused() { -} -// ^WARN function is never used -// ^^NOTE(>=1.17.0) #[warn(dead_code)] +}/*END*/ +// ~WARN function is never used +// ~NOTE(>=1.17.0) #[warn(dead_code)] diff --git a/tests/test_syntax_check.py b/tests/test_syntax_check.py index 6078f94e..67863ee0 100755 --- a/tests/test_syntax_check.py +++ b/tests/test_syntax_check.py @@ -19,18 +19,31 @@ def test_messages(self): """Test message generation. Each of the listed files has comments that annotate where a message - should appear. The carets in front indicate the number of lines above - the comment where the last line of the message is. This allows for - multiple messages to be on the same line. For example: - // ^ERR expected 1 parameter - // ^^ERR this function takes 1 parameter + should appear. Single-line messages use carets to specify where the + message should appear on the previous line. Use multiple comments if + there are multiple messages. Example: + + // ^^^^ERR binary operation + // ^^^^NOTE an implementation of + + Multi-line messages use a marker to indicate where it starts and ends, + and then comment lines below starting with ~ specify the messages that + should appear for that region. Example: + + /*BEGIN*/struct S { + recursive: S + }/*END*/ + // ~ERR recursive type has infinite size + // ~ERR recursive type + // ~HELP insert indirection You can place restrictions on the message in parenthesis after the level (comma separated). This can be a semver check, or the word "test" to indicate that this message only shows up in a cfg(test) block. Examples: - // ^ERR(<1.16.0) error msg before 1.16 - // ^^ERR(>=1.16.0,test) error msg after 1.16, test block only + + // ^^^ERR(<1.16.0) error msg before 1.16 + // ^^^ERR(>=1.16.0,test) error msg after 1.16, test block only These tests are somewhat fragile, as new versions of Rust change the formatting of messages. Hopefully these examples are relatively @@ -85,7 +98,7 @@ def test_clippy_messages(self): def _test_messages(self, view, methods=None): # Trigger the generation of messages. phantoms = [] - regions = [] + view_regions = [] def collect_phantoms(v, key, region, content, layout, on_navigate): if v == view: @@ -93,7 +106,7 @@ def collect_phantoms(v, key, region, content, layout, on_navigate): def collect_regions(v, key, regions, scope, icon, flags): if v == view: - regions.extend(regions) + view_regions.extend(regions) m = plugin.rust.messages orig_add_phantom = m._sublime_add_phantom @@ -103,9 +116,9 @@ def collect_regions(v, key, regions, scope, icon, flags): try: for method in methods: with AlteredSetting('rust_syntax_checking_method', method): - self._test_messages2(view, phantoms, regions, method) + self._test_messages2(view, phantoms, view_regions, method) phantoms.clear() - regions.clear() + view_regions.clear() finally: m._sublime_add_phantom = orig_add_phantom m._sublime_add_regions = orig_add_regions @@ -118,8 +131,7 @@ def _test_messages2(self, view, phantoms, regions, method): e.on_post_save(view) # Wait for it to finish. self._get_rust_thread().join() - pattern = '(\^+)(WARN|ERR|HELP|NOTE)(\([^)]+\))? (.+)' - expected_messages = view.find_all(pattern) + expected_messages = self._collect_expected_regions(view) def restriction_check(restrictions): if not restrictions: @@ -137,31 +149,119 @@ def restriction_check(restrictions): return False return True - for emsg_r in expected_messages: - row, col = view.rowcol(emsg_r.begin()) - text = view.substr(emsg_r) - m = re.match(pattern, text) - line_offset = len(m.group(1)) - msg_row = row - line_offset - msg_type = m.group(2) - msg_type_text = { - 'WARN': 'warning', - 'ERR': 'error', - 'NOTE': 'note', - 'HELP': 'help', - }[msg_type] - restrictions = m.group(3) - msg_content = m.group(4) - if restriction_check(restrictions): + # Check phantoms. + for emsg_info in expected_messages: + if restriction_check(emsg_info['restrictions']): for i, (region, content) in enumerate(phantoms): content = unescape(content) - r_row, r_col = view.rowcol(region.end()) - if r_row == msg_row and msg_content in content: - self.assertIn(msg_type_text, content) + # Phantom regions only apply to the last row. + r_row, _ = view.rowcol(region.end()) + emsg_row, _ = view.rowcol(emsg_info['end']) + if r_row == emsg_row and emsg_info['message'] in content: + self.assertIn(emsg_info['level_text'], content) break else: - raise AssertionError('Did not find expected message "%s:%s" on line %r for file %r' % ( - msg_type, msg_content, msg_row, view.file_name())) + raise AssertionError('Did not find expected message "%s:%s" for region %r:%r for file %r' % ( + emsg_info['level'], emsg_info['message'], + emsg_info['begin'], emsg_info['end'], + view.file_name())) del phantoms[i] if len(phantoms): - raise AssertionError('Got extra phantoms for %r: %r' % (view.file_name(), phantoms)) + raise AssertionError('Got extra phantoms for %r: %r' % ( + view.file_name(), phantoms)) + + # Check regions. + found_regions = set() + region_set = {(r.begin(), r.end()) for r in regions} + + for emsg_info in expected_messages: + if restriction_check(emsg_info['restrictions']): + r = (emsg_info['begin'], emsg_info['end']) + if r in region_set: + found_regions.add(r) + else: + raise AssertionError('Did not find expected region %r,%r for file %r' % ( + emsg_info['begin'], emsg_info['end'], view.file_name())) + if len(region_set) != len(found_regions): + extra_regions = region_set - found_regions + raise AssertionError('Got extra regions for %r: %r' % ( + view.file_name(), extra_regions)) + + def _collect_expected_regions(self, view): + """Scans through the view looking for the markup that tells us where + error messages should appear. + + Returns a list of dictionaries with info about each message. + """ + result = [] + msg_level_text = { + 'WARN': 'warning', + 'ERR': 'error', + 'NOTE': 'note', + 'HELP': 'help', + } + # Multi-line spans. + region_map = {} # Map the last row number to a (begin,end) region. + pattern = r'(?s)/\*BEGIN\*/(.*?)/\*END\*/' + regions = view.find_all(pattern) + for region in regions: + row = view.rowcol(region.end())[0] + region_map[row] = (region.begin() + 9, region.end() - 7) + + pattern = r'// *~(WARN|ERR|HELP|NOTE)(\([^)]+\))? (.+)' + regions = view.find_all(pattern) + last_line = None # Used to handle multiple messages on the same line. + last_line_offset = 1 + for region in regions: + text = view.substr(region) + m = re.match(pattern, text) + row = view.rowcol(region.begin())[0] + if row - 1 == last_line: + last_line = row + row -= last_line_offset + last_line_offset += 1 + else: + last_line = row + last_line_offset = 1 + try: + actual_region = region_map[row - 1] + except KeyError: + raise AssertionError('Invalid test: %r did not have region on row %r' % ( + view.file_name(), row - 1)) + result.append({ + 'begin': actual_region[0], + 'end': actual_region[1], + 'level': m.group(1), + 'level_text': msg_level_text[m.group(1)], + 'restrictions': m.group(2), + 'message': m.group(3) + }) + + # Single-line spans. + last_line = None + last_line_offset = 1 + pattern = r'//( *)(\^+)(WARN|ERR|HELP|NOTE)(\([^)]+\))? (.+)' + regions = view.find_all(pattern) + for region in regions: + text = view.substr(region) + m = re.match(pattern, text) + row, col = view.rowcol(region.begin()) + if row - 1 == last_line: + last_line = row + row -= last_line_offset + last_line_offset += 1 + else: + last_line = row + last_line_offset = 1 + begin = view.text_point(row - 1, col + 2 + len(m.group(1))) + end = begin + len(m.group(2)) + result.append({ + 'begin': begin, + 'end': end, + 'level': m.group(3), + 'level_text': msg_level_text[m.group(3)], + 'restrictions': m.group(4), + 'message': m.group(5) + }) + + return result diff --git a/tests/workspace/workspace1/src/anothermod/mod.rs b/tests/workspace/workspace1/src/anothermod/mod.rs index 1b6140eb..5964197e 100644 --- a/tests/workspace/workspace1/src/anothermod/mod.rs +++ b/tests/workspace/workspace1/src/anothermod/mod.rs @@ -1,7 +1,7 @@ fn f() { asdf(); - // ^ERR(<1.16.0) unresolved name - // ^^ERR(<1.16.0) unresolved name `asdf` - // ^^^ERR(>=1.16.0) not found in this scope - // ^^^^ERR(>=1.16.0) cannot find function +// ^^^^ERR(<1.16.0) unresolved name +// ^^^^ERR(<1.16.0) unresolved name `asdf` +// ^^^^ERR(>=1.16.0) not found in this scope +// ^^^^ERR(>=1.16.0) cannot find function } diff --git a/tests/workspace/workspace1/src/lib.rs b/tests/workspace/workspace1/src/lib.rs index afe3be30..910b1e59 100644 --- a/tests/workspace/workspace1/src/lib.rs +++ b/tests/workspace/workspace1/src/lib.rs @@ -1,8 +1,8 @@ mod anothermod; -struct S { +/*BEGIN*/struct S { recursive: S -} -// ^ERR recursive type has infinite size -// ^^ERR recursive type -// ^^^HELP insert indirection +}/*END*/ +// ~ERR recursive type has infinite size +// ~ERR recursive type +// ~HELP insert indirection diff --git a/tests/workspace/workspace2/src/lib.rs b/tests/workspace/workspace2/src/lib.rs index d5094026..a68b52ba 100644 --- a/tests/workspace/workspace2/src/lib.rs +++ b/tests/workspace/workspace2/src/lib.rs @@ -5,8 +5,8 @@ trait Trait {} pub fn f() { let x = Box::new(0u32); let y: &Trait = x; - // ^ERR expected &Trait, found - // ^^ERR mismatched types - // ^^^NOTE expected type `&Trait` - // ^^^^NOTE(<1.16.0) found type +// ^ERR expected &Trait, found +// ^ERR mismatched types +// ^NOTE expected type `&Trait` +// ^NOTE(<1.16.0) found type } diff --git a/tests/workspace/workspace2/src/somemod.rs b/tests/workspace/workspace2/src/somemod.rs index 8607dbc5..7e6bd949 100644 --- a/tests/workspace/workspace2/src/somemod.rs +++ b/tests/workspace/workspace2/src/somemod.rs @@ -1,8 +1,8 @@ fn f() { someerr - // ^ERR(<1.16.0) unresolved name - // ^^ERR(<1.16.0) unresolved name `someerr` - // ^^^ERR(>=1.16.0) not found in this scope - // ^^^^ERR(>=1.16.0) cannot find value +// ^^^^^^^ERR(<1.16.0) unresolved name +// ^^^^^^^ERR(<1.16.0) unresolved name `someerr` +// ^^^^^^^ERR(>=1.16.0) not found in this scope +// ^^^^^^^ERR(>=1.16.0) cannot find value } From 7360da4e20cbcef7dae45e2809d9a0252db4fc73 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Sat, 6 May 2017 15:23:53 -0700 Subject: [PATCH 20/32] Fix error highlighting for nested macros. --- rust/messages.py | 16 +++++++--------- tests/error-tests/Cargo.lock | 7 +++++++ tests/error-tests/Cargo.toml | 1 + tests/error-tests/dcrate/Cargo.lock | 4 ++++ tests/error-tests/dcrate/Cargo.toml | 5 +++++ tests/error-tests/dcrate/src/lib.rs | 11 +++++++++++ tests/error-tests/tests/macro-expansion.rs | 9 +++++++++ tests/test_syntax_check.py | 1 + 8 files changed, 45 insertions(+), 9 deletions(-) create mode 100644 tests/error-tests/dcrate/Cargo.lock create mode 100644 tests/error-tests/dcrate/Cargo.toml create mode 100644 tests/error-tests/dcrate/src/lib.rs create mode 100644 tests/error-tests/tests/macro-expansion.rs diff --git a/rust/messages.py b/rust/messages.py index 23403714..fec1bfbb 100644 --- a/rust/messages.py +++ b/rust/messages.py @@ -546,16 +546,14 @@ def add_primary_message(path, span_region, is_main, message): is_primary = span['is_primary'] if 'macros>' in span['file_name']: - # Rust gives the chain of expansions for the macro, which we - # don't really care about. We want to find the site where the - # macro was invoked. + # Rust gives the chain of expansions for the macro, which we don't + # really care about. We want to find the site where the macro was + # invoked. I'm not entirely confident this is the best way to do + # this, but it seems to work. This is roughly emulating what is + # done in librustc_errors/emitter.rs fix_multispan_in_std_macros. def find_span_r(span): - if 'macros>' in span['file_name']: - if span['expansion']: - return find_span_r(span['expansion']['span']) - else: - # XXX: Is this possible? - return None + if span['expansion']: + return find_span_r(span['expansion']['span']) else: return span span = find_span_r(span) diff --git a/tests/error-tests/Cargo.lock b/tests/error-tests/Cargo.lock index c085d6c5..ded6aea4 100644 --- a/tests/error-tests/Cargo.lock +++ b/tests/error-tests/Cargo.lock @@ -1,4 +1,11 @@ [root] name = "error-tests" version = "0.1.0" +dependencies = [ + "dcrate 0.1.0", +] + +[[package]] +name = "dcrate" +version = "0.1.0" diff --git a/tests/error-tests/Cargo.toml b/tests/error-tests/Cargo.toml index d9be5d5d..b1225716 100644 --- a/tests/error-tests/Cargo.toml +++ b/tests/error-tests/Cargo.toml @@ -3,3 +3,4 @@ name = "error-tests" version = "0.1.0" [dependencies] +dcrate = {path = "dcrate" } diff --git a/tests/error-tests/dcrate/Cargo.lock b/tests/error-tests/dcrate/Cargo.lock new file mode 100644 index 00000000..08a575f2 --- /dev/null +++ b/tests/error-tests/dcrate/Cargo.lock @@ -0,0 +1,4 @@ +[root] +name = "dcrate" +version = "0.1.0" + diff --git a/tests/error-tests/dcrate/Cargo.toml b/tests/error-tests/dcrate/Cargo.toml new file mode 100644 index 00000000..5dcab0ae --- /dev/null +++ b/tests/error-tests/dcrate/Cargo.toml @@ -0,0 +1,5 @@ +[package] +name = "dcrate" +version = "0.1.0" + +[dependencies] diff --git a/tests/error-tests/dcrate/src/lib.rs b/tests/error-tests/dcrate/src/lib.rs new file mode 100644 index 00000000..6f2994be --- /dev/null +++ b/tests/error-tests/dcrate/src/lib.rs @@ -0,0 +1,11 @@ +#[macro_export] +macro_rules! example { + ($submac:ident!( $($args:tt)* )) => ( + $submac!($($args)*) + ) +} + +#[macro_export] +macro_rules! inner { + ($x:expr) => ($x.missing()) +} diff --git a/tests/error-tests/tests/macro-expansion.rs b/tests/error-tests/tests/macro-expansion.rs new file mode 100644 index 00000000..118f6e90 --- /dev/null +++ b/tests/error-tests/tests/macro-expansion.rs @@ -0,0 +1,9 @@ +#[macro_use] +extern crate dcrate; + +fn main() { + // This ensures that the expansion of nested macros works correctly. + + example!(inner!(b" ")); +// ^^^^^^^^^^^^^^^^^^^^^^^ERR no method named `missing` +} diff --git a/tests/test_syntax_check.py b/tests/test_syntax_check.py index 67863ee0..bb871ad2 100755 --- a/tests/test_syntax_check.py +++ b/tests/test_syntax_check.py @@ -71,6 +71,7 @@ def test_messages(self): 'error-tests/tests/cast-to-unsized-trait-object-suggestion.rs', # error in a cfg(test) section 'error-tests/src/lib.rs', + 'error-tests/tests/macro-expansion.rs', # Workspace tests. 'workspace/workspace1/src/lib.rs', 'workspace/workspace1/src/anothermod/mod.rs', From 5062a4f3c645ba6d7c6a42c195b17f7cfaeeec37 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Sat, 6 May 2017 15:28:59 -0700 Subject: [PATCH 21/32] Fix clearing of error regions. --- rust/messages.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/messages.py b/rust/messages.py index fec1bfbb..a0bc89fa 100644 --- a/rust/messages.py +++ b/rust/messages.py @@ -33,7 +33,7 @@ def clear_messages(window): WINDOW_MESSAGES.pop(window.id(), None) for view in window.views(): view.erase_phantoms('rust-syntax-phantom') - view.erase_regions('rust-invalid') + view.erase_regions('rust-error') view.erase_regions('rust-info') From f288027cd2350c315f4e87fec60bb8ed33549cd1 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Sat, 6 May 2017 15:51:42 -0700 Subject: [PATCH 22/32] Add rust_phantom_style and rust_region_style config settings. Fixes #182. --- README.md | 2 ++ RustEnhanced.sublime-settings | 10 ++++++++++ rust/messages.py | 4 ++++ 3 files changed, 16 insertions(+) diff --git a/README.md b/README.md index c3b54c1a..a06ff583 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,8 @@ There are a variety of settings (see [Settings](#settings)) for controlling the | `rust_syntax_hide_warnings` | `false` | If true, will not display warning messages. | | `rust_syntax_error_color` | `"#F00"` | Color of error messages. | | `rust_syntax_warning_color` | `"#FF0"` | Color of warning messages. | +| `rust_phantom_style` | `"normal"` | How to display inline messages. Either `normal` or `none`. | +| `rust_region_style` | `"outline"` | How to highlight messages. Either `outline` or `none`. | Here is an example: ![testingrust](https://cloud.githubusercontent.com/assets/43198/22944409/7780ab9a-f2a5-11e6-87ea-0e253d6c40f6.png) diff --git a/RustEnhanced.sublime-settings b/RustEnhanced.sublime-settings index 024a45c8..dcb4ddf5 100644 --- a/RustEnhanced.sublime-settings +++ b/RustEnhanced.sublime-settings @@ -22,6 +22,16 @@ // running Cargo. "rust_include_shell_env": true, + // For errors/warnings, how to show the inline message. + // "normal" - Shows the message inline. + // "none" - Do not show the message inline. + "rust_phantom_style": "normal", + + // For errors/warnings, how to highlight the region of the error. + // "outline" - Outlines the region. + // "none" - No outlining. + "rust_region_style": "outline", + // If your cargo project has several build targets, it's possible to specify mapping of // source code filenames to the target names to enable syntax checking. // "projects": { diff --git a/rust/messages.py b/rust/messages.py index a0bc89fa..695d881f 100644 --- a/rust/messages.py +++ b/rust/messages.py @@ -93,6 +93,8 @@ def draw_all_region_highlights(window): def _draw_region_highlights(view, messages): + if util.get_setting('rust_region_style', 'outline') == 'none': + return error_regions = [] info_regions = [] error_region_set = set() @@ -123,6 +125,8 @@ def _draw_region_highlights(view, messages): def _show_phantom(view, level, span, message): + if util.get_setting('rust_phantom_style', 'normal') == 'none': + return region = _span_to_region(view, span) # For some reason, with LAYOUT_BELOW, if you have a multi-line # region, the phantom is only displayed under the first line. I From 25111f1cd8dcc6a12a94728d31babe98d53a426a Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Sat, 6 May 2017 16:00:06 -0700 Subject: [PATCH 23/32] Honor show_errors_inline config setting for Cargo build. --- cargo_build.py | 4 +++- rust/cargo_settings.py | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/cargo_build.py b/cargo_build.py index c07950a4..26234bb2 100644 --- a/cargo_build.py +++ b/cargo_build.py @@ -193,11 +193,13 @@ def run(self): messages.clear_messages(self.window) p = rust_proc.RustProc() listener = opanel.OutputListener(self.window, self.working_dir) + decode_json = util.get_setting('show_errors_inline', True) and \ + self.command_info.get('allows_json', False) try: p.run(self.window, cmd['command'], self.working_dir, listener, env=cmd['env'], - decode_json=self.command_info.get('allows_json', False), + decode_json=decode_json, json_stop_pattern=self.command_info.get('json_stop_pattern')) p.wait() except rust_proc.ProcessTerminatedError: diff --git a/rust/cargo_settings.py b/rust/cargo_settings.py index 5031ee76..8a3d87a3 100644 --- a/rust/cargo_settings.py +++ b/rust/cargo_settings.py @@ -260,7 +260,8 @@ def get(key, default=None): if v: result.append('--release') - if cmd_info.get('allows_json', False): + if cmd_info.get('allows_json', False) and \ + util.get_setting('show_errors_inline', True): result.append('--message-format=json') # features From adb33f20df019d6ae71a22460cca08feb897db02 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Thu, 11 May 2017 16:12:04 -0700 Subject: [PATCH 24/32] Fix links in messages that are surrounded by angled brackets. --- rust/messages.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/rust/messages.py b/rust/messages.py index 695d881f..b762d080 100644 --- a/rust/messages.py +++ b/rust/messages.py @@ -26,7 +26,7 @@ WINDOW_MESSAGES = {} -LINK_PATTERN = r'https?://[-a-zA-Z0-9@:%._+~#=]{2,256}\.[a-zA-Z]{2,6}\b[-a-zA-Z0-9@:%_+.~#?&/=]*' +LINK_PATTERN = r'(https?://[-a-zA-Z0-9@:%._+~#=]{2,256}\.[a-zA-Z]{2,6}\b[-a-zA-Z0-9@:%_+.~#?&/=]*)' def clear_messages(window): @@ -494,10 +494,15 @@ def _add_message(path, span_region, is_main, message, extra=''): # Rust performs some pretty-printing for things like suggestions, # attempt to retain some of the formatting. This isn't perfect # (doesn't line up perfectly), not sure why. - escaped_message = html.escape(message, quote=False).\ - replace('\n', '
').replace(' ', ' ') - escaped_message = re.sub(LINK_PATTERN, r'\g<0>', - escaped_message) + def escape_and_link(i_txt): + i, txt = i_txt + if i % 2: + return '%s' % (txt, txt) + else: + return html.escape(txt, quote=False).\ + replace('\n', '
').replace(' ', ' ') + parts = re.split(LINK_PATTERN, message) + escaped_message = ''.join(map(escape_and_link, enumerate(parts))) content = msg_template.format( cls=cls, level=info['level'], From b81d0e157a7e9a9a6e8365c8f5b0dc2262babe7e Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Sat, 13 May 2017 17:41:12 -0700 Subject: [PATCH 25/32] Consolidate all Cargo config commands into a single command. Add commands to configure extra arguments and environment variables. --- RustEnhanced.sublime-commands | 28 +-- rust/cargo_config.py | 321 ++++++++++++++++++++++++++-------- 2 files changed, 255 insertions(+), 94 deletions(-) diff --git a/RustEnhanced.sublime-commands b/RustEnhanced.sublime-commands index 7702716d..a170c2c1 100644 --- a/RustEnhanced.sublime-commands +++ b/RustEnhanced.sublime-commands @@ -16,31 +16,11 @@ "command": "rust_cancel" }, { - "caption": "Rust: Set Cargo Target", - "command": "cargo_set_target" - }, - { - "caption": "Rust: Set Cargo Build Profile", - "command": "cargo_set_profile" - }, - { - "caption": "Rust: Set Cargo Target Triple", - "command": "cargo_set_triple" - }, - { - "caption": "Rust: Set Cargo Toolchain", - "command": "cargo_set_toolchain" - }, - { - "caption": "Rust: Set Cargo Features", - "command": "cargo_set_features" + "caption": "Rust: Create New Cargo Build Variant", + "command": "cargo_create_new_build" }, { - "caption": "Rust: Set Default Path", - "command": "cargo_set_default_path" + "caption": "Rust: Configure Cargo Build", + "command": "cargo_configure" }, - { - "caption": "Rust: Create New Cargo Build Variant", - "command": "cargo_create_new_build" - } ] diff --git a/rust/cargo_config.py b/rust/cargo_config.py index ea1db772..1b2a614b 100644 --- a/rust/cargo_config.py +++ b/rust/cargo_config.py @@ -34,11 +34,13 @@ class CargoConfigBase(sublime_plugin.WindowCommand): `(display_string, value)`. - `default`: The default value (optional). - `skip_if_one`: Skip this question if there is only 1 item. + - `caption`: Instead of `items`, this is a string displayed with + `show_input_panel` to allow the user to enter arbitrary text. `items_` methods can also just return the 'items' list. An optional method `selected_`+name will be called when a choice is made. - This method can return a list of questions to be asked. + This method can return a list of questions to be asked immediately. The `done` method is called once all questions have been asked. @@ -49,28 +51,37 @@ class CargoConfigBase(sublime_plugin.WindowCommand): # CargoSettings object. settings = None + # Dictionary of choices passed into the command, instead of using # interactive UI. input = None # Sequence of questions to ask. sequence = None + # Current question being asked. sequence_index = 0 + # Dictionary of selections made during the interactive process. choices = None + # If True, the command wants the 'package' choice to fetch metadata from # Cargo. package_wants_metadata = True + # If True, the 'package' choice will automatically use the manifest # from the active view if it is available. package_allows_active_view_shortcut = True + # This is a dictionary populated by the `items_package` method. # Key is the path to a package, the value is the metadata from Cargo. # This is used by other questions (like `items_target`) to get more # information about the chosen package. packages = None + # Name of what is being configured. + config_name = "" + def run(self, **kwargs): self.choices = {} self.sequence_index = 0 @@ -103,6 +114,7 @@ def show_next_question(self): f_selected = getattr(self, 'selected_' + q, None) + # Called with the result of what the user selected. def make_choice(value): self.choices[q] = value if f_selected: @@ -258,14 +270,72 @@ def items_variant(self): return result def filter_variant(self, x): + """Subclasses override this to filter variants from the variant list.""" return True + def items_which(self): + # This is a bit of a hack so that when called programmatically you + # don't have to specify 'which'. + if 'variant' in self.input: + self.input['which'] = 'variant' + elif 'target' in self.input: + self.input['which'] = 'target' + + return [ + (['Configure %s for all build commands.' % self.config_name, + ''], 'default'), + (['Configure %s for a Build Variant.' % self.config_name, + 'cargo build, cargo run, cargo test, etc.'], 'variant'), + (['Configure %s for a Target.' % self.config_name, + '--bin, --example, --test, etc.'], 'target') + ] + + def selected_which(self, which): + if which == 'default': + self.choices['target'] = None + return + elif which == 'variant': + return ['variant'] + elif which == 'target': + return ['target'] + else: + raise AssertionError(which) + + def get_setting(self, name, default=None): + """Retrieve a setting, honoring the "which" selection.""" + if self.choices['which'] == 'variant': + return self.settings.get_with_variant(self.choices['package'], + self.choices['variant'], + name, default=default) + elif self.choices['which'] in ('default', 'target'): + return self.settings.get_with_target(self.choices['package'], + self.choices['target'], + name, default=default) + else: + raise AssertionError(self.choices['which']) + + def set_setting(self, name, value): + """Set a setting, honoring the "which" selection.""" + if self.choices['which'] == 'variant': + self.settings.set_with_variant(self.choices['package'], + self.choices['variant'], + name, + value) + elif self.choices['which'] in ('default', 'target'): + self.settings.set_with_target(self.choices['package'], + self.choices['target'], + name, + value) + else: + raise AssertionError(self.choices['which']) + class CargoConfigPackage(CargoConfigBase): """This is a fake command used by cargo_build to reuse the code to choose a Cargo package.""" + config_name = 'Package' sequence = ['package'] package_wants_metadata = False @@ -279,12 +349,11 @@ def done(self): class CargoSetProfile(CargoConfigBase): - sequence = ['package', 'target', 'profile'] + config_name = 'Profile' + sequence = ['package', 'which', 'profile'] def items_profile(self): - default = self.settings.get_with_target(self.choices['package'], - self.choices['target'], - 'release', False) + default = self.get_setting('release', False) if default: default = 'release' else: @@ -295,15 +364,13 @@ def items_profile(self): 'default': default} def done(self): - self.settings.set_with_target(self.choices['package'], - self.choices['target'], - 'release', - self.choices['profile'] == 'release') + self.set_setting('release', self.choices['profile'] == 'release') class CargoSetTarget(CargoConfigBase): - sequence = ['variant', 'package', 'target'] + config_name = 'Target' + sequence = ['package', 'variant', 'target'] def filter_variant(self, info): return info.get('allows_target', False) @@ -328,7 +395,8 @@ def done(self): class CargoSetTriple(CargoConfigBase): - sequence = ['package', 'target', 'target_triple'] + config_name = 'Triple' + sequence = ['package', 'which', 'target_triple'] def items_target_triple(self): # Could check if rustup is not installed, to run @@ -337,9 +405,7 @@ def items_target_triple(self): triples = rust_proc.check_output(self.window, 'rustup target list'.split(), self.choices['package'])\ .splitlines() - current = self.settings.get_with_target(self.choices['package'], - self.choices['target'], - 'target_triple') + current = self.get_setting('target_triple') result = [('Use Default', None)] for triple in triples: if triple.endswith(' (default)'): @@ -357,43 +423,18 @@ def items_target_triple(self): } def done(self): - self.settings.set_with_target(self.choices['package'], - self.choices['target'], - 'target_triple', - self.choices['target_triple']) + self.set_setting('target_triple', self.choices['target_triple']) class CargoSetToolchain(CargoConfigBase): - sequence = ['which'] - - def items_which(self): - return [ - ('Set Toolchain for Build Variant', 'variant'), - ('Set Toolchain for Targets', 'target') - ] - - def selected_which(self, which): - if which == 'variant': - return ['package', 'variant', 'toolchain'] - elif which == 'target': - return ['package', 'target', 'toolchain'] - else: - raise AssertionError(which) + config_name = 'Toolchain' + sequence = ['package', 'which', 'toolchain'] def items_toolchain(self): items = [('Use Default Toolchain', None)] toolchains = self._toolchain_list() - if self.choices['which'] == 'variant': - current = self.settings.get_with_variant(self.choices['package'], - self.choices['variant'], - 'toolchain') - elif self.choices['which'] == 'target': - current = self.settings.get_with_target(self.choices['package'], - self.choices['target'], - 'toolchain') - else: - raise AssertionError(self.choices['which']) + current = self.get_setting('toolchain') items.extend([(x, x) for x in toolchains]) return { 'items': items, @@ -434,28 +475,16 @@ def _toolchain_list(self): return result def done(self): - if self.choices['which'] == 'variant': - self.settings.set_with_variant(self.choices['package'], - self.choices['variant'], - 'toolchain', - self.choices['toolchain']) - elif self.choices['which'] == 'target': - self.settings.set_with_target(self.choices['package'], - self.choices['target'], - 'toolchain', - self.choices['toolchain']) - else: - raise AssertionError(self.choices['which']) + self.set_setting('toolchain', self.choices['toolchain']) class CargoSetFeatures(CargoConfigBase): - sequence = ['package', 'target', 'no_default_features', 'features'] + config_name = 'Features' + sequence = ['package', 'which', 'no_default_features', 'features'] def items_no_default_features(self): - current = self.settings.get_with_target(self.choices['package'], - self.choices['target'], - 'no_default_features', False) + current = self.get_setting('no_default_features', False) items = [ ('Include default features.', False), ('Do not include default features.', True) @@ -466,10 +495,9 @@ def items_no_default_features(self): } def items_features(self): - features = self.settings.get_with_target(self.choices['package'], - self.choices['target'], - 'features', None) + features = self.get_setting('features', None) if features is None: + # Detect available features from the manifest. package_path = self.choices['package'] available_features = self.packages[package_path].get('features', {}) items = list(available_features.keys()) @@ -488,18 +516,14 @@ def items_features(self): } def done(self): - self.settings.set_with_target(self.choices['package'], - self.choices['target'], - 'no_default_features', - self.choices['no_default_features']) - self.settings.set_with_target(self.choices['package'], - self.choices['target'], - 'features', - self.choices['features']) + self.set_setting('no_default_features', + self.choices['no_default_features']) + self.set_setting('features', self.choices['features']) class CargoSetDefaultPath(CargoConfigBase): + config_name = 'Default Path' sequence = ['package'] package_allows_active_view_shortcut = False @@ -516,11 +540,168 @@ def done(self): self.settings.set('default_path', self.choices['package']) +class CargoSetEnvironmentEditor(CargoConfigBase): + + config_name = 'Environment' + sequence = ['package', 'which'] + + def done(self): + view = self.window.new_file() + view.set_scratch(True) + default = self.get_setting('env') + template = util.multiline_fix(""" + // Enter environment variables here in JSON syntax. + // Close this view when done to commit the settings. + """) + if 'contents' in self.input: + # Used when parsing fails to attempt to edit again. + template = self.input['contents'] + elif default: + template += sublime.encode_value(default, True) + else: + template += util.multiline_fix(""" + { + // "RUST_BACKTRACE": 1 + } + """) + # Unfortunately Sublime indents on 'insert' + view.settings().set('auto_indent', False) + view.run_command('insert', {'characters': template}) + view.settings().set('auto_indent', True) + view.set_syntax_file('Packages/JavaScript/JSON.sublime-syntax') + view.settings().set('rust_environment_editor', True) + view.settings().set('rust_environment_editor_settings', { + 'package': self.choices['package'], + 'which': self.choices['which'], + 'variant': self.choices.get('variant'), + 'target': self.choices.get('target'), + }) + + +class CargoSetEnvironment(CargoConfigBase): + + """Special command that should not be run interactively. Used by the + on-close callback to actually set the environment.""" + + config_name = 'Environment' + sequence = ['package', 'which', 'env'] + + def items_env(self): + return [] + + def done(self): + self.set_setting('env', self.choices['env']) + + +class EnvironmentSaveHandler(sublime_plugin.EventListener): + + """Handler for when the view is closed on the environment editor.""" + + def on_pre_close(self, view): + if not view.settings().get('rust_environment_editor'): + return + settings = view.settings().get('rust_environment_editor_settings') + + contents = view.substr(sublime.Region(0, view.size())) + try: + result = sublime.decode_value(contents) + except: + sublime.error_message('Value was not valid JSON, try again.') + view.window().run_command('cargo_set_environment_editor', { + 'package': settings['package'], + 'which': settings['which'], + 'variant': settings['variant'], + 'target': settings['target'], + 'contents': contents, + }) + return + + view.window().run_command('cargo_set_environment', { + 'package': settings['package'], + 'which': settings['which'], + 'variant': settings['variant'], + 'target': settings['target'], + 'env': result, + }) + + +class CargoSetArguments(CargoConfigBase): + + config_name = 'Extra Command-line Arguments' + sequence = ['package', 'which', 'before_after', 'args'] + + def items_before_after(self): + return [ + ('Enter extra Cargo arguments (before -- separator)', 'extra_cargo_args'), + ('Enter extra Cargo arguments (after -- separator)', 'extra_run_args'), + ] + + def items_args(self): + current = self.get_setting(self.choices['before_after'], '') + return { + 'caption': 'Enter the extra Cargo args', + 'default': current, + } + + def done(self): + self.set_setting(self.choices['before_after'], + self.choices['args']) + + +class CargoConfigure(CargoConfigBase): + + sequence = ['config_option'] + + def items_config_option(self): + return [ + (['Set Target', '--bin, --lib, --example, etc.'], 'target'), + (['Set Profile', '--release flag'], 'profile'), + (['Set Target Triple', '--target flag'], 'triple'), + (['Set Rust Toolchain', 'nightly vs stable, etc.'], 'toolchain'), + (['Set Features', 'Cargo build features with --features'], 'features'), + (['Set Environment Variables', ''], 'environment'), + (['Set Extra Cargo Arguments', ''], 'args'), + (['Set Default Package/Path', ''], 'package'), + ] + + def selected_config_option(self, which): + if which == 'target': + CargoSetTarget(self.window).run() + elif which == 'profile': + CargoSetProfile(self.window).run() + elif which == 'triple': + CargoSetTriple(self.window).run() + elif which == 'toolchain': + CargoSetToolchain(self.window).run() + elif which == 'features': + CargoSetFeatures(self.window).run() + elif which == 'environment': + CargoSetEnvironmentEditor(self.window).run() + elif which == 'args': + CargoSetArguments(self.window).run() + elif which == 'package': + CargoSetDefaultPath(self.window).run() + else: + raise AssertionError(which) + + def selected_which(self, which): + if which == 'variant': + return ['package', 'variant', 'toolchain'] + elif which == 'target': + return ['package', 'target', 'toolchain'] + else: + raise AssertionError(which) + + def done(self): + pass + + class CargoCreateNewBuild(CargoConfigBase): """Command to create a new build variant, stored in the user's `.sublime-project` file.""" + config_name = 'New Build' sequence = ['command'] def items_command(self): From 83a34160a9aa5ea89116905df8e1a2db3a02c8c6 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Sun, 14 May 2017 15:19:18 -0700 Subject: [PATCH 26/32] Document the new build configure command. Also document the `default_path` option. --- docs/build.md | 50 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/docs/build.md b/docs/build.md index 21f716d6..99f92333 100644 --- a/docs/build.md +++ b/docs/build.md @@ -25,8 +25,8 @@ Previous Result | Shift-F4 | Tools > Build Results > Previous Result | Go to the ## Build Variants When you select the RustEnhanced build system in Sublime, there are a few -variants that you can select with Tools > Build With... ( -Ctrl-Shift-B / ⌘-Shift-B). They are: +variants that you can select with Tools > Build With... +(Ctrl-Shift-B / ⌘-Shift-B). They are: Variant | Command | Description ------- | ------- | ----------- @@ -49,20 +49,27 @@ You can customize how Cargo is run with settings stored in your `--example foo`, etc.), for specific variants ("Build", "Run", "Test", etc.), or globally. -### Setting Commands +### Configure Command -There are several Sublime commands to help you configure the Cargo settings. -They can be accessed from the Command Palette (Ctrl-Shift-P / ⌘-Shift-P). They -are: +To help you configure the Cargo build settings, run the `Rust: Configure Cargo +Build` command from Sublime's Command Palette (Ctrl-Shift-P / ⌘-Shift-P). +This will ask you a series of questions for the setting to configure. The +first choice is the setting: -Command | Description +Setting | Description ------- | ----------- -Rust: Set Default Path | Set the default Cargo package to build. If not specified, then it will detect it from the current view, or display a panel to choose from. -Rust: Set Cargo Target | Set the Cargo target (`--lib`, `--example foo`, etc.) for each build variant. The "Automatic Detection" option will attempt to determine which target to use based on the current active view in Sublime (a test file will use `--test` or a binary will use `--bin`, etc.). -Rust: Set Cargo Build Profile | Set whether or not to use the `--release` flag. -Rust: Set Cargo Target Triple | Set the target triple (such as `x86_64-apple-darwin`). -Rust: Set Cargo Features | Set the Cargo build features to use. -Rust: Set Cargo Toolchain | Set the Rust toolchain to use (`nightly`, `beta`, etc.). Use the Targets > "All Targets" to set globally. +Target | Specify an explicit target (`--bin`, `--lib`, `--example`, etc.). The "Automatic Detection" option will attempt to determine which target to use based on the current active view in Sublime (a test file will use `--test` or a binary will use `--bin`, etc.). +Profile | Determine whether or not the `--release` flag is used. +Target Triple | The `--target` option to specify a target triple (such as `x86_64-apple-darwin`). +Toolchain | Set the Rust toolchain to use (`nightly`, `beta`, etc.). +Features | Set the Cargo build features to use. +Environment Variables | Specify additional environment variables to set. +Extra Cargo Arguments | Extra arguments to include in the command line. +Default Package/Path | The default package to build, useful if you have a workspace with multiple Cargo packages. See `Multiple Cargo Projects` below. + +If you have multiple Cargo packages in your workspace, it will ask for the package to configure. + +A setting can be global (for all build invocations), for a specific build variant (such as "Test"), or for a specific build target (such as `--example myprog`). Caution: If you have not created a `sublime-project` file, then any changes you make will be lost if you close the Sublime window. @@ -109,7 +116,8 @@ An example of a `sublime-project` file: } } } - } + }, + "default_path": "/path/to/package" } } } @@ -119,17 +127,17 @@ The available settings are: Setting Name | Description ------------ | ----------- -`working_dir` | The directory where to run Cargo. If not specified, uses the value from `default_path`, otherwise attempts to detect from the active view, or displays a panel to choose a Cargo package. -`script_path` | Path to a `.rs` script, used by `cargo script` if you want to hard-code a specific script to run. -`release` | If true, uses the `--release` flag. -`target_triple` | If set, uses the `--target` flag with the given value. +`target` | The Cargo target (such as `"--bin myprog"`). Applies to `variants` only. Can be `"auto"` (see "Automatic Detection" above). `toolchain` | The Rust toolchain to use (such as `nightly` or `beta`). -`target` | The Cargo target (such as `"--bin myprog"`). Applies to `variants` only. Can be `"auto"` (see "Set Cargo Target" above). -`no_default_features` | If True, sets the `--no-default-features` flag. +`target_triple` | If set, uses the `--target` flag with the given value. +`release` | If true, uses the `--release` flag. `features` | A string with a space separated list of features to pass to the `--features` flag. Set to "ALL" to pass the `--all-features` flag. `extra_cargo_args` | Extra arguments passed to Cargo (before the `--` flags separator). `extra_run_args` | Extra arguments passed to Cargo (after the `--` flags separator). `env` | Object of environment variables to add when running Cargo. +`working_dir` | The directory where to run Cargo. If not specified, uses the value from `default_path`, otherwise attempts to detect from the active view, or displays a panel to choose a Cargo package. +`script_path` | Path to a `.rs` script, used by `cargo script` if you want to hard-code a specific script to run. +`no_default_features` | If True, sets the `--no-default-features` flag. The extra args settings support standard Sublime variable expansion (see [Build System @@ -145,6 +153,8 @@ If you have multiple Cargo projects in your Sublime window, the build system will use the currently active view to attempt to determine which project to build. Otherwise it will show an input panel to select a package. +You can set the `default_path` setting to always use a specific path. It is specified at the same level as `paths` (see example above). This can be set using the `Rust: Configure Cargo Build` command. + ## Custom Build Variants (Advanced) You can define your own build system that takes advantage of the Cargo From 62af8f157f6e7a2b5d953f4e41580e801e34451b Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Sun, 14 May 2017 19:05:48 -0700 Subject: [PATCH 27/32] On-save syntax checking now uses configuration settings from the build system. --- SyntaxCheckPlugin.py | 61 +++++++++++++++++++++--------------------- rust/cargo_config.py | 13 ++++++--- rust/cargo_settings.py | 14 ++++++++++ 3 files changed, 53 insertions(+), 35 deletions(-) diff --git a/SyntaxCheckPlugin.py b/SyntaxCheckPlugin.py index 5d642618..40aaf817 100755 --- a/SyntaxCheckPlugin.py +++ b/SyntaxCheckPlugin.py @@ -1,7 +1,8 @@ import sublime import sublime_plugin import os -from .rust import messages, rust_proc, rust_thread, util, target_detect +from .rust import (messages, rust_proc, rust_thread, util, target_detect, + cargo_settings) from pprint import pprint @@ -77,17 +78,13 @@ def __init__(self, view): def run(self): self.triggered_file_name = os.path.abspath(self.view.file_name()) - if util.get_setting('rust_syntax_checking_method') == 'clippy': - # Clippy must run in the same directory as Cargo.toml. - # See https://github.com/Manishearth/rust-clippy/issues/1515 - self.cwd = util.find_cargo_manifest(self.triggered_file_name) - if self.cwd is None: - print('Rust Enhanced skipping on-save syntax check.') - print('Failed to find Cargo.toml from %r' % self.triggered_file_name) - print('Clippy requires a Cargo.toml to exist.') - return - else: - self.cwd = os.path.dirname(self.triggered_file_name) + self.cwd = util.find_cargo_manifest(self.triggered_file_name) + if self.cwd is None: + # A manifest is required. + print('Rust Enhanced skipping on-save syntax check.') + print('Failed to find Cargo.toml from %r' % self.triggered_file_name) + print('A Cargo.toml manifest is required.') + return self.view.set_status('rust-check', 'Rust syntax check running...') self.this_view_found = False @@ -108,10 +105,16 @@ def get_rustc_messages(self): :raises rust_proc.ProcessTerminatedError: Check was canceled. """ method = util.get_setting('rust_syntax_checking_method', 'no-trans') + settings = cargo_settings.CargoSettings(self.window) + settings.load() + command_info = cargo_settings.CARGO_COMMANDS[method] + if method == 'clippy': - cmd = ['cargo', '+nightly', 'clippy', '--message-format=json'] + # Clippy does not support cargo target filters, must be run for + # all targets. + cmd = settings.get_command(command_info, self.cwd) p = rust_proc.RustProc() - p.run(self.window, cmd, self.cwd, self) + p.run(self.window, cmd['command'], self.cwd, self, env=cmd['env']) p.wait() return @@ -119,25 +122,21 @@ def get_rustc_messages(self): td = target_detect.TargetDetector(self.window) targets = td.determine_targets(self.triggered_file_name) for (target_src, target_args) in targets: - if method == 'check': - cmd = ['cargo', 'check', '--message-format=json'] - cmd.extend(target_args) - else: - cmd = ['cargo', 'rustc'] - cmd.extend(target_args) - cmd.extend(['--', '-Zno-trans', '-Zunstable-options', - '--error-format=json']) - if util.get_setting('rust_syntax_checking_include_tests', True): - if not ('--test' in target_args or '--bench' in target_args): - # Including the test harness has a few drawbacks. - # missing_docs lint is disabled (see - # https://github.com/rust-lang/sublime-rust/issues/156) - # It also disables the "main function not found" error for - # binaries. - cmd.append('--test') + cmd = settings.get_command(command_info, self.cwd, + initial_settings={'target': ' '.join(target_args)}) + if method == 'no-trans': + cmd['command'].extend(['--', '-Zno-trans', '-Zunstable-options']) + if (util.get_setting('rust_syntax_checking_include_tests', True) and + not ('--test' in target_args or '--bench' in target_args)): + # Including the test harness has a few drawbacks. + # missing_docs lint is disabled (see + # https://github.com/rust-lang/sublime-rust/issues/156) + # It also disables the "main function not found" error for + # binaries. + cmd['command'].append('--test') p = rust_proc.RustProc() self.current_target_src = target_src - p.run(self.window, cmd, self.cwd, self) + p.run(self.window, cmd['command'], self.cwd, self, env=cmd['env']) p.wait() if self.this_view_found: break diff --git a/rust/cargo_config.py b/rust/cargo_config.py index 1b2a614b..2dd697e1 100644 --- a/rust/cargo_config.py +++ b/rust/cargo_config.py @@ -270,8 +270,11 @@ def items_variant(self): return result def filter_variant(self, x): - """Subclasses override this to filter variants from the variant list.""" - return True + """Subclasses override this to filter variants from the variant + list.""" + # no-trans is a special, hidden, internal command. In theory, a user + # can configure it, but since it is deprecated, just hide it for now. + return x['name'] != 'no-trans' def items_which(self): # This is a bit of a hack so that when called programmatically you @@ -373,7 +376,8 @@ class CargoSetTarget(CargoConfigBase): sequence = ['package', 'variant', 'target'] def filter_variant(self, info): - return info.get('allows_target', False) + return super(CargoSetTarget, self).filter_variant(info) and \ + info.get('allows_target', False) def items_target(self): items = super(CargoSetTarget, self).items_target() @@ -713,7 +717,8 @@ def items_command(self): raise CancelCommandError result = [] for key, info in CARGO_COMMANDS.items(): - result.append((info['name'], key)) + if self.filter_variant(info): + result.append((info['name'], key)) result.sort() result.append(('New Command', 'NEW_COMMAND')) return result diff --git a/rust/cargo_settings.py b/rust/cargo_settings.py index 8a3d87a3..f32e9fbc 100644 --- a/rust/cargo_settings.py +++ b/rust/cargo_settings.py @@ -110,6 +110,18 @@ 'requires_view_path': True, 'requires_manifest': False, }, + # This is a special command (not exposed) used by on-save syntax checking. + 'no-trans': { + 'name': 'no-trans', + 'command': 'rustc', + 'allows_target': True, + 'allows_target_triple': True, + 'allows_release': True, + 'allows_features': True, + 'allows_json': True, + 'requires_view_path': False, + 'requires_manifest': False, + } } @@ -201,6 +213,8 @@ def get_command(self, cmd_info, settings_path, initial_settings={}): :Returns: A dictionary with the keys: - `command`: The command to run as a list of strings. - `env`: Dictionary of environment variables (or None). + + Returns None if the command cannot be constructed. """ command = cmd_info['command'] result = ['cargo'] From d9d40ea20bca45ffb65291494fc0119a73bb5be9 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Mon, 15 May 2017 14:36:32 -0700 Subject: [PATCH 28/32] Finish documenting all settings, and include link to new build docs. --- README.md | 49 ++++++++++++++++++++++++------------------------- docs/build.md | 23 +++++++++++++++++++++-- 2 files changed, 45 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index a06ff583..fbaf15d5 100644 --- a/README.md +++ b/README.md @@ -27,20 +27,12 @@ If you can't see `Rust Enhanced` its most likely because you're using Sublime Te ## Features ### Go To Definition -### Build functionality -Rust Enhanced has the following build functions: -- Cargo Check -- Cargo Run -- Cargo Script [Cargo Script is needed](https://github.com/DanielKeep/cargo-script) -- Cargo Test -- Cargo Bench -- Cargo Clean -- Cargo Release -- Cargo Document -- Cargo Clippy -- Rust -- Rust Run +### Cargo Build +Rust Enhanced has a custom build system tailored for running Cargo. It will display errors and warnings in line using Sublime's phantoms. It also supports a variety of configuration options to control how Cargo is run. +![testingrust](https://cloud.githubusercontent.com/assets/43198/22944409/7780ab9a-f2a5-11e6-87ea-0e253d6c40f6.png) + +See [the build docs](docs/build.md) for more information. ### Cargo tests with highlighting Thanks to [urschrei](https://github.com/urschrei/) we have Highlighting for: @@ -53,26 +45,31 @@ Thanks to [urschrei](https://github.com/urschrei/) we have Highlighting for: - total number of measured tests > 0 Example: + ![highlight_rust_test](https://cloud.githubusercontent.com/assets/936006/19247437/3cf6e056-8f23-11e6-9bbe-d8c542287db6.png) ### Syntax Checking Rust Enhanced will automatically perform syntax checking each time you save a file. +Errors and warnings are displayed in line the same way as the [build system](docs/build.md). This relies on Cargo and Rust (>= 1.8.0) being installed and on your system path. Plus Sublime Text >= 3118. -There are a variety of settings (see [Settings](#settings)) for controlling the syntax highlighting: +[Settings](#settings) for controlling the on-save syntax checking: | Setting | Default | Description | | :------ | :------ | :---------- | | `rust_syntax_checking` | `true` | Enable the on-save syntax checking. | -| `rust_syntax_checking_include_tests` | `true` | Enable checking of test code within `#[cfg(test)]` sections. | -| `rust_syntax_hide_warnings` | `false` | If true, will not display warning messages. | -| `rust_syntax_error_color` | `"#F00"` | Color of error messages. | -| `rust_syntax_warning_color` | `"#FF0"` | Color of warning messages. | -| `rust_phantom_style` | `"normal"` | How to display inline messages. Either `normal` or `none`. | -| `rust_region_style` | `"outline"` | How to highlight messages. Either `outline` or `none`. | - -Here is an example: -![testingrust](https://cloud.githubusercontent.com/assets/43198/22944409/7780ab9a-f2a5-11e6-87ea-0e253d6c40f6.png) +| `rust_syntax_checking_include_tests` | `true` | Enable checking of test code within `#[cfg(test)]` sections (only for `no-trans` method). | +| `rust_syntax_checking_method` | `"no-trans"` | The method used for checking your code (see below). | + +The available checking methods are: + +| Method | Description | +| :----- | :---------- | +| `no-trans` | Runs the rustc compiler with the `-Zno-trans` option. This will be deprecated soon, however it has the benefit of supporting `#[test]` sections. | +| `check` | Uses `cargo check` (requires at least Rust 1.16). | +| `clippy` | Uses `cargo clippy`. This requires [Clippy](https://github.com/Manishearth/rust-clippy) to be installed. This also may be a little slower since it must check every target in your package. | + +This will use the same configuration options as the "Check" and "Clippy" build variants (for example, extra environment variables, or checking with different features). See [the build docs](docs/build.md) for more information. Projects with multiple build targets are supported too (--lib, --bin, --example, etc.). If a cargo project has several build targets, it will attempt to automatically detect the correct target. In some rare cases, you may need to manually specify which target a file belongs to. This can be done by adding a "projects" setting in `Rust.sublime-settings` with the following format: @@ -95,9 +92,11 @@ Projects with multiple build targets are supported too (--lib, --bin, --example, ``` ## Settings -You can customize the behaviour of sublime-rust by creating a settings file in your User package. This can be accessed from within SublimeText by going to the menu Preferences > Browse Packages.... Create a file named Rust.sublime-settings or alternatively copy the default settings file Packages/sublime-rust/Rust.sublime-settings to your User package and edit it to your liking. +To customize the settings, use the command from the Sublime menu: + + Preferences > Package Settings > Rust Enhanced > Settings - User -Note: File names are case-sensitive on some platforms (e.g. Linux) so the file name should be exactly Rust.sublime-settings with capitalization preserved. +Additionally, you can customize settings per-project by adding settings to your `.sublime-project` file under the `"settings"` key. ## Development diff --git a/docs/build.md b/docs/build.md index 99f92333..976bea56 100644 --- a/docs/build.md +++ b/docs/build.md @@ -42,6 +42,25 @@ Document | cargo doc | Builds package documentation. Clippy | cargo clippy | Runs [Clippy](https://github.com/Manishearth/rust-clippy). Clippy must be installed, and currently requires the nightly toolchain. Script | cargo script $path | Runs [Cargo Script](https://github.com/DanielKeep/cargo-script). Cargo Script must be installed. This is an addon that allows you to run a Rust source file like a script (without a Cargo.toml manifest). +## General Settings + +General settings (see [Settings](../README.md#settings)) for how messages are displayed are: + +| Setting | Default | Description | +| :------ | :------ | :---------- | +| `rust_syntax_hide_warnings` | `false` | If true, will not display warning messages. | +| `rust_syntax_error_color` | `"#F00"` | Color of error messages. | +| `rust_syntax_warning_color` | `"#FF0"` | Color of warning messages. | +| `rust_phantom_style` | `"normal"` | How to display inline messages. Either `normal` or `none`. | +| `rust_region_style` | `"outline"` | How to highlight messages. Either `outline` or `none`. | + +It also supports Sublime's build settings: + +| Setting | Default | Description | +| :------ | :------ | :---------- | +| `show_errors_inline` | `true` | If true, messages are displayed in line using Sublime's phantoms. If false, messages are only displayed in the output panel. | +| `show_panel_on_build` | `true` | If true, an output panel is displayed at the bottom of the window showing the compiler output. | + ## Cargo Project Settings You can customize how Cargo is run with settings stored in your @@ -132,8 +151,8 @@ Setting Name | Description `target_triple` | If set, uses the `--target` flag with the given value. `release` | If true, uses the `--release` flag. `features` | A string with a space separated list of features to pass to the `--features` flag. Set to "ALL" to pass the `--all-features` flag. -`extra_cargo_args` | Extra arguments passed to Cargo (before the `--` flags separator). -`extra_run_args` | Extra arguments passed to Cargo (after the `--` flags separator). +`extra_cargo_args` | String of extra arguments passed to Cargo (before the `--` flags separator). +`extra_run_args` | String of extra arguments passed to Cargo (after the `--` flags separator). `env` | Object of environment variables to add when running Cargo. `working_dir` | The directory where to run Cargo. If not specified, uses the value from `default_path`, otherwise attempts to detect from the active view, or displays a panel to choose a Cargo package. `script_path` | Path to a `.rs` script, used by `cargo script` if you want to hard-code a specific script to run. From a2f869d7a7f8e801b4d17ea49679ea0362d40319 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Tue, 30 May 2017 15:31:54 -0700 Subject: [PATCH 29/32] Fix Cargo environment variable config command when selecting "all build commands". --- rust/cargo_config.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/rust/cargo_config.py b/rust/cargo_config.py index 2dd697e1..809d7785 100644 --- a/rust/cargo_config.py +++ b/rust/cargo_config.py @@ -279,10 +279,11 @@ def filter_variant(self, x): def items_which(self): # This is a bit of a hack so that when called programmatically you # don't have to specify 'which'. - if 'variant' in self.input: - self.input['which'] = 'variant' - elif 'target' in self.input: - self.input['which'] = 'target' + if 'which' not in self.input: + if 'variant' in self.input: + self.input['which'] = 'variant' + elif 'target' in self.input: + self.input['which'] = 'target' return [ (['Configure %s for all build commands.' % self.config_name, From 6eebab64dc02932b3c3171ac6207a4752627f36b Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Wed, 31 May 2017 14:03:47 -0700 Subject: [PATCH 30/32] Only print warning about sublime-project when saving setings. --- rust/cargo_settings.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/rust/cargo_settings.py b/rust/cargo_settings.py index f32e9fbc..680394e2 100644 --- a/rust/cargo_settings.py +++ b/rust/cargo_settings.py @@ -144,13 +144,6 @@ def load(self): # Window does not have a Sublime project. self.project_data = {} - if self.window.project_file_name() is None: - # XXX: Better way to display a warning? Is - # sublime.error_message() reasonable? - print(util.multiline_fix(""" - Rust Enhanced Warning: This window does not have an associated sublime-project file. - Any changes to the Cargo build settings will be lost if you close the window.""")) - def get(self, key, default=None): return self.project_data.get('settings', {})\ .get('cargo_build', {})\ @@ -159,7 +152,7 @@ def get(self, key, default=None): def set(self, key, value): self.project_data.setdefault('settings', {})\ .setdefault('cargo_build', {})[key] = value - self.window.set_project_data(self.project_data) + self._set_project_data() def get_with_target(self, path, target, key, default=None): path = os.path.normpath(path) @@ -194,7 +187,7 @@ def set_with_target(self, path, target, key, value): else: d = pdata.setdefault('defaults', {}) d[key] = value - self.window.set_project_data(self.project_data) + self._set_project_data() def set_with_variant(self, path, variant, key, value): path = os.path.normpath(path) @@ -205,6 +198,15 @@ def set_with_variant(self, path, variant, key, value): .setdefault('variants', {})\ .setdefault(variant, {}) vdata[key] = value + self._set_project_data() + + def _set_project_data(self): + if self.window.project_file_name() is None: + # XXX: Better way to display a warning? Is + # sublime.error_message() reasonable? + print(util.multiline_fix(""" + Rust Enhanced Warning: This window does not have an associated sublime-project file. + Any changes to the Cargo build settings will be lost if you close the window.""")) self.window.set_project_data(self.project_data) def get_command(self, cmd_info, settings_path, initial_settings={}): From 94e3606e9df576769d31169e07a2ef50ca01ce10 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Wed, 31 May 2017 15:03:09 -0700 Subject: [PATCH 31/32] Fix target detection for cdylib. Adapted from #186, thanks @smbolton. --- rust/cargo_config.py | 4 ++-- rust/target_detect.py | 6 +++--- tests/multi-targets/Cargo.toml | 6 ++++++ tests/multi-targets/examples/excdylib.rs | 3 +++ tests/multi-targets/libs/cdylib/Cargo.lock | 4 ++++ tests/multi-targets/libs/cdylib/Cargo.toml | 6 ++++++ tests/multi-targets/libs/cdylib/src/lib.rs | 2 ++ tests/multi-targets/libs/dylib/Cargo.lock | 4 ++++ tests/multi-targets/libs/dylib/Cargo.toml | 6 ++++++ tests/multi-targets/libs/dylib/src/lib.rs | 2 ++ tests/multi-targets/libs/rlib/Cargo.lock | 4 ++++ tests/multi-targets/libs/rlib/Cargo.toml | 6 ++++++ tests/multi-targets/libs/rlib/src/lib.rs | 2 ++ tests/multi-targets/libs/staticlib/Cargo.lock | 4 ++++ tests/multi-targets/libs/staticlib/Cargo.toml | 6 ++++++ tests/multi-targets/libs/staticlib/src/lib.rs | 2 ++ tests/rust_test_common.py | 4 ---- tests/test_target_detect.py | 19 ++++++++++++++----- 18 files changed, 76 insertions(+), 14 deletions(-) create mode 100644 tests/multi-targets/examples/excdylib.rs create mode 100644 tests/multi-targets/libs/cdylib/Cargo.lock create mode 100644 tests/multi-targets/libs/cdylib/Cargo.toml create mode 100644 tests/multi-targets/libs/cdylib/src/lib.rs create mode 100644 tests/multi-targets/libs/dylib/Cargo.lock create mode 100644 tests/multi-targets/libs/dylib/Cargo.toml create mode 100644 tests/multi-targets/libs/dylib/src/lib.rs create mode 100644 tests/multi-targets/libs/rlib/Cargo.lock create mode 100644 tests/multi-targets/libs/rlib/Cargo.toml create mode 100644 tests/multi-targets/libs/rlib/src/lib.rs create mode 100644 tests/multi-targets/libs/staticlib/Cargo.lock create mode 100644 tests/multi-targets/libs/staticlib/Cargo.toml create mode 100644 tests/multi-targets/libs/staticlib/src/lib.rs diff --git a/rust/cargo_config.py b/rust/cargo_config.py index 809d7785..a24075e8 100644 --- a/rust/cargo_config.py +++ b/rust/cargo_config.py @@ -238,7 +238,7 @@ def items_target(self): # AFAIK, when there are multiple "kind" values, this only happens # when there are multiple library kinds. kind = target['kind'][0] - if kind in ('lib', 'rlib', 'dylib', 'staticlib', 'proc-macro'): + if kind in ('lib', 'rlib', 'dylib', 'cdylib', 'staticlib', 'proc-macro'): kinds.setdefault('lib', []).append(('Lib', '--lib')) elif kind in ('bin', 'test', 'example', 'bench'): text = '%s: %s' % (kind.capitalize(), target['name']) @@ -915,7 +915,7 @@ def get_cargo_metadata(window, cwd): - kind: List of kinds. May contain multiple entries if `crate-type` specifies multiple values in Cargo.toml. Lots of different types of values: - - Libraries: 'lib', 'rlib', 'dylib', 'staticlib', + - Libraries: 'lib', 'rlib', 'dylib', 'cdylib', 'staticlib', 'proc-macro' - Executables: 'bin', 'test', 'example', 'bench' - build.rs: 'custom-build' diff --git a/rust/target_detect.py b/rust/target_detect.py index 7b411cb6..904a9e4d 100644 --- a/rust/target_detect.py +++ b/rust/target_detect.py @@ -92,8 +92,8 @@ def _target_to_args(self, target): # generally you only use one command-line argument to build multiple # "kinds" (--lib in this case). # - # Nightly beware: [[example]] that specifies crate-type will no - # longer show up as "example", making it impossible to compile. + # Caution: [[example]] that specifies crate-type had issues before + # 1.17. # See https://github.com/rust-lang/cargo/pull/3556 and # https://github.com/rust-lang/cargo/issues/3572 # https://github.com/rust-lang/cargo/pull/3668 (ISSUE FIXED) @@ -101,7 +101,7 @@ def _target_to_args(self, target): # For now, just grab the first kind since it will always result in the # same arguments. kind = target['kind'][0] - if kind in ('lib', 'rlib', 'dylib', 'staticlib', 'proc-macro'): + if kind in ('lib', 'rlib', 'dylib', 'cdylib', 'staticlib', 'proc-macro'): return (target['src_path'], ['--lib']) elif kind in ('bin', 'test', 'example', 'bench'): return (target['src_path'], ['--' + kind, target['name']]) diff --git a/tests/multi-targets/Cargo.toml b/tests/multi-targets/Cargo.toml index 862dd2ce..8c11640b 100644 --- a/tests/multi-targets/Cargo.toml +++ b/tests/multi-targets/Cargo.toml @@ -52,3 +52,9 @@ name = "exlib" path = "examples/exlib.rs" crate-type = ["dylib"] test = false + +[[example]] +name = "excdylib" +path = "examples/excdylib.rs" +crate-type = ["cdylib"] +test = false diff --git a/tests/multi-targets/examples/excdylib.rs b/tests/multi-targets/examples/excdylib.rs new file mode 100644 index 00000000..21d06aa1 --- /dev/null +++ b/tests/multi-targets/examples/excdylib.rs @@ -0,0 +1,3 @@ +pub fn somefunc() { + println!("somefunc"); +} diff --git a/tests/multi-targets/libs/cdylib/Cargo.lock b/tests/multi-targets/libs/cdylib/Cargo.lock new file mode 100644 index 00000000..a35a29b6 --- /dev/null +++ b/tests/multi-targets/libs/cdylib/Cargo.lock @@ -0,0 +1,4 @@ +[root] +name = "cdylib" +version = "0.1.0" + diff --git a/tests/multi-targets/libs/cdylib/Cargo.toml b/tests/multi-targets/libs/cdylib/Cargo.toml new file mode 100644 index 00000000..a3ccd93a --- /dev/null +++ b/tests/multi-targets/libs/cdylib/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "cdylib" +version = "0.1.0" + +[lib] +crate-type = ["cdylib"] diff --git a/tests/multi-targets/libs/cdylib/src/lib.rs b/tests/multi-targets/libs/cdylib/src/lib.rs new file mode 100644 index 00000000..65df08d6 --- /dev/null +++ b/tests/multi-targets/libs/cdylib/src/lib.rs @@ -0,0 +1,2 @@ +fn f() { +} diff --git a/tests/multi-targets/libs/dylib/Cargo.lock b/tests/multi-targets/libs/dylib/Cargo.lock new file mode 100644 index 00000000..f49db359 --- /dev/null +++ b/tests/multi-targets/libs/dylib/Cargo.lock @@ -0,0 +1,4 @@ +[root] +name = "dylib" +version = "0.1.0" + diff --git a/tests/multi-targets/libs/dylib/Cargo.toml b/tests/multi-targets/libs/dylib/Cargo.toml new file mode 100644 index 00000000..b956471c --- /dev/null +++ b/tests/multi-targets/libs/dylib/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "dylib" +version = "0.1.0" + +[lib] +crate-type = ["dylib"] diff --git a/tests/multi-targets/libs/dylib/src/lib.rs b/tests/multi-targets/libs/dylib/src/lib.rs new file mode 100644 index 00000000..65df08d6 --- /dev/null +++ b/tests/multi-targets/libs/dylib/src/lib.rs @@ -0,0 +1,2 @@ +fn f() { +} diff --git a/tests/multi-targets/libs/rlib/Cargo.lock b/tests/multi-targets/libs/rlib/Cargo.lock new file mode 100644 index 00000000..f7fe350e --- /dev/null +++ b/tests/multi-targets/libs/rlib/Cargo.lock @@ -0,0 +1,4 @@ +[root] +name = "rlib" +version = "0.1.0" + diff --git a/tests/multi-targets/libs/rlib/Cargo.toml b/tests/multi-targets/libs/rlib/Cargo.toml new file mode 100644 index 00000000..da19b7c6 --- /dev/null +++ b/tests/multi-targets/libs/rlib/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "rlib" +version = "0.1.0" + +[lib] +crate-type = ["rlib"] diff --git a/tests/multi-targets/libs/rlib/src/lib.rs b/tests/multi-targets/libs/rlib/src/lib.rs new file mode 100644 index 00000000..65df08d6 --- /dev/null +++ b/tests/multi-targets/libs/rlib/src/lib.rs @@ -0,0 +1,2 @@ +fn f() { +} diff --git a/tests/multi-targets/libs/staticlib/Cargo.lock b/tests/multi-targets/libs/staticlib/Cargo.lock new file mode 100644 index 00000000..f7fe350e --- /dev/null +++ b/tests/multi-targets/libs/staticlib/Cargo.lock @@ -0,0 +1,4 @@ +[root] +name = "rlib" +version = "0.1.0" + diff --git a/tests/multi-targets/libs/staticlib/Cargo.toml b/tests/multi-targets/libs/staticlib/Cargo.toml new file mode 100644 index 00000000..da19b7c6 --- /dev/null +++ b/tests/multi-targets/libs/staticlib/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "rlib" +version = "0.1.0" + +[lib] +crate-type = ["rlib"] diff --git a/tests/multi-targets/libs/staticlib/src/lib.rs b/tests/multi-targets/libs/staticlib/src/lib.rs new file mode 100644 index 00000000..65df08d6 --- /dev/null +++ b/tests/multi-targets/libs/staticlib/src/lib.rs @@ -0,0 +1,2 @@ +fn f() { +} diff --git a/tests/rust_test_common.py b/tests/rust_test_common.py index a359a3ab..d7785b3a 100644 --- a/tests/rust_test_common.py +++ b/tests/rust_test_common.py @@ -37,10 +37,6 @@ class TestBase(unittest.TestCase): def setUp(self): window = sublime.active_window() - # No necessary to set build system since tests call 'cargo_exec' - # directly. - # window.run_command('set_build_system', - # {'file': 'Packages/sublime-rust/RustEnhanced.sublime-build'}) # Clear any rust project settings. data = window.project_data() if 'cargo_build' in data.get('settings', {}): diff --git a/tests/test_target_detect.py b/tests/test_target_detect.py index 880a1de3..83ec4650 100644 --- a/tests/test_target_detect.py +++ b/tests/test_target_detect.py @@ -20,10 +20,6 @@ def test_multi_targets(self): ('src/altmain.rs', [('src/altmain.rs', '--bin otherbin')]), ('examples/ex1.rs', [('examples/ex1.rs', '--example ex1')]), ('examples/ex2.rs', [('examples/ex2.rs', '--example ex2')]), - # Unfortunately the fix for this missed the 1.16 deadline, wait - # for 1.17 to uncomment this. See - # https://github.com/rust-lang/cargo/pull/3668 - # ('examples/exlib.rs', [('examples/exlib.rs', '--example exlib')]), ('tests/test1.rs', [('tests/test1.rs', '--test test1')]), ('tests/test2.rs', [('tests/test2.rs', '--test test2')]), ('benches/bench1.rs', [('benches/bench1.rs', '--bench bench1')]), @@ -39,8 +35,21 @@ def test_multi_targets(self): ('tests/test2.rs', '--test test2')]), # proc-macro kind ('pmacro/src/lib.rs', [('pmacro/src/lib.rs', '--lib')]), - + # Different lib types. + ('libs/cdylib/src/lib.rs', [('libs/cdylib/src/lib.rs', '--lib')]), + ('libs/dylib/src/lib.rs', [('libs/dylib/src/lib.rs', '--lib')]), + ('libs/rlib/src/lib.rs', [('libs/rlib/src/lib.rs', '--lib')]), + ('libs/staticlib/src/lib.rs', [('libs/staticlib/src/lib.rs', '--lib')]), ] + rustc_version = util.get_rustc_version(sublime.active_window(), + plugin_path) + if semver.match(rustc_version, '>=1.17.0'): + # Example libraries had issues before 1.17. + expected_targets.extend([ + ('examples/exlib.rs',[('examples/exlib.rs', '--example exlib')]), + ('examples/excdylib.rs',[('examples/excdylib.rs', '--example excdylib')]), + ]) + for (path, targets) in expected_targets: path = os.path.join('tests', 'multi-targets', path) targets = [(os.path.normpath( From ae61e332ea5939a7653cd0372e81346c47612420 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Thu, 8 Jun 2017 12:42:23 -0700 Subject: [PATCH 32/32] Update tests for new messages in rust 1.18. --- tests/workspace/workspace1/src/lib.rs | 9 ++++++--- tests/workspace/workspace2/src/lib.rs | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/workspace/workspace1/src/lib.rs b/tests/workspace/workspace1/src/lib.rs index 910b1e59..99773532 100644 --- a/tests/workspace/workspace1/src/lib.rs +++ b/tests/workspace/workspace1/src/lib.rs @@ -1,8 +1,11 @@ mod anothermod; /*BEGIN*/struct S { +// ^^^^^^^^ERR(>=1.18.0) recursive type has infinite size +// ^^^^^^^^ERR(>=1.18.0) recursive type `S` has infinite size +// ^^^^^^^^HELP(>=1.18.0) insert indirection recursive: S }/*END*/ -// ~ERR recursive type has infinite size -// ~ERR recursive type -// ~HELP insert indirection +// ~ERR(<1.18.0) recursive type has infinite size +// ~ERR(<1.18.0) recursive type `S` has infinite size +// ~HELP(<1.18.0) insert indirection diff --git a/tests/workspace/workspace2/src/lib.rs b/tests/workspace/workspace2/src/lib.rs index a68b52ba..a1b23eaf 100644 --- a/tests/workspace/workspace2/src/lib.rs +++ b/tests/workspace/workspace2/src/lib.rs @@ -9,4 +9,5 @@ pub fn f() { // ^ERR mismatched types // ^NOTE expected type `&Trait` // ^NOTE(<1.16.0) found type +// ^HELP(>=1.18.0) try with `&x` }