diff --git a/src/AsynDriverInterface.cc b/src/AsynDriverInterface.cc index 04a32a3..2261099 100644 --- a/src/AsynDriverInterface.cc +++ b/src/AsynDriverInterface.cc @@ -502,6 +502,26 @@ connectToAsynPort() clientName(), pasynUser->errorMessage); return false; } + // Is it really connected? + if (connected && !pasynGpib) + { + size_t received; + int eomReason; + char buffer[8]; + + pasynUser->timeout = 0.0; + status = pasynOctet->read(pvtOctet, pasynUser, + buffer, 0, &received, &eomReason); + debug("AsynDriverInterface::connectToAsynPort(%s): " + "read(..., 0, ...) [timeout=%f seconds] = %s\n", + clientName(), pasynUser->timeout, + asynStatusStr[status]); + pasynManager->isConnected(pasynUser, &connected); + debug("AsynDriverInterface::connectToAsynPort(%s): " + "device was %sconnected!\n", + clientName(),connected?"":"dis"); + } + debug("AsynDriverInterface::connectToAsynPort(%s) is %s connected\n", clientName(), connected ? "already" : "not yet"); if (!connected) @@ -622,6 +642,24 @@ writeHandler() } status = pasynOctet->write(pvtOctet, pasynUser, outputBuffer, outputSize, &written); + debug("AsynDriverInterface::writeHandler(%s): " + "write(..., outputSize=%d, written=%d) [timeout=%f seconds] = %s\n", + clientName(), outputSize, written, pasynUser->timeout, + asynStatusStr[status]); + + // Up to asyn 4.17 I can't see when the server has disconnected. Why? + int connected; + pasynManager->isConnected(pasynUser, &connected); + debug("AsynDriverInterface::writeHandler(%s): " + "device is %sconnected\n", + clientName(),connected?"":"dis"); + if (!connected) { + error("%s: connection closed in write\n", + clientName()); + writeCallback(StreamIoFault); + return; + } + if (oldeoslen >= 0) // restore asyn terminator { pasynOctet->setOutputEos(pvtOctet, pasynUser, @@ -812,6 +850,7 @@ readHandler() int eomReason; asynStatus status; long readMore; + int connected; while (1) { @@ -828,6 +867,16 @@ readHandler() clientName(), bytesToRead, pasynUser->timeout, asynStatusStr[status]); } + pasynManager->isConnected(pasynUser, &connected); + debug("AsynDriverInterface::readHandler(%s): " + "device is %sconnected\n", + clientName(),connected?"":"dis"); + if (!connected) { + error("%s: connection closed in read\n", + clientName()); + readCallback(StreamIoFault); + return; + } // pasynOctet->read() has already cut off terminator. if (status == asynTimeout && @@ -959,18 +1008,18 @@ readHandler() case asynDisconnected: error("%s: asynDisconnected in read: %s\n", clientName(), pasynUser->errorMessage); - writeCallback(StreamIoFault); + readCallback(StreamIoFault); return; case asynDisabled: error("%s: asynDisconnected in read: %s\n", clientName(), pasynUser->errorMessage); - writeCallback(StreamIoFault); + readCallback(StreamIoFault); return; #endif default: error("%s: unknown asyn error in read: %s\n", clientName(), pasynUser->errorMessage); - writeCallback(StreamIoFault); + readCallback(StreamIoFault); return; } if (!readMore) break; diff --git a/src/StreamCore.cc b/src/StreamCore.cc index 290236b..c6b322a 100644 --- a/src/StreamCore.cc +++ b/src/StreamCore.cc @@ -825,10 +825,16 @@ lockCallback(StreamIoStatus status) } flags &= ~LockPending; flags |= BusOwner; - if (status != StreamIoSuccess) + switch (status) { - finishProtocol(LockTimeout); - return; + case StreamIoSuccess: + break; + case StreamIoTimeout: + finishProtocol(LockTimeout); + return; + default: + finishProtocol(Fault); + return; } flags |= WritePending; if (!busWriteRequest(outputLine(), outputLine.length(), writeTimeout))