more work on flush code.
This commit is contained in:
@@ -23,8 +23,9 @@
|
||||
|
||||
|
||||
|
||||
#define AQH_TTYOBJECT_BAUDRATE B19200
|
||||
|
||||
#define AQH_TTYOBJECT_BAUDRATE B19200
|
||||
#define AQH_TTYOBJECT_FLUSH_LIMIT 1000
|
||||
#define AQH_TTYOBJECT_FLUSH_QUIET_TIME_MS 200
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------
|
||||
@@ -38,7 +39,6 @@ static int _cbFlush(AQH_OBJECT *o);
|
||||
static int _getAttn(int fd);
|
||||
static int _setAttn(int fd, int val);
|
||||
static int _fdSetBlocking(int sk, int fl);
|
||||
static int _fdFlush(int fd);
|
||||
//static int _msleep(long int msec);
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ AQH_OBJECT *AQH_TtyObject_new(AQH_EVENT_LOOP *eventLoop, int fd, int fdMode)
|
||||
AQH_FdObject_SetEndMsgFn(o, _cbEndMsg);
|
||||
AQH_FdObject_SetFlushFn(o, _cbFlush);
|
||||
|
||||
_fdFlush(fd);
|
||||
_cbFlush(o);
|
||||
|
||||
return o;
|
||||
}
|
||||
@@ -116,57 +116,56 @@ void _cbEndMsg(AQH_OBJECT *o)
|
||||
int _cbFlush(AQH_OBJECT *o)
|
||||
{
|
||||
int fd;
|
||||
|
||||
fd=AQH_FdObject_GetFd(o);
|
||||
return (fd>=0)?_fdFlush(fd):0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int _fdFlush(int fd)
|
||||
{
|
||||
#if 0
|
||||
int rv;
|
||||
|
||||
usleep(1000);
|
||||
rv=ioctl(fd, TCFLSH, 0); // flush receive
|
||||
if (rv!=0) {
|
||||
if (errno!=EINTR && errno!=EWOULDBLOCK && errno!=EAGAIN) {
|
||||
DBG_ERROR(AQH_LOGDOMAIN, "Error on ioctl: %s (%d)", strerror(errno), errno);
|
||||
return GWEN_ERROR_IO;
|
||||
}
|
||||
}
|
||||
#else
|
||||
int rv;
|
||||
int i;
|
||||
|
||||
DBG_ERROR(AQH_LOGDOMAIN, "Flush");
|
||||
usleep(1000);
|
||||
rv=ioctl(fd, TCFLSH, 2); // flush receive
|
||||
if (rv!=0) {
|
||||
if (errno!=EINTR && errno!=EWOULDBLOCK && errno!=EAGAIN) {
|
||||
DBG_ERROR(AQH_LOGDOMAIN, "Error on ioctl: %s (%d)", strerror(errno), errno);
|
||||
fd=AQH_FdObject_GetFd(o);
|
||||
if (fd>=0) {
|
||||
usleep(1000);
|
||||
rv=ioctl(fd, TCFLSH, 2); // flush receive
|
||||
if (rv!=0) {
|
||||
if (errno!=EINTR && errno!=EWOULDBLOCK && errno!=EAGAIN) {
|
||||
DBG_ERROR(AQH_LOGDOMAIN, "Error on ioctl: %s (%d)", strerror(errno), errno);
|
||||
return GWEN_ERROR_IO;
|
||||
}
|
||||
}
|
||||
|
||||
for (i=0;i<AQH_TTYOBJECT_FLUSH_LIMIT;i++) {
|
||||
uint8_t buffer[32];
|
||||
|
||||
/* wait for timeout */
|
||||
rv=AQH_FdObject_WaitForActivity(o, AQH_TTYOBJECT_FLUSH_QUIET_TIME_MS);
|
||||
if (rv==0) {
|
||||
DBG_ERROR(AQH_LOGDOMAIN, "No data for some time, assuming flushed");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* data available, read */
|
||||
rv=read(fd, buffer, sizeof(buffer));
|
||||
if (rv==0) {
|
||||
DBG_ERROR(AQH_LOGDOMAIN, "EOF met [%d]", i);
|
||||
return GWEN_ERROR_EOF;
|
||||
}
|
||||
else if (rv<0) {
|
||||
if (errno!=EINTR && errno!=EWOULDBLOCK && errno!=EAGAIN) {
|
||||
DBG_ERROR(AQH_LOGDOMAIN, "Error on read: %s (%d) [%d]", strerror(errno), errno, i);
|
||||
return GWEN_ERROR_IO;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
else {
|
||||
DBG_ERROR(AQH_LOGDOMAIN, "Flushed %d bytes [%d]", rv, i);
|
||||
}
|
||||
}
|
||||
if (i>=AQH_TTYOBJECT_FLUSH_LIMIT) {
|
||||
DBG_ERROR(AQH_LOGDOMAIN, "Still data after reading for some time, assuming bad connection");
|
||||
AQH_FdObject_Abort(o);
|
||||
return GWEN_ERROR_IO;
|
||||
}
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
uint8_t buffer[32];
|
||||
|
||||
rv=read(fd, buffer, sizeof(buffer));
|
||||
if (rv==0) {
|
||||
DBG_ERROR(AQH_LOGDOMAIN, "EOF met");
|
||||
return GWEN_ERROR_EOF;
|
||||
}
|
||||
else if (rv<0) {
|
||||
if (errno!=EINTR && errno!=EWOULDBLOCK && errno!=EAGAIN) {
|
||||
DBG_ERROR(AQH_LOGDOMAIN, "Error on read: %s (%d)", strerror(errno), errno);
|
||||
return GWEN_ERROR_IO;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user