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:
Eric Pouech 2003-06-23 03:37:14 +00:00 committed by Alexandre Julliard
parent 76f93fb6bc
commit a86a289420
7 changed files with 16 additions and 32 deletions

View File

@ -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;
}

View File

@ -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 */

View File

@ -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
@ -575,7 +573,6 @@ 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;
ret = !wine_server_call_err( req );
data->hConIn = (HANDLE)reply->handle_in;

View File

@ -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 );

View File

@ -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 */

View File

@ -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 */

View File

@ -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 )