357{
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);
363 sigset_t mySigset;
364 siginfo_t myInfo;
366 int rc, numsig;
367 ssize_t retval;
368#ifndef HAVE_SIGWTI
369 extern int sigwaitinfo(const sigset_t *set, siginfo_t *info);
370 extern siginfo_t *XrdOssAioInfoR;
371 extern siginfo_t *XrdOssAioInfoW;
372
373
374
375
376
377 if (isRead) XrdOssAioInfoR = &myInfo;
378 else XrdOssAioInfoW = &myInfo;
379
380
381
382 sigfillset(&mySigset);
383 sigdelset(&mySigset, mySignum);
384#else
385
386
387
388 sigemptyset(&mySigset);
389 sigaddset(&mySigset, mySignum);
390#endif
391
392
393
394 do {do {numsig = sigwaitinfo((const sigset_t *)&mySigset, &myInfo);}
395 while (numsig < 0 && errno == EINTR);
396 if (numsig < 0)
397 {
OssEroute.Emsg(
"AioWait",errno,sigType,
"wait for AIO signal");
399 break;
400 }
401 if (numsig != mySignum || myInfo.si_code != SI_ASYNCIO)
402 {char buff[80];
403 sprintf(buff, "%d %d", myInfo.si_code, numsig);
404 OssEroute.Emsg(
"AioWait",
"received unexpected signal", buff);
405 continue;
406 }
407
408#ifdef __APPLE__
409 aiop = (
XrdSfsAio *)myInfo.si_value.sigval_ptr;
410#else
411 aiop = (
XrdSfsAio *)myInfo.si_value.sival_ptr;
412#endif
413
414 while ((rc = aio_error(&aiop->
sfsAio)) == EINPROGRESS) {}
415 retval = (ssize_t)aio_return(&aiop->
sfsAio);
416
417 DEBUG(sigType <<
" completed for " <<aiop->
TIdent <<
"; rc=" <<rc
418 <<
" result=" <<retval <<
" aiocb=" <<
Xrd::hex1 <<aiop);
419
420 if (retval < 0) aiop->
Result = -rc;
421 else aiop->
Result = retval;
422
425 } while(1);
426#endif
427 return (void *)0;
428}
virtual void doneRead()=0
virtual void doneWrite()=0