Jacek Caban : server: Use weak reference between console input and renderer objects.

Alexandre Julliard julliard at winehq.org
Wed Jul 29 15:47:00 CDT 2020


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Jul 29 12:37:01 2020 +0200

server: Use weak reference between console input and renderer objects.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 server/console.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/server/console.c b/server/console.c
index 2316b8eafb..7a10b611c5 100644
--- a/server/console.c
+++ b/server/console.c
@@ -131,6 +131,7 @@ struct console_input_events
 {
     struct object                  obj;         /* object header */
     struct fd                     *fd;          /* pseudo-fd for ioctls */
+    struct console_input          *console;     /* attached console */
     int                            num_alloc;   /* number of allocated events */
     int                            num_used;    /* number of actually used events */
     struct condrv_renderer_event  *events;
@@ -321,6 +322,7 @@ static void console_input_events_destroy( struct object *obj )
 {
     struct console_input_events *evts = (struct console_input_events *)obj;
     assert( obj->ops == &console_input_events_ops );
+    if (evts->console) evts->console->evt = NULL;
     free_async_queue( &evts->read_q );
     if (evts->fd) release_object( evts->fd );
     free( evts->events );
@@ -419,6 +421,7 @@ static struct object *create_console_input_events(void)
     struct console_input_events*	evt;
 
     if (!(evt = alloc_object( &console_input_events_ops ))) return NULL;
+    evt->console = NULL;
     evt->num_alloc = evt->num_used = 0;
     evt->events = NULL;
     init_async_queue( &evt->read_q );
@@ -1177,10 +1180,7 @@ static void console_input_destroy( struct object *obj )
 
     free_async_queue( &console_in->read_q );
     if (console_in->evt)
-    {
-        release_object( console_in->evt );
-        console_in->evt = NULL;
-    }
+        console_in->evt->console = NULL;
     if (console_in->event)
         release_object( console_in->event );
     if (console_in->fd)
@@ -1898,10 +1898,11 @@ static int console_input_events_ioctl( struct fd *fd, ioctl_code_t code, struct
                                                                     0, &console_input_ops );
             if (!console_input) return 0;
 
-            if (!console_input->evt)
+            if (!console_input->evt && !evts->console)
             {
-                console_input->evt = (struct console_input_events *)grab_object( evts );
+                console_input->evt = evts;
                 console_input->renderer = current;
+                evts->console = console_input;
             }
             else set_error( STATUS_INVALID_HANDLE );
 




More information about the wine-cvs mailing list