XRootD
Loading...
Searching...
No Matches
XrdOssAio.cc File Reference
#include <signal.h>
#include <cstdio>
#include <unistd.h>
#include <fcntl.h>
#include "XrdOss/XrdOssApi.hh"
#include "XrdOss/XrdOssTrace.hh"
#include "XrdSys/XrdSysError.hh"
#include "XrdSys/XrdSysPlatform.hh"
#include "XrdSys/XrdSysPthread.hh"
#include "XrdSfs/XrdSfsAio.hh"
+ Include dependency graph for XrdOssAio.cc:

Go to the source code of this file.

Functions

void * XrdOssAioWait (void *mySigarg)
 

Variables

XrdSysError OssEroute
 
XrdSysTrace OssTrace
 

Function Documentation

◆ XrdOssAioWait()

void * XrdOssAioWait ( void * mySigarg)

Definition at line 356 of file XrdOssAio.cc.

357{
358#ifdef _POSIX_ASYNCHRONOUS_IO
359 EPNAME("AioWait");
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;
365 XrdSfsAio *aiop;
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// We will catch one signal at a time. So, the address of siginfo_t can be
374// placed in a global area where the signal handler will find it. We have one
375// two places where this can go.
376//
377 if (isRead) XrdOssAioInfoR = &myInfo;
378 else XrdOssAioInfoW = &myInfo;
379
380// Initialize the signal we will be suspended for
381//
382 sigfillset(&mySigset);
383 sigdelset(&mySigset, mySignum);
384#else
385
386// Initialize the signal we will be waiting for
387//
388 sigemptyset(&mySigset);
389 sigaddset(&mySigset, mySignum);
390#endif
391
392// Simply wait for events and requeue the completed AIO operation
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
423 if (isRead) aiop->doneRead();
424 else aiop->doneWrite();
425 } while(1);
426#endif
427 return (void *)0;
428}
#define DEBUG(x)
#define EPNAME(x)
XrdSysError OssEroute
static int AioAllOk
Definition XrdOssApi.hh:201
ssize_t Result
Definition XrdSfsAio.hh:65
const char * TIdent
Definition XrdSfsAio.hh:67
virtual void doneRead()=0
struct aiocb sfsAio
Definition XrdSfsAio.hh:62
virtual void doneWrite()=0

References XrdOssSys::AioAllOk, DEBUG, XrdSfsAio::doneRead(), XrdSfsAio::doneWrite(), EPNAME, Xrd::hex1, OssEroute, XrdSfsAio::Result, XrdSfsAio::sfsAio, and XrdSfsAio::TIdent.

Referenced by XrdOssSys::AioInit().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ OssEroute

◆ OssTrace