diff --git a/src/serverchan.cpp b/src/serverchan.cpp index 78d86db..e822c93 100644 --- a/src/serverchan.cpp +++ b/src/serverchan.cpp @@ -32,6 +32,7 @@ ServerChan::ServerChan(const std::shared_ptr &conn, ServerChan::~ServerChan() { assert(state==Destroy); + assert(!onClose); } ServerChannelControl::ServerChannelControl(const std::shared_ptr &conn, const std::shared_ptr& channel) @@ -99,7 +100,7 @@ void ServerChannelControl::onClose(std::function&& fn) serv->acceptor_loop.call([this, &fn](){ auto ch = chan.lock(); - if(!ch) + if(!ch || ch->state==ServerChan::Destroy) return; ch->onClose = std::move(fn); @@ -128,8 +129,10 @@ void ServerChannel_shutdown(const std::shared_ptr& chan) op->state = ServerOp::Dead; - if(op->onClose) - op->onClose(""); + if(op->onClose) { + auto fn(std::move(op->onClose)); + fn(""); + } conn->opByIOID.erase(op->ioid); } @@ -137,8 +140,10 @@ void ServerChannel_shutdown(const std::shared_ptr& chan) chan->opByIOID.clear(); - if(chan->onClose) - chan->onClose(""); + if(chan->onClose) { + auto fn(std::move(chan->onClose)); + fn(""); + } } void ServerChannelControl::close() @@ -325,6 +330,7 @@ void ServerConn::handle_CREATE_CHANNEL() sts.code = Status::Fatal; sts.msg = "Refused to create Channel"; sts.trace = "pvx:serv:refusechan:"; + chan->state = ServerChan::Destroy; sid = -1; } diff --git a/src/serverconn.cpp b/src/serverconn.cpp index e675d26..e55b5e2 100644 --- a/src/serverconn.cpp +++ b/src/serverconn.cpp @@ -287,8 +287,10 @@ void ServerConn::cleanup() } for(auto& pair : chanBySID) { pair.second->state = ServerChan::Destroy; - if(pair.second->onClose) - pair.second->onClose(""); + if(pair.second->onClose) { + auto fn(std::move(pair.second->onClose)); + fn(""); + } } }