After some more debugging, I have some more information:

In XrdSys::IOEvents::Poller::CbkXeq(), a check to see whether the "effective poller" is equal to the "real poller" fails:


// Verify that there is a callback here and the channel is ready. If not,
// disable this channel for the events being refelcted unless the event is a
// fatal error. In this case we need to abandon the channel since error events
// may continue to be generated as we can't always disable them.
//
if (!(cP->chCB) || cP->chPoller != cP->chPollXQ)
{if (eNum)
{cP->chPoller = &pollErr1; cP->chFault = eNum;
cP->inPSet = 0;
return false;
}
oldEvents = cP->chEvents;
cP->chEvents = 0;
Modify(cP, eNum, 0, isLocked);
if (!isLocked) cP->chMutex.Lock();
cP->chEvents = oldEvents;
return true;
}

This obviously then returns without invoking the callback. Note that eNum is not set in this case, so the poller is not set to the error object.

I'm not sure why this happens - I'll keep digging.


Reply to this email directly or view it on GitHub.



Use REPLY-ALL to reply to list

To unsubscribe from the XROOTD-DEV list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=XROOTD-DEV&A=1