protected void GetCloseHandler(object o, EventArgs args) {
Channel queue = (Channel) o;
queue.EnqueueEvent -= this.GetEnqueueHandler;
queue.CloseEvent -= this.GetCloseHandler;
// Looking up state
AsDhtGetState adgs = (AsDhtGetState) _adgs_table[queue];
if(adgs == null) {
return;
}
int count = 0;
lock(adgs.SyncRoot) {
adgs.queueMapping.Remove(queue);
count = adgs.queueMapping.Count;
}
lock(_adgs_table.SyncRoot) {
_adgs_table.Remove(queue);
}
if(count == 0) {
adgs.returns.Close();
GetFollowUp(adgs);
}
else if(count < MAJORITY && !adgs.GotToLeaveEarly) {
lock(adgs.SyncRoot) {
if(!adgs.GotToLeaveEarly) {
GetLeaveEarly(adgs);
}
}
}
}