358 #ifdef _POSIX_ASYNCHRONOUS_IO
360 int mySignum = *((
int *)mySigarg);
361 const char *sigType = (mySignum == OSS_AIO_READ_DONE ?
"read" :
"write");
362 const int isRead = (mySignum == OSS_AIO_READ_DONE);
369 extern int sigwaitinfo(
const sigset_t *set, siginfo_t *info);
370 extern siginfo_t *XrdOssAioInfoR;
371 extern siginfo_t *XrdOssAioInfoW;
377 if (isRead) XrdOssAioInfoR = &myInfo;
378 else XrdOssAioInfoW = &myInfo;
382 sigfillset(&mySigset);
383 sigdelset(&mySigset, mySignum);
388 sigemptyset(&mySigset);
389 sigaddset(&mySigset, mySignum);
394 do {
do {numsig = sigwaitinfo((
const sigset_t *)&mySigset, &myInfo);}
395 while (numsig < 0 && errno == EINTR);
397 {
OssEroute.
Emsg(
"AioWait",errno,sigType,
"wait for AIO signal");
401 if (numsig != mySignum || myInfo.si_code != SI_ASYNCIO)
403 sprintf(buff,
"%d %d", myInfo.si_code, numsig);
404 OssEroute.
Emsg(
"AioWait",
"received unexpected signal", buff);
409 aiop = (
XrdSfsAio *)myInfo.si_value.sigval_ptr;
411 aiop = (
XrdSfsAio *)myInfo.si_value.sival_ptr;
414 while ((rc = aio_error(&aiop->
sfsAio)) == EINPROGRESS) {}
415 retval = (ssize_t)aio_return(&aiop->
sfsAio);
417 DEBUG(sigType <<
" completed for " <<aiop->
TIdent <<
"; rc=" <<rc
418 <<
" result=" <<retval <<
" aiocb=" <<
Xrd::hex1 <<aiop);
420 if (retval < 0) aiop->
Result = -rc;
421 else aiop->
Result = retval;
virtual void doneRead()=0
virtual void doneWrite()=0
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)