internal void SponsorCall(ISponsor sponsor)
{
BCLDebug.Trace("REMOTE","Lease ",id," SponsorCall state ",((Enum)state).ToString());
bool exceptionOccurred = false;
if (state == LeaseState.Expired)
return;
lock(sponsorTable)
{
try
{
Object sponsorId = GetSponsorId(sponsor);
sponsorCallThread = Thread.CurrentThread.GetHashCode();
AsyncRenewal ar = new AsyncRenewal(sponsor.Renewal);
SponsorStateInfo sponsorStateInfo = (SponsorStateInfo)sponsorTable[sponsorId];
sponsorStateInfo.sponsorState = SponsorState.Waiting;
// The first parameter should be the lease we are trying to renew.
IAsyncResult iar = ar.BeginInvoke(this, new AsyncCallback(this.SponsorCallback), null);
if ((sponsorStateInfo.sponsorState == SponsorState.Waiting) && (state != LeaseState.Expired))
{
// Even if we get here, the operation could still complete before
// we call the the line below. This seems to be a race.
// Sponsor could have completed before statement is reached, so only execute
// if the sponsor state is still waiting
leaseManager.RegisterSponsorCall(this, sponsorId, sponsorshipTimeout);
}
sponsorCallThread = 0;
}catch(Exception)
{
// Sponsor not avaiable
exceptionOccurred = true;
sponsorCallThread = 0;
}
}
if (exceptionOccurred)
{
BCLDebug.Trace("REMOTE","Lease ",id," SponsorCall Sponsor Exception ");
Unregister(sponsor);
ProcessNextSponsor();
}
}