XRootD
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)
Definition: XrdBwmTrace.hh:54
#define EPNAME(x)
Definition: XrdBwmTrace.hh:56
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
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
Definition: XrdSysError.cc:95
@ hex1
Definition: XrdSysTrace.hh:42

References XrdOssSys::AioAllOk, DEBUG, XrdSfsAio::doneRead(), XrdSfsAio::doneWrite(), XrdSysError::Emsg(), 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

XrdSysTrace OssTrace
extern