summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Kobert <dennis@kobert.dev>2020-01-12 20:36:45 +0100
committerDennis Kobert <dennis@kobert.dev>2020-01-12 20:36:45 +0100
commit70fa220f7a2b1b2275679547ac21768ab657cea2 (patch)
treed5d618aaac9968a555e59f9bb5df148026de0160
parente3b8e2dadec5009ec1c3de72a202583f65129993 (diff)
Add diagnostic script, prune result evaluation
-rwxr-xr-xrust-unmangle32
-rw-r--r--src/solvers/gpu/host.rs2
-rw-r--r--src/solvers/gpu/output.rs19
3 files changed, 44 insertions, 9 deletions
diff --git a/rust-unmangle b/rust-unmangle
new file mode 100755
index 0000000..183f7f9
--- /dev/null
+++ b/rust-unmangle
@@ -0,0 +1,32 @@
+#!/usr/bin/sed -rf
+# Unmangle Rust symbols
+# See https://git.kernel.org/cgit/linux/kernel/git/tip/tip.git/commit/?id=cae15db74999edb96dd9f5bbd4d55849391dd92b
+# Example, with [FlameGraph](https://github.com/brendangregg/FlameGraph):
+# perf record -g target/debug/bin
+# perf script | stackcollapse-perf | rust-unmangle | flamegraph > perf.svg
+
+# Remove hash and address offset
+s/::h[0-9a-f]{16}//g
+s/\+0x[0-9a-f]+//g
+
+# Convert special characters
+s/\$C\$/,/g
+s/\$SP\$/@/g
+s/\$BP\$/*/g
+s/\$RF\$/\&/g
+s/\$LT\$/</g
+s/\$GT\$/>/g
+s/\$LP\$/(/g
+s/\$RP\$/)/g
+s/\$u20\$/ /g
+s/\$u27\$/'/g
+s/\$u5b\$/[/g
+s/\$u5d\$/]/g
+s/\$u7b\$/{/g
+s/\$u7d\$/}/g
+s/\$u7e\$/~/g
+
+# Fix . and _
+s/\.\./::/g
+s/[^\.]\.[^\.]/./g
+s/([;:])_/\1/g
diff --git a/src/solvers/gpu/host.rs b/src/solvers/gpu/host.rs
index d67138e..4fe835a 100644
--- a/src/solvers/gpu/host.rs
+++ b/src/solvers/gpu/host.rs
@@ -68,7 +68,7 @@ impl Host {
output_sender,
};
let handle = std::thread::Builder::new()
- .name("GPU Deamon".into())
+ .name("GPU Host Deamon".into())
.spawn(move || {
solver.run();
})
diff --git a/src/solvers/gpu/output.rs b/src/solvers/gpu/output.rs
index 4e52ab4..9cbef1a 100644
--- a/src/solvers/gpu/output.rs
+++ b/src/solvers/gpu/output.rs
@@ -30,15 +30,18 @@ impl InBuffer {
.expect("Channel to Output Daemon broke")
{
Message::ResultMessage(results) => {
- if let Some(result_walls) = self.row_requests.get(&results.id) {
- return Some(Self::calc_results(
- results.valid_walls().as_ref(),
- result_walls,
- ));
- } else {
- if results.data.iter().any(|x| *x != 0) {
- self.results_requests.insert(results.id, results);
+ if results.data.iter().any(|x| *x != 0) {
+ println!("Horay results!");
+ if let Some(result_walls) = self.row_requests.get(&results.id) {
+ return Some(Self::calc_results(
+ results.valid_walls().as_ref(),
+ result_walls,
+ ));
} else {
+ self.results_requests.insert(results.id, results);
+ }
+ } else {
+ if self.row_requests.remove(&results.id).is_none() {
self.banned_requests.insert(results.id);
}
}