mirror of https://github.com/vacp2p/nim-libp2p.git
reduse usssage of asyncCheck
This commit is contained in:
parent
bd49a35e0a
commit
6cbcc7859e
|
@ -35,26 +35,28 @@ proc newInvalidVarintException*(): ref InvalidVarintException =
|
||||||
proc newInvalidVarintSizeException*(): ref InvalidVarintSizeException =
|
proc newInvalidVarintSizeException*(): ref InvalidVarintSizeException =
|
||||||
newException(InvalidVarintSizeException, "Wrong varint size")
|
newException(InvalidVarintSizeException, "Wrong varint size")
|
||||||
|
|
||||||
proc init*[T: Connection](self: var T, stream: LPStream) =
|
proc bindStreamClose(conn: Connection) {.async.} =
|
||||||
|
# bind stream's close event to connection's close
|
||||||
|
# to ensure correct close propagation
|
||||||
|
if not isNil(conn.stream.closeEvent):
|
||||||
|
await conn.stream.closeEvent.wait()
|
||||||
|
trace "wrapped stream closed, about to close conn", closed = this.isClosed,
|
||||||
|
peer = if not isNil(this.peerInfo):
|
||||||
|
this.peerInfo.id else: ""
|
||||||
|
if not conn.isClosed:
|
||||||
|
trace "wrapped stream closed, closing conn", closed = this.isClosed,
|
||||||
|
peer = if not isNil(this.peerInfo):
|
||||||
|
this.peerInfo.id else: ""
|
||||||
|
asyncCheck conn.close()
|
||||||
|
|
||||||
|
proc init*[T: Connection](self: var T, stream: LPStream): T =
|
||||||
## create a new Connection for the specified async reader/writer
|
## create a new Connection for the specified async reader/writer
|
||||||
new self
|
new self
|
||||||
self.stream = stream
|
self.stream = stream
|
||||||
self.closeEvent = newAsyncEvent()
|
self.closeEvent = newAsyncEvent()
|
||||||
|
asyncCheck self.bindStreamClose()
|
||||||
|
|
||||||
# bind stream's close event to connection's close
|
return self
|
||||||
# to ensure correct close propagation
|
|
||||||
let this = self
|
|
||||||
if not isNil(stream.closeEvent):
|
|
||||||
stream.closeEvent.wait().
|
|
||||||
addCallback do (udata: pointer):
|
|
||||||
trace "wrapped stream closed, about to close conn", closed = this.isClosed,
|
|
||||||
peer = if not isNil(this.peerInfo):
|
|
||||||
this.peerInfo.id else: ""
|
|
||||||
if not this.isClosed:
|
|
||||||
trace "wrapped stream closed, closing conn", closed = this.isClosed,
|
|
||||||
peer = if not isNil(this.peerInfo):
|
|
||||||
this.peerInfo.id else: ""
|
|
||||||
asyncCheck this.close()
|
|
||||||
|
|
||||||
proc newConnection*(stream: LPStream): Connection =
|
proc newConnection*(stream: LPStream): Connection =
|
||||||
## create a new Connection for the specified async reader/writer
|
## create a new Connection for the specified async reader/writer
|
||||||
|
@ -119,7 +121,7 @@ method close*(s: Connection) {.async, gcsafe.} =
|
||||||
|
|
||||||
if not s.closed:
|
if not s.closed:
|
||||||
if not isNil(s.stream) and not s.stream.closed:
|
if not isNil(s.stream) and not s.stream.closed:
|
||||||
trace "closing connection", closed = s.closed,
|
trace "closing child stream", closed = s.closed,
|
||||||
peer = if not isNil(s.peerInfo):
|
peer = if not isNil(s.peerInfo):
|
||||||
s.peerInfo.id else: ""
|
s.peerInfo.id else: ""
|
||||||
await s.stream.close()
|
await s.stream.close()
|
||||||
|
|
|
@ -128,6 +128,11 @@ method handle*(m: Mplex) {.async, gcsafe.} =
|
||||||
trace "stopping mplex main loop"
|
trace "stopping mplex main loop"
|
||||||
await m.close()
|
await m.close()
|
||||||
|
|
||||||
|
proc internalCleanup(m: Mplex, conn: Connection) {.async.} =
|
||||||
|
await conn.closeEvent.wait()
|
||||||
|
trace "connection closed, cleaning up mplex"
|
||||||
|
await m.close()
|
||||||
|
|
||||||
proc newMplex*(conn: Connection,
|
proc newMplex*(conn: Connection,
|
||||||
maxChanns: uint = MaxChannels): Mplex =
|
maxChanns: uint = MaxChannels): Mplex =
|
||||||
new result
|
new result
|
||||||
|
@ -136,11 +141,7 @@ proc newMplex*(conn: Connection,
|
||||||
result.remote = initTable[uint64, LPChannel]()
|
result.remote = initTable[uint64, LPChannel]()
|
||||||
result.local = initTable[uint64, LPChannel]()
|
result.local = initTable[uint64, LPChannel]()
|
||||||
|
|
||||||
let m = result
|
asyncCheck result.internalCleanup(conn)
|
||||||
conn.closeEvent.wait()
|
|
||||||
.addCallback do (udata: pointer):
|
|
||||||
trace "connection closed, cleaning up mplex"
|
|
||||||
asyncCheck m.close()
|
|
||||||
|
|
||||||
method newStream*(m: Mplex,
|
method newStream*(m: Mplex,
|
||||||
name: string = "",
|
name: string = "",
|
||||||
|
|
|
@ -138,6 +138,14 @@ method handleConn*(p: PubSub,
|
||||||
trace "pubsub peer handler ended, cleaning up"
|
trace "pubsub peer handler ended, cleaning up"
|
||||||
await p.cleanUpHelper(peer)
|
await p.cleanUpHelper(peer)
|
||||||
|
|
||||||
|
proc internalClenaup(p: PubSub, conn: Connection) {.async.} =
|
||||||
|
# handle connection close
|
||||||
|
var peer = p.getPeer(conn.peerInfo, p.codec)
|
||||||
|
await conn.closeEvent.wait()
|
||||||
|
trace "connection closed, cleaning up peer", peer = conn.peerInfo.id
|
||||||
|
|
||||||
|
await p.cleanUpHelper(peer)
|
||||||
|
|
||||||
method subscribeToPeer*(p: PubSub,
|
method subscribeToPeer*(p: PubSub,
|
||||||
conn: Connection) {.base, async.} =
|
conn: Connection) {.base, async.} =
|
||||||
var peer = p.getPeer(conn.peerInfo, p.codec)
|
var peer = p.getPeer(conn.peerInfo, p.codec)
|
||||||
|
@ -145,13 +153,7 @@ method subscribeToPeer*(p: PubSub,
|
||||||
if not peer.isConnected:
|
if not peer.isConnected:
|
||||||
peer.conn = conn
|
peer.conn = conn
|
||||||
|
|
||||||
# handle connection close
|
asyncCheck p.internalClenaup(conn)
|
||||||
conn.closeEvent.wait()
|
|
||||||
.addCallback do (udata: pointer = nil):
|
|
||||||
trace "connection closed, cleaning up peer",
|
|
||||||
peer = conn.peerInfo.id
|
|
||||||
|
|
||||||
asyncCheck p.cleanUpHelper(peer)
|
|
||||||
|
|
||||||
method unsubscribe*(p: PubSub,
|
method unsubscribe*(p: PubSub,
|
||||||
topics: seq[TopicPair]) {.base, async.} =
|
topics: seq[TopicPair]) {.base, async.} =
|
||||||
|
|
Loading…
Reference in New Issue