Car Mirror Session Termination

Push session - client is source

source  sink		Status
blocks->			source sets SenderClosing
		< status
blocks->			source: on BEGIN_DRAINING if SenderClosing is set, set SenderClosed
		<-status	sink: on BEGIN_SEND if SenderClosed, Set ReceiverClosed

Session ends when SenderClosed & ReceiverClosed


on END_SESSION, set ReceiverClosed
on CANCEL, set ReceiverClosed
on BEGIN_SEND set ReceiverClosing if SenderClosing
IsClosed true if SenderClosed or ReceiverClosed
on BEGIN_DRAINING, set SenderClosed if ReceiverClosing
on END_SESSION, set SenderClosed
on CANCEL, set SenderClosed
IsClosed true if SenderClosed

BEGIN_SEND happens when: sink pending is empty // this is the queue of blocks to process and add to the want list
BEGIN_DRAINING happens when: source pending is empty // this is the queue of blocks to send

Pull session - client is sink

sink		source		Status
status->			sink sets ReceiverClosing
status->			sink: on BEGIN_SEND and ReceiverClosing is set, set ReceiverClosed
		<-blocks	source: on BEGIN_DRAINING when status is ReceiverClosed, Set SenderClosed