pw_rpc: Properly clean up ServerWriters
- Finish a ServerWriter before moving into it.
- Remove and re-register a ServerWriter when it is moved.
- Finish all ServerWriters when destructing a Server.
Change-Id: I8e2cb7270e1eb2f52c40cb418190a071131c89ca
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/13760
Reviewed-by: Alexei Frolov <frolv@google.com>
Commit-Queue: Wyatt Hepler <hepler@google.com>
diff --git a/pw_rpc/base_server_writer.cc b/pw_rpc/base_server_writer.cc
index 1e23fc8..31da1d2 100644
--- a/pw_rpc/base_server_writer.cc
+++ b/pw_rpc/base_server_writer.cc
@@ -26,11 +26,20 @@
}
BaseServerWriter& BaseServerWriter::operator=(BaseServerWriter&& other) {
+ Finish();
+
+ state_ = other.state_;
+
+ if (other.open()) {
+ other.call_.server().RemoveWriter(other);
+ other.state_ = kClosed;
+
+ other.call_.server().RegisterWriter(*this);
+ }
+
call_ = std::move(other.call_);
response_ = std::move(other.response_);
- state_ = std::move(other.state_);
- other.state_ = kClosed;
return *this;
}