Module: wine Branch: master Commit: e7c9a0e1511641961a69babe2ab7aca75c636672 URL: https://source.winehq.org/git/wine.git/?a=commit;h=e7c9a0e1511641961a69babe2...
Author: Jacek Caban jacek@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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 );