server: Implement serial port read interval timeouts.
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
20b5cdb1d4
commit
bc0bf9e505
|
@ -62,12 +62,15 @@ static void serial_destroy(struct object *obj);
|
||||||
|
|
||||||
static enum server_fd_type serial_get_fd_type( struct fd *fd );
|
static enum server_fd_type serial_get_fd_type( struct fd *fd );
|
||||||
static void serial_queue_async( struct fd *fd, const async_data_t *data, int type, int count );
|
static void serial_queue_async( struct fd *fd, const async_data_t *data, int type, int count );
|
||||||
|
static void serial_reselect_async( struct fd *fd, struct async_queue *queue );
|
||||||
|
|
||||||
struct serial
|
struct serial
|
||||||
{
|
{
|
||||||
struct object obj;
|
struct object obj;
|
||||||
struct fd *fd;
|
struct fd *fd;
|
||||||
|
|
||||||
|
struct timeout_user *read_timer;
|
||||||
|
|
||||||
/* timeout values */
|
/* timeout values */
|
||||||
unsigned int readinterval;
|
unsigned int readinterval;
|
||||||
unsigned int readconst;
|
unsigned int readconst;
|
||||||
|
@ -115,7 +118,7 @@ static const struct fd_ops serial_fd_ops =
|
||||||
no_fd_flush, /* flush */
|
no_fd_flush, /* flush */
|
||||||
default_fd_ioctl, /* ioctl */
|
default_fd_ioctl, /* ioctl */
|
||||||
serial_queue_async, /* queue_async */
|
serial_queue_async, /* queue_async */
|
||||||
default_fd_reselect_async, /* reselect_async */
|
serial_reselect_async, /* reselect_async */
|
||||||
default_fd_cancel_async /* cancel_async */
|
default_fd_cancel_async /* cancel_async */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -134,6 +137,7 @@ struct object *create_serial( struct fd *fd )
|
||||||
|
|
||||||
if (!(serial = alloc_object( &serial_ops ))) return NULL;
|
if (!(serial = alloc_object( &serial_ops ))) return NULL;
|
||||||
|
|
||||||
|
serial->read_timer = NULL;
|
||||||
serial->readinterval = 0;
|
serial->readinterval = 0;
|
||||||
serial->readmult = 0;
|
serial->readmult = 0;
|
||||||
serial->readconst = 0;
|
serial->readconst = 0;
|
||||||
|
@ -157,6 +161,7 @@ static struct fd *serial_get_fd( struct object *obj )
|
||||||
static void serial_destroy( struct object *obj)
|
static void serial_destroy( struct object *obj)
|
||||||
{
|
{
|
||||||
struct serial *serial = (struct serial *)obj;
|
struct serial *serial = (struct serial *)obj;
|
||||||
|
if (serial->read_timer) remove_timeout_user( serial->read_timer );
|
||||||
release_object( serial->fd );
|
release_object( serial->fd );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -203,6 +208,34 @@ static void serial_queue_async( struct fd *fd, const async_data_t *data, int typ
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void serial_read_timeout( void *arg )
|
||||||
|
{
|
||||||
|
struct serial *serial = arg;
|
||||||
|
|
||||||
|
serial->read_timer = NULL;
|
||||||
|
fd_async_wake_up( serial->fd, ASYNC_TYPE_READ, STATUS_TIMEOUT );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void serial_reselect_async( struct fd *fd, struct async_queue *queue )
|
||||||
|
{
|
||||||
|
struct serial *serial = get_fd_user( fd );
|
||||||
|
|
||||||
|
if (serial->read_timer)
|
||||||
|
{
|
||||||
|
if (!(default_fd_get_poll_events( fd ) & POLLIN))
|
||||||
|
{
|
||||||
|
remove_timeout_user( serial->read_timer );
|
||||||
|
serial->read_timer = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (serial->readinterval && (default_fd_get_poll_events( fd ) & POLLIN))
|
||||||
|
{
|
||||||
|
serial->read_timer = add_timeout_user( (timeout_t)serial->readinterval * -10000,
|
||||||
|
serial_read_timeout, serial );
|
||||||
|
}
|
||||||
|
default_fd_reselect_async( fd, queue );
|
||||||
|
}
|
||||||
|
|
||||||
DECL_HANDLER(get_serial_info)
|
DECL_HANDLER(get_serial_info)
|
||||||
{
|
{
|
||||||
struct serial *serial;
|
struct serial *serial;
|
||||||
|
|
Loading…
Reference in New Issue