From: Elizabeth Figura zfigura@codeweavers.com
Wait on the handle directly instead of delegating to the console's wait queue. --- dlls/kernel32/tests/console.c | 8 ++++---- server/console.c | 36 +++++++++++++++++++---------------- 2 files changed, 24 insertions(+), 20 deletions(-)
diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c index b879b7dcd80..6126a1ffb6d 100644 --- a/dlls/kernel32/tests/console.c +++ b/dlls/kernel32/tests/console.c @@ -4346,7 +4346,7 @@ static void test_FreeConsole(HANDLE input, HANDLE orig_output) CloseHandle(orig_output);
ret = WaitForSingleObject(output, 0); - todo_wine ok(!ret, "got %d\n", ret); + ok(!ret, "got %d\n", ret); ret = WaitForSingleObject(unbound_output, 0); todo_wine ok(ret == WAIT_TIMEOUT, "got %d\n", ret); ret = WaitForSingleObject(unbound_input, 0); @@ -4365,7 +4365,7 @@ static void test_FreeConsole(HANDLE input, HANDLE orig_output) ok(ret, "got error %lu\n", GetLastError());
ret = WaitForSingleObject(output, 0); - todo_wine ok(!ret, "got %d\n", ret); + ok(!ret, "got %d\n", ret); ret = WaitForSingleObject(unbound_output, 0); todo_wine ok(!ret, "got %d\n", ret); ret = WaitForSingleObject(unbound_input, 0); @@ -4384,7 +4384,7 @@ static void test_FreeConsole(HANDLE input, HANDLE orig_output) check_mouse_event(unbound_input);
ret = WaitForSingleObject(output, 0); - todo_wine ok(!ret, "got %d\n", ret); + ok(!ret, "got %d\n", ret); ret = WaitForSingleObject(unbound_output, 0); todo_wine ok(!ret, "got %d\n", ret); ret = WaitForSingleObject(unbound_input, 0); @@ -4398,7 +4398,7 @@ static void test_FreeConsole(HANDLE input, HANDLE orig_output) CloseHandle(input);
ret = WaitForSingleObject(output, 0); - todo_wine ok(!ret, "got %d\n", ret); + ok(!ret, "got %d\n", ret); ret = WaitForSingleObject(unbound_output, 0); todo_wine ok(!ret, "got %d\n", ret); ret = WaitForSingleObject(unbound_input, 0); diff --git a/server/console.c b/server/console.c index 16093fed4bc..8d495a31a71 100644 --- a/server/console.c +++ b/server/console.c @@ -214,7 +214,7 @@ struct screen_buffer
static void screen_buffer_dump( struct object *obj, int verbose ); static void screen_buffer_destroy( struct object *obj ); -static int screen_buffer_add_queue( struct object *obj, struct wait_queue_entry *entry ); +static int screen_buffer_signaled( struct object *obj, struct wait_queue_entry *entry ); static struct fd *screen_buffer_get_fd( struct object *obj ); static struct object *screen_buffer_open_file( struct object *obj, unsigned int access, unsigned int sharing, unsigned int options ); @@ -224,10 +224,10 @@ static const struct object_ops screen_buffer_ops = sizeof(struct screen_buffer), /* size */ &file_type, /* type */ screen_buffer_dump, /* dump */ - screen_buffer_add_queue, /* add_queue */ - NULL, /* remove_queue */ - NULL, /* signaled */ - NULL, /* satisfied */ + add_queue, /* add_queue */ + remove_queue, /* remove_queue */ + screen_buffer_signaled, /* signaled */ + no_satisfied, /* satisfied */ no_signal, /* signal */ screen_buffer_get_fd, /* get_fd */ default_map_access, /* map_access */ @@ -839,21 +839,18 @@ static void screen_buffer_destroy( struct object *obj ) free_async_queue( &screen_buffer->ioctl_q ); }
-static struct object *screen_buffer_open_file( struct object *obj, unsigned int access, - unsigned int sharing, unsigned int options ) +static int screen_buffer_signaled( struct object *obj, struct wait_queue_entry *entry ) { - return grab_object( obj ); + struct screen_buffer *screen_buffer = (struct screen_buffer *)obj; + assert( obj->ops == &screen_buffer_ops ); + if (!screen_buffer->input) return 1; + return screen_buffer->input->signaled; }
-static int screen_buffer_add_queue( struct object *obj, struct wait_queue_entry *entry ) +static struct object *screen_buffer_open_file( struct object *obj, unsigned int access, + unsigned int sharing, unsigned int options ) { - struct screen_buffer *screen_buffer = (struct screen_buffer*)obj; - if (!screen_buffer->input) - { - set_error( STATUS_ACCESS_DENIED ); - return 0; - } - return console_add_queue( &screen_buffer->input->obj, entry ); + return grab_object( obj ); }
static struct fd *screen_buffer_get_fd( struct object *obj ) @@ -1560,8 +1557,15 @@ DECL_HANDLER(get_next_console_request) if (!req->signal) server->console->signaled = 0; else if (!server->console->signaled) { + struct screen_buffer *screen_buffer; + server->console->signaled = 1; wake_up( &server->console->obj, 0 ); + LIST_FOR_EACH_ENTRY( screen_buffer, &screen_buffer_list, struct screen_buffer, entry ) + { + if (screen_buffer->input == server->console) + wake_up( &screen_buffer->obj, 0 ); + } }
if (req->read)