diff --git a/src/clientimpl.h b/src/clientimpl.h index 6ffb7d3..a981e38 100644 --- a/src/clientimpl.h +++ b/src/clientimpl.h @@ -26,7 +26,7 @@ struct Channel; // internal actions on an Operation struct OperationBase : public Operation { - const std::shared_ptr chan; + std::shared_ptr chan; uint32_t ioid; OperationBase(operation_t op, const std::shared_ptr& chan); diff --git a/src/clientintrospect.cpp b/src/clientintrospect.cpp index 992fe5f..9b0d9df 100644 --- a/src/clientintrospect.cpp +++ b/src/clientintrospect.cpp @@ -36,11 +36,19 @@ struct InfoOp : public OperationBase cancel(); } - virtual void cancel() override final {} + virtual void cancel() override final { + auto context = chan->context; + context->tcp_loop.call([this](){ + state = Done; + chan.reset(); + }); + } virtual void createOp() override final { - assert(state==Connecting); + if(state!=Connecting) { + return; + } auto& conn = chan->conn;