In console input record queue, replace semaphore with a manual reset
event, so that we get correct behavior in synchronization handling.
diff --git a/dlls/kernel/console.c b/dlls/kernel/console.c
index 7b3eba1..ec0c1c0 100644
--- a/dlls/kernel/console.c
+++ b/dlls/kernel/console.c
@@ -191,7 +191,7 @@
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 @@
{
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 1c99f75..27a94cf 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -1036,7 +1036,6 @@
unsigned int access;
int inherit;
process_id_t pid;
- obj_handle_t wait_event;
};
struct alloc_console_reply
{
@@ -3583,6 +3582,6 @@
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 e549d5c..c30fc4b 100644
--- a/programs/wineconsole/wineconsole.c
+++ b/programs/wineconsole/wineconsole.c
@@ -535,7 +535,6 @@
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 @@
/* 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 @@
{
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 a0687c8..3a295db 100644
--- a/server/console.c
+++ b/server/console.c
@@ -203,7 +203,7 @@
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 @@
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 @@
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 @@
{
free( console->records );
console->records = NULL;
+ reset_event( console->event );
}
}
release_object( console );
@@ -943,7 +943,7 @@
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 @@
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 @@
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 @@
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 95bae25..2fdb9d5 100644
--- a/server/console.h
+++ b/server/console.h
@@ -42,7 +42,7 @@
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 c117b41..fb820a8 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -775,7 +775,6 @@
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 ae215d0..1e93cb1 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -997,8 +997,7 @@
{
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 )