Beispiel #1
0
void net_habitue_device_SC101::handleAsyncIOTimeout(outstanding *out, void *ctx)
{
  outstanding_io *io = (outstanding_io *)ctx;
  IOStorageCompletion completion = io->completion;
  bool isWrite = (io->buffer->getDirection() == kIODirectionOut);
  
  io->attempt++;
  io->timeout_ms = getNextTimeoutMS(io->attempt, isWrite);
  
  if (io->timeout_ms)
  {
    if (io->attempt > 3)
      KINFO("retry IO (%p, %d, %d)", io, io->attempt, io->timeout_ms);
    else
      KDEBUG("retry IO (%p, %d, %d)", io, io->attempt, io->timeout_ms);
    // IOBlockStorageDriver::incrementRetries(isWrite)
    
    doSubmitIO(io);
    return;
  }
  
  KINFO("abort IO %p", io);
  // IOBlockStorageDriver::incrementErrors(isWrite)
  
  completeIO(io);
  io->addr->release();
  IODelete(io, outstanding_io, 1);

  IOStorage::complete(completion, kIOReturnNotResponding, 0);
}
Beispiel #2
0
void net_habitue_device_SC101::handleAsyncIOPacket(sockaddr_in *addr, mbuf_t m, size_t len, outstanding *out, void *ctx)
{  
  clock_get_uptime(&_lastReply);
  
  outstanding_io *io = (outstanding_io *)ctx;
  bool isWrite = (io->buffer->getDirection() == kIODirectionOut);
  UInt32 ioLen = (io->nblks * SECTOR_SIZE);
  
  IOStorageCompletion completion = io->completion;
  IOReturn status = kIOReturnError;
  IOByteCount wrote = ioLen;
  
  if (isWrite)
  {
    //KDEBUG("%p write %d %d", io, io->block, io->nblks);

    status = kIOReturnSuccess;
  }
  else
  {
    //KDEBUG("%p read %d %d", io, io->block, io->nblks);

    if (mbuf_buffer(io->buffer, 0, m, sizeof(psan_get_response_t), ioLen))
      status = kIOReturnSuccess;
    else
      KINFO("mbuf_buffer failed");
  }
  
  if (status != kIOReturnSuccess)
    KINFO("%p FAILED", io);

  completeIO(io);
  io->addr->release();
  IODelete(io, outstanding_io, 1);
  
  mbuf_freem(m);
  
  IOStorage::complete(completion, status, wrote);
}
static long io(dbCommon* pr)
{
	devAiHeidND261Pvt *pPvt = (devAiHeidND261Pvt *)pr->dpvt;
	asynUser *pasynUser = pPvt->pasynUser;
	int status;

	DEBUG(2,"devAiHeidND261:io: entry%c\n", '.');


	if (!pr->pact) {
		/* record is calling us to start a write/read operation */
		pr->pact = 1;
		status = pasynManager->queueRequest(pasynUser, 0, 0);
		if (status != asynSuccess) status = -1;
		return(status);
	} else {
		/*
		 * asyn called devAiHeidND261Callback(), which did the write/read
		 * and processed the record.  Now the record is calling us for the
		 * result of the write/read operation.
		 */
		return(completeIO((dbCommon *)pr));
	}
}