|
|
Experimental Physics and
| ||||||||||||||
|
|
attached is a test program that can reproduce the problem. Since it uses sysClkRateGet(), it compiles only on vxWorks. It calls pasynOctet->readRaw() once with pasynUser->timeout=1.1/sysClkRateGet() and once with pasynUser->timeout=1.0/sysClkRateGet(). In the first case, readRaw() returns asynTimeout, as expected. In the second case, readRaw() does not return. I print the thread ID before calling readRaw(). When I do 'tt' on the thread ID, readRaw() suddenly returns asynTimeout. Very strange. A Makefile is also attached. No records are required. Just set up a TCP server somewhere, call drvAsynIPPortConfigure and run: readTimeoutTest "portname". BTW: As long as readRaw() hangs, I could not open a channel access connection to records on that IOC and the dbior command hangs when trying to report drvAsyn. I use asynDriver version 4-5, EPICS base R3.14.8, vxWorks 5.5 on MVME2300 (ppc604). Dirk Dirk Zimoch wrote: Hi Marty, Jeff et al
#include <asynDriver.h>
#include <asynOctet.h>
#include <epicsThread.h>
#include <sysLib.h>
static char* asynStatusStr[] = {"Success", "Timeout", "Overflow", "Error"};
void readTimeoutTestHandleRequest(asynUser* pasynUser)
{
asynInterface* pasynInterface;
asynOctet* pasynOctet;
void* pvtOctet;
char buffer[1];
asynStatus status;
size_t received;
int eomReason;
printf ("readTimeoutTestHandleRequest, thread = %s %p\n",
epicsThreadGetNameSelf(), epicsThreadGetIdSelf());
pasynInterface = pasynUser->userPvt;
pasynOctet = pasynInterface->pinterface;
pvtOctet = pasynInterface->drvPvt;
pasynUser->timeout = 1.1 / sysClkRateGet();
printf ("calling pasynOctet->readRaw() with %g seconds timeout\n",
pasynUser->timeout);
status = pasynOctet->readRaw(pvtOctet, pasynUser, buffer, 1,
&received, &eomReason);
printf ("pasynOctet->readRaw() returned status %s\n",
asynStatusStr[status]);
pasynUser->timeout = 1.0 / sysClkRateGet();
printf ("calling pasynOctet->readRaw() with %g seconds timeout\n",
pasynUser->timeout);
status = pasynOctet->readRaw(pvtOctet, pasynUser, buffer, 1,
&received, &eomReason);
printf ("pasynOctet->readRaw() returned status %s\n",
asynStatusStr[status]);
}
void readTimeoutTestTimeout(asynUser* pasynUser)
{
printf ("pasynManager->queueRequest() timed out\n");
}
int readTimeoutTest(char * port, int addr)
{
asynStatus status;
asynUser* pasynUser;
asynInterface* pasynInterface;
pasynUser = pasynManager->createAsynUser(readTimeoutTestHandleRequest,
readTimeoutTestTimeout);
if (pasynManager->connectDevice(pasynUser, port, addr) !=
asynSuccess)
{
printf ("No such device: %s,%d\n", port, addr);
return ERROR;
}
pasynInterface = pasynManager->findInterface(pasynUser,
asynOctetType, TRUE);
if (!pasynInterface)
{
printf ("No asynOctet interface: %s,%d\n", port, addr);
return ERROR;
}
pasynUser->userPvt = pasynInterface;
status = pasynManager->queueRequest(pasynUser,
asynQueuePriorityHigh, 10.0);
if (status != asynSuccess)
{
printf ("pasynManager->queueRequest() failed: %s\n",
pasynUser->errorMessage);
return ERROR;
}
return OK;
}
TOP=../.. include $(TOP)/configure/CONFIG HOST_OPT = NO PROD_vxWorks = asynApp DBD = asynApp.dbd asynApp_DBD += base.dbd PROD_SRCS += asynApp_registerRecordDeviceDriver.cpp PROD_SRCS += readTimeoutTest.c asynApp_DBD += drvAsynIPPort.dbd PROD_LIBS += asyn PROD_LIBS += $(EPICS_BASE_IOC_LIBS) include $(TOP)/configure/RULES
| ||||||||||||||
| ANJ, 02 Sep 2010 |
·
Home
·
News
·
About
·
Talk
·
Base
·
Modules
·
Extensions
·
· Distributions · Download · Documents · Links · Licensing · |