Skip to content

Commit

Permalink
pw_transfer: Cancel unregistered transfers
Browse files Browse the repository at this point in the history
When a transfer handler is unregistered, all active transfers that rely
on it are canceled to ensure no dangling references to the handler
remain after unregistration.

Change-Id: I3d6da1416b8e342090bc955bf912058616454b6f
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/92101
Pigweed-Auto-Submit: Armando Montanez <amontanez@google.com>
Reviewed-by: Wyatt Hepler <hepler@google.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed.google.com.iam.gserviceaccount.com>
  • Loading branch information
armandomontanez authored and CQ Bot Account committed Apr 25, 2022
1 parent 873865d commit b4eedaa
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 0 deletions.
3 changes: 3 additions & 0 deletions pw_transfer/public/pw_transfer/internal/server_context.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ class ServerContext final : public Context {
// ClientContexts don't track it.
void set_handler(Handler& handler) { handler_ = &handler; }

// Returns the pointer to the current handler.
const Handler* handler() { return handler_; }

private:
// Ends the transfer with the given status, calling the handler's Finalize
// method. No chunks are sent.
Expand Down
3 changes: 3 additions & 0 deletions pw_transfer/public/pw_transfer/transfer_thread.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,9 @@ class TransferThread : public thread::ThreadCore {

void RemoveTransferHandler(Handler& handler) {
TransferHandlerEvent(EventType::kRemoveTransferHandler, handler);
// Ensure this function blocks until the transfer handler is fully cleaned
// up.
WaitUntilEventIsProcessed();
}

size_t max_chunk_size() const { return chunk_buffer_.size(); }
Expand Down
13 changes: 13 additions & 0 deletions pw_transfer/transfer_thread.cc
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,19 @@ void TransferThread::HandleEvent(const internal::Event& event) {
return;

case EventType::kRemoveTransferHandler:
for (ServerContext& server_context : server_transfers_) {
if (server_context.handler() == event.remove_transfer_handler) {
server_context.HandleEvent({
.type = EventType::kServerEndTransfer,
.end_transfer =
{
.session_id = server_context.session_id(),
.status = Status::Aborted().code(),
.send_status_chunk = false,
},
});
}
}
handlers_.remove(*event.remove_transfer_handler);
return;

Expand Down

0 comments on commit b4eedaa

Please sign in to comment.