diff --git a/dlls/kernel/console.c b/dlls/kernel/console.c index 7b3eba1266c..ec0c1c06e09 100644 --- a/dlls/kernel/console.c +++ b/dlls/kernel/console.c @@ -191,7 +191,7 @@ BOOL WINAPI WriteConsoleInputW( HANDLE handle, const INPUT_RECORD *buffer, DWORD count, LPDWORD written ) { BOOL ret; - DWORD w; + TRACE("(%p,%p,%ld,%p)\n", handle, buffer, count, written); if (written) *written = 0; @@ -199,14 +199,11 @@ BOOL WINAPI WriteConsoleInputW( HANDLE handle, const INPUT_RECORD *buffer, { req->handle = console_handle_unmap(handle); wine_server_add_data( req, buffer, count * sizeof(INPUT_RECORD) ); - if ((ret = !wine_server_call_err( req ))) w = reply->written; + if ((ret = !wine_server_call_err( req )) && written) + *written = reply->written; } SERVER_END_REQ; - if (ret) - { - ReleaseSemaphore( GetConsoleInputWaitHandle(), w, NULL ); - if (written) *written = w; - } + return ret; } diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 1c99f758bf8..27a94cfff1b 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -1036,7 +1036,6 @@ struct alloc_console_request unsigned int access; int inherit; process_id_t pid; - obj_handle_t wait_event; }; struct alloc_console_reply { @@ -3583,6 +3582,6 @@ union generic_reply struct get_next_hook_reply get_next_hook_reply; }; -#define SERVER_PROTOCOL_VERSION 110 +#define SERVER_PROTOCOL_VERSION 111 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/programs/wineconsole/wineconsole.c b/programs/wineconsole/wineconsole.c index e549d5ccb06..c30fc4bad49 100644 --- a/programs/wineconsole/wineconsole.c +++ b/programs/wineconsole/wineconsole.c @@ -535,7 +535,6 @@ static struct inner_data* WINECON_Init(HINSTANCE hInst, DWORD pid, LPCWSTR appna DWORD ret; struct config_data cfg; STARTUPINFOW si; - HANDLE sem; data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*data)); if (!data) return 0; @@ -564,7 +563,6 @@ static struct inner_data* WINECON_Init(HINSTANCE hInst, DWORD pid, LPCWSTR appna /* should always be defined */ } - sem = CreateSemaphore(NULL, 0, 65536, NULL); /* the handles here are created without the whistles and bells required by console * (mainly because wineconsole doesn't need it) * - they are not inheritable @@ -574,8 +572,7 @@ static struct inner_data* WINECON_Init(HINSTANCE hInst, DWORD pid, LPCWSTR appna { req->access = GENERIC_READ | GENERIC_WRITE; req->inherit = FALSE; - req->pid = pid; - req->wait_event = sem; + req->pid = pid; ret = !wine_server_call_err( req ); data->hConIn = (HANDLE)reply->handle_in; diff --git a/server/console.c b/server/console.c index a0687c8bac2..3a295db36e1 100644 --- a/server/console.c +++ b/server/console.c @@ -203,7 +203,7 @@ static struct console_input_events *create_console_input_events(void) return evt; } -static struct object *create_console_input( struct thread* renderer, struct object* wait_obj ) +static struct object *create_console_input( struct thread* renderer ) { struct console_input *console_input; @@ -222,7 +222,7 @@ static struct object *create_console_input( struct thread* renderer, struct obje console_input->history_index = 0; console_input->history_mode = 0; console_input->edition_mode = 0; - console_input->wait_obj = wait_obj; + console_input->event = create_event( NULL, 0, 1, 0 ); if (!console_input->history || !console_input->evt) { @@ -514,9 +514,8 @@ static int write_console_input( struct console_input* console, int count, else i++; } } + if (!console->recnum && count) set_event( console->event ); console->recnum += count; - /* wake up all waiters */ - wake_up( &console->obj, 0 ); return count; } @@ -555,6 +554,7 @@ static int read_console_input( obj_handle_t handle, int count, int flush ) { free( console->records ); console->records = NULL; + reset_event( console->event ); } } release_object( console ); @@ -943,7 +943,7 @@ static void console_input_destroy( struct object *obj ) release_object( console_in->evt ); console_in->evt = NULL; - release_object( console_in->wait_obj ); + release_object( console_in->event ); for (i = 0; i < console_in->history_size; i++) if (console_in->history[i]) free( console_in->history[i] ); @@ -1209,7 +1209,6 @@ DECL_HANDLER(alloc_console) struct process *process; struct process *renderer = current->process; struct console_input *console; - struct object *wait_event; process = (req->pid) ? get_process_from_id( req->pid ) : (struct process *)grab_object( renderer->parent ); @@ -1222,13 +1221,7 @@ DECL_HANDLER(alloc_console) set_error( STATUS_ACCESS_DENIED ); goto the_end; } - wait_event = get_handle_obj( renderer, req->wait_event, 0, NULL); - if (!wait_event) - { - set_error( STATUS_INVALID_PARAMETER ); - goto the_end; - } - if ((console = (struct console_input*)create_console_input( current, wait_event ))) + if ((console = (struct console_input*)create_console_input( current ))) { if ((in = alloc_handle( renderer, console, req->access, req->inherit ))) { @@ -1531,8 +1524,8 @@ DECL_HANDLER(get_console_wait_event) if (console) { - reply->handle = alloc_handle( current->process, console->wait_obj, - SEMAPHORE_ALL_ACCESS, FALSE); + reply->handle = alloc_handle( current->process, console->event, + EVENT_ALL_ACCESS, FALSE); release_object( console ); } else set_error( STATUS_INVALID_PARAMETER ); diff --git a/server/console.h b/server/console.h index 95bae25fbe4..2fdb9d56229 100644 --- a/server/console.h +++ b/server/console.h @@ -42,7 +42,7 @@ struct console_input int history_index; /* number of used entries in history array */ int history_mode; /* mode of history (non zero means remove doubled strings */ int edition_mode; /* index to edition mode flavors */ - struct object *wait_obj; /* object to wait on for input queue */ + struct event *event; /* event to wait on for input queue */ }; /* console functions */ diff --git a/server/protocol.def b/server/protocol.def index c117b413b88..fb820a8a4b5 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -775,7 +775,6 @@ enum fd_type unsigned int access; /* wanted access rights */ int inherit; /* inherit flag */ process_id_t pid; /* pid of process which shall be attached to the console */ - obj_handle_t wait_event; /* semaphore for number of active input events */ @REPLY obj_handle_t handle_in; /* handle to console input */ obj_handle_t event; /* handle to renderer events change notification */ diff --git a/server/trace.c b/server/trace.c index ae215d0c560..1e93cb1c061 100644 --- a/server/trace.c +++ b/server/trace.c @@ -997,8 +997,7 @@ static void dump_alloc_console_request( const struct alloc_console_request *req { fprintf( stderr, " access=%08x,", req->access ); fprintf( stderr, " inherit=%d,", req->inherit ); - fprintf( stderr, " pid=%04x,", req->pid ); - fprintf( stderr, " wait_event=%p", req->wait_event ); + fprintf( stderr, " pid=%04x", req->pid ); } static void dump_alloc_console_reply( const struct alloc_console_reply *req )