In console input record queue, replace semaphore with a manual reset
event, so that we get correct behavior in synchronization handling.
This commit is contained in:
parent
76f93fb6bc
commit
a86a289420
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 )
|
||||
|
|
Loading…
Reference in New Issue