Alexandre Julliard : server: Store the SERIAL_TIMEOUTS structure directly in the object.

Alexandre Julliard julliard at winehq.org
Fri May 5 15:05:58 CDT 2017


Module: wine
Branch: master
Commit: c43f13c3e4ddb538f9be27aca867de2b143283b5
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c43f13c3e4ddb538f9be27aca867de2b143283b5

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri May  5 14:10:44 2017 +0200

server: Store the SERIAL_TIMEOUTS structure directly in the object.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 server/serial.c | 55 ++++++++++++++++---------------------------------------
 1 file changed, 16 insertions(+), 39 deletions(-)

diff --git a/server/serial.c b/server/serial.c
index 8519473..fb29288 100644
--- a/server/serial.c
+++ b/server/serial.c
@@ -73,14 +73,7 @@ struct serial
     struct fd          *fd;
 
     struct timeout_user *read_timer;
-
-    /* timeout values */
-    unsigned int        readinterval;
-    unsigned int        readconst;
-    unsigned int        readmult;
-    unsigned int        writeconst;
-    unsigned int        writemult;
-
+    SERIAL_TIMEOUTS     timeouts;
     unsigned int        eventmask;
     unsigned int        generation; /* event mask change counter */
     unsigned int        pending_write : 1;
@@ -142,15 +135,11 @@ struct object *create_serial( struct fd *fd )
     if (!(serial = alloc_object( &serial_ops ))) return NULL;
 
     serial->read_timer   = NULL;
-    serial->readinterval = 0;
-    serial->readmult     = 0;
-    serial->readconst    = 0;
-    serial->writemult    = 0;
-    serial->writeconst   = 0;
     serial->eventmask    = 0;
     serial->generation   = 0;
     serial->pending_write = 0;
     serial->pending_wait = 0;
+    memset( &serial->timeouts, 0, sizeof(serial->timeouts) );
     serial->fd = (struct fd *)grab_object( fd );
     set_fd_user( fd, &serial_fd_ops, &serial->obj );
     return &serial->obj;
@@ -193,31 +182,17 @@ static obj_handle_t serial_ioctl( struct fd *fd, ioctl_code_t code, struct async
     switch (code)
     {
     case IOCTL_SERIAL_GET_TIMEOUTS:
-        if (get_reply_max_size() >= sizeof(SERIAL_TIMEOUTS))
-        {
-            SERIAL_TIMEOUTS *timeouts = set_reply_data_size( sizeof(*timeouts ));
-
-            timeouts->ReadIntervalTimeout = serial->readinterval;
-            timeouts->ReadTotalTimeoutConstant = serial->readconst;
-            timeouts->ReadTotalTimeoutMultiplier = serial->readmult;
-            timeouts->WriteTotalTimeoutConstant = serial->writeconst;
-            timeouts->WriteTotalTimeoutMultiplier = serial->writemult;
-        }
-        else set_error( STATUS_BUFFER_TOO_SMALL );
+        if (get_reply_max_size() >= sizeof(serial->timeouts))
+            set_reply_data( &serial->timeouts, sizeof(serial->timeouts ));
+        else
+            set_error( STATUS_BUFFER_TOO_SMALL );
         return 0;
 
     case IOCTL_SERIAL_SET_TIMEOUTS:
-        if (get_req_data_size() >= sizeof(SERIAL_TIMEOUTS))
-        {
-            const SERIAL_TIMEOUTS *timeouts = get_req_data();
-
-            serial->readinterval = timeouts->ReadIntervalTimeout;
-            serial->readconst    = timeouts->ReadTotalTimeoutConstant;
-            serial->readmult     = timeouts->ReadTotalTimeoutMultiplier;
-            serial->writeconst   = timeouts->WriteTotalTimeoutConstant;
-            serial->writemult    = timeouts->WriteTotalTimeoutMultiplier;
-        }
-        else set_error( STATUS_BUFFER_TOO_SMALL );
+        if (get_req_data_size() >= sizeof(serial->timeouts))
+            memcpy( &serial->timeouts, get_req_data(), sizeof(serial->timeouts) );
+        else
+            set_error( STATUS_BUFFER_TOO_SMALL );
         return 0;
 
     case IOCTL_SERIAL_GET_WAIT_MASK:
@@ -253,10 +228,12 @@ static void serial_queue_async( struct fd *fd, struct async *async, int type, in
     switch (type)
     {
     case ASYNC_TYPE_READ:
-        timeout = serial->readconst + (timeout_t)serial->readmult*count;
+        timeout = serial->timeouts.ReadTotalTimeoutConstant +
+            (timeout_t)serial->timeouts.ReadTotalTimeoutMultiplier * count;
         break;
     case ASYNC_TYPE_WRITE:
-        timeout = serial->writeconst + (timeout_t)serial->writemult*count;
+        timeout = serial->timeouts.WriteTotalTimeoutConstant +
+            (timeout_t)serial->timeouts.WriteTotalTimeoutMultiplier * count;
         break;
     }
 
@@ -287,9 +264,9 @@ static void serial_reselect_async( struct fd *fd, struct async_queue *queue )
             serial->read_timer = NULL;
         }
     }
-    else if (serial->readinterval && (default_fd_get_poll_events( fd ) & POLLIN))
+    else if (serial->timeouts.ReadIntervalTimeout && (default_fd_get_poll_events( fd ) & POLLIN))
     {
-        serial->read_timer = add_timeout_user( (timeout_t)serial->readinterval * -10000,
+        serial->read_timer = add_timeout_user( (timeout_t)serial->timeouts.ReadIntervalTimeout * -10000,
                                                serial_read_timeout, serial );
     }
     default_fd_reselect_async( fd, queue );




More information about the wine-cvs mailing list