You've already forked wine-staging
mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-09-12 18:50:20 -07:00
Rebase against 5e75310837e5ec77ebc361d689ea3279fa49ebac.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
From f55b5ebadbc078201d81f5f53ad248be58bfac13 Mon Sep 17 00:00:00 2001
|
||||
From 454430de5505b16af9d90ee99d5fa8a034853d2b Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Fri, 15 Jun 2018 14:12:22 -0500
|
||||
Subject: [PATCH] server, ntdll: Implement alertable waits.
|
||||
@@ -16,7 +16,7 @@ We do this quite simply by waiting on an extra eventfd descriptor, which the ser
|
||||
8 files changed, 121 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/esync.c b/dlls/ntdll/esync.c
|
||||
index 119a36f36..8a41f6961 100644
|
||||
index 119a36f3611..5db7adcace7 100644
|
||||
--- a/dlls/ntdll/esync.c
|
||||
+++ b/dlls/ntdll/esync.c
|
||||
@@ -684,19 +684,43 @@ static int do_poll( struct pollfd *fds, nfds_t nfds, ULONGLONG *end )
|
||||
@@ -184,8 +184,8 @@ index 119a36f36..8a41f6961 100644
|
||||
+ TRACE("Woken up by user APC.\n");
|
||||
+
|
||||
+ /* We have to make a server call anyway to get the APC to execute, so just
|
||||
+ * delegate down to server_select(). */
|
||||
+ ret = server_select( NULL, 0, SELECT_INTERRUPTIBLE | SELECT_ALERTABLE, &zero );
|
||||
+ * delegate down to server_wait(). */
|
||||
+ ret = server_wait( NULL, 0, SELECT_INTERRUPTIBLE | SELECT_ALERTABLE, &zero );
|
||||
+
|
||||
+ /* This can happen if we received a system APC, and the APC fd was woken up
|
||||
+ * before we got SIGUSR1. poll() doesn't return EINTR in that case. The
|
||||
@@ -196,10 +196,10 @@ index 119a36f36..8a41f6961 100644
|
||||
|
||||
NTSTATUS esync_signal_and_wait( HANDLE signal, HANDLE wait, BOOLEAN alertable,
|
||||
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
|
||||
index 31714f905..009dd33ed 100644
|
||||
index 009cfe73330..d7f88f7f8f0 100644
|
||||
--- a/dlls/ntdll/ntdll_misc.h
|
||||
+++ b/dlls/ntdll/ntdll_misc.h
|
||||
@@ -239,6 +239,7 @@ struct ntdll_thread_data
|
||||
@@ -261,6 +261,7 @@ struct ntdll_thread_data
|
||||
{
|
||||
struct debug_info *debug_info; /* info for debugstr functions */
|
||||
int esync_queue_fd;/* fd to wait on for driver events */
|
||||
@@ -208,10 +208,10 @@ index 31714f905..009dd33ed 100644
|
||||
int request_fd; /* fd for sending server requests */
|
||||
int reply_fd; /* fd for receiving server replies */
|
||||
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
|
||||
index 95c175aa7..711505242 100644
|
||||
index 97e6d816bdd..129f42b3e01 100644
|
||||
--- a/dlls/ntdll/thread.c
|
||||
+++ b/dlls/ntdll/thread.c
|
||||
@@ -328,6 +328,7 @@ void thread_init(void)
|
||||
@@ -357,6 +357,7 @@ TEB *thread_init(void)
|
||||
thread_data->wait_fd[0] = -1;
|
||||
thread_data->wait_fd[1] = -1;
|
||||
thread_data->esync_queue_fd = -1;
|
||||
@@ -219,7 +219,7 @@ index 95c175aa7..711505242 100644
|
||||
|
||||
signal_init_thread( teb );
|
||||
virtual_init_threading();
|
||||
@@ -706,6 +707,7 @@ NTSTATUS WINAPI NtCreateThreadEx( HANDLE *handle_ptr, ACCESS_MASK access, OBJECT
|
||||
@@ -757,6 +758,7 @@ NTSTATUS WINAPI NtCreateThreadEx( HANDLE *handle_ptr, ACCESS_MASK access, OBJECT
|
||||
thread_data->wait_fd[1] = -1;
|
||||
thread_data->start_stack = (char *)teb->Tib.StackBase;
|
||||
thread_data->esync_queue_fd = -1;
|
||||
@@ -228,10 +228,10 @@ index 95c175aa7..711505242 100644
|
||||
pthread_attr_init( &pthread_attr );
|
||||
pthread_attr_setstack( &pthread_attr, teb->DeallocationStack,
|
||||
diff --git a/server/esync.c b/server/esync.c
|
||||
index 5ef4dd282..4fb42e6f9 100644
|
||||
index c68b2bc1fc0..a3cd1a8decf 100644
|
||||
--- a/server/esync.c
|
||||
+++ b/server/esync.c
|
||||
@@ -247,19 +247,25 @@ int esync_create_fd( int initval, int flags )
|
||||
@@ -246,19 +246,25 @@ int esync_create_fd( int initval, int flags )
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -261,7 +261,7 @@ index 5ef4dd282..4fb42e6f9 100644
|
||||
}
|
||||
}
|
||||
|
||||
@@ -385,3 +391,9 @@ DECL_HANDLER(get_esync_fd)
|
||||
@@ -384,3 +390,9 @@ DECL_HANDLER(get_esync_fd)
|
||||
|
||||
release_object( obj );
|
||||
}
|
||||
@@ -272,7 +272,7 @@ index 5ef4dd282..4fb42e6f9 100644
|
||||
+ send_client_fd( current->process, current->esync_apc_fd, current->id );
|
||||
+}
|
||||
diff --git a/server/esync.h b/server/esync.h
|
||||
index aeb58c546..cea025d93 100644
|
||||
index aeb58c5469c..cea025d9308 100644
|
||||
--- a/server/esync.h
|
||||
+++ b/server/esync.h
|
||||
@@ -21,6 +21,7 @@
|
||||
@@ -284,10 +284,10 @@ index aeb58c546..cea025d93 100644
|
||||
void esync_clear( int fd );
|
||||
|
||||
diff --git a/server/protocol.def b/server/protocol.def
|
||||
index 65a6696e3..d577edc0e 100644
|
||||
index eca0325e5c5..975802737fa 100644
|
||||
--- a/server/protocol.def
|
||||
+++ b/server/protocol.def
|
||||
@@ -4054,6 +4054,11 @@ struct handle_info
|
||||
@@ -4083,6 +4083,11 @@ struct handle_info
|
||||
unsigned int shm_idx; /* this object's index into the shm section */
|
||||
@END
|
||||
|
||||
@@ -300,7 +300,7 @@ index 65a6696e3..d577edc0e 100644
|
||||
{
|
||||
ESYNC_SEMAPHORE = 1,
|
||||
diff --git a/server/thread.c b/server/thread.c
|
||||
index b7ed72a5c..fc751c2cb 100644
|
||||
index 7c8b6da8a55..7da1a620ddd 100644
|
||||
--- a/server/thread.c
|
||||
+++ b/server/thread.c
|
||||
@@ -188,6 +188,7 @@ static inline void init_thread_structure( struct thread *thread )
|
||||
@@ -311,7 +311,7 @@ index b7ed72a5c..fc751c2cb 100644
|
||||
thread->debug_ctx = NULL;
|
||||
thread->system_regs = 0;
|
||||
thread->queue = NULL;
|
||||
@@ -295,7 +296,10 @@ struct thread *create_thread( int fd, struct process *process, const struct secu
|
||||
@@ -297,7 +298,10 @@ struct thread *create_thread( int fd, struct process *process, const struct secu
|
||||
}
|
||||
|
||||
if (do_esync())
|
||||
@@ -322,7 +322,7 @@ index b7ed72a5c..fc751c2cb 100644
|
||||
|
||||
set_fd_events( thread->request_fd, POLLIN ); /* start listening to events */
|
||||
add_process_thread( thread->process, thread );
|
||||
@@ -1050,8 +1054,13 @@ static int queue_apc( struct process *process, struct thread *thread, struct thr
|
||||
@@ -1077,8 +1081,13 @@ static int queue_apc( struct process *process, struct thread *thread, struct thr
|
||||
grab_object( apc );
|
||||
list_add_tail( queue, &apc->entry );
|
||||
if (!list_prev( queue, &apc->entry )) /* first one */
|
||||
@@ -336,7 +336,7 @@ index b7ed72a5c..fc751c2cb 100644
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1098,6 +1107,10 @@ static struct thread_apc *thread_dequeue_apc( struct thread *thread, int system_
|
||||
@@ -1124,6 +1133,10 @@ static struct thread_apc *thread_dequeue_apc( struct thread *thread, int system
|
||||
apc = LIST_ENTRY( ptr, struct thread_apc, entry );
|
||||
list_remove( ptr );
|
||||
}
|
||||
@@ -348,7 +348,7 @@ index b7ed72a5c..fc751c2cb 100644
|
||||
}
|
||||
|
||||
diff --git a/server/thread.h b/server/thread.h
|
||||
index dd06333fd..a62559dc4 100644
|
||||
index 8a737010a5b..53409c11956 100644
|
||||
--- a/server/thread.h
|
||||
+++ b/server/thread.h
|
||||
@@ -55,6 +55,7 @@ struct thread
|
||||
@@ -360,5 +360,5 @@ index dd06333fd..a62559dc4 100644
|
||||
unsigned int system_regs; /* which system regs have been set */
|
||||
struct msg_queue *queue; /* message queue */
|
||||
--
|
||||
2.22.0
|
||||
2.26.0
|
||||
|
||||
|
@@ -1,15 +1,14 @@
|
||||
From 78390efe3e29255fc19abd46e1741a332f6acde9 Mon Sep 17 00:00:00 2001
|
||||
From 5262cc2c80ae65a0144dffb16072473149c70da7 Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Wed, 20 Jun 2018 13:41:12 -0500
|
||||
Subject: [PATCH 55/83] ntdll: Let the server know when we are doing a message
|
||||
wait.
|
||||
Subject: [PATCH] ntdll: Let the server know when we are doing a message wait.
|
||||
|
||||
---
|
||||
dlls/ntdll/esync.c | 11 +++++++++++
|
||||
1 file changed, 11 insertions(+)
|
||||
|
||||
diff --git a/dlls/ntdll/esync.c b/dlls/ntdll/esync.c
|
||||
index 5eef7e3c8..d935a4af5 100644
|
||||
index 80f659d6fde..f2dc32f3a0e 100644
|
||||
--- a/dlls/ntdll/esync.c
|
||||
+++ b/dlls/ntdll/esync.c
|
||||
@@ -753,11 +753,22 @@ NTSTATUS esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEAN wait_an
|
||||
@@ -29,12 +28,12 @@ index 5eef7e3c8..d935a4af5 100644
|
||||
+ * hung queues. Do it like this. */
|
||||
+ select_op.wait.op = SELECT_WAIT;
|
||||
+ select_op.wait.handles[0] = wine_server_obj_handle( handles[count - 1] );
|
||||
+ ret = server_select( &select_op, offsetof( select_op_t, wait.handles[1] ), 0, &zero );
|
||||
+ ret = server_wait( &select_op, offsetof( select_op_t, wait.handles[1] ), 0, &zero );
|
||||
+ if (ret != STATUS_WAIT_0 && ret != STATUS_TIMEOUT)
|
||||
+ ERR("Unexpected ret %#x\n", ret);
|
||||
}
|
||||
|
||||
if (has_esync && has_server)
|
||||
--
|
||||
2.20.1
|
||||
2.26.0
|
||||
|
||||
|
@@ -1,22 +1,21 @@
|
||||
From e880d8328ae7d2602c828298fcf78e7bc9188add Mon Sep 17 00:00:00 2001
|
||||
From ffbf02d62296a0a0f56d3792bad1ff107d2ef725 Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Wed, 20 Jun 2018 14:04:04 -0500
|
||||
Subject: [PATCH 56/83] ntdll: Avoid server_select() when waiting for critical
|
||||
Subject: [PATCH] ntdll: Avoid server_select() when waiting for critical
|
||||
sections.
|
||||
|
||||
There's no reason not to always use NtWaitForSingleObject(), so just do that.
|
||||
|
||||
And of course this lets esync work right.
|
||||
|
||||
---
|
||||
dlls/ntdll/critsection.c | 5 +----
|
||||
1 file changed, 1 insertion(+), 4 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/critsection.c b/dlls/ntdll/critsection.c
|
||||
index 6b17cebe0..d9add3f06 100644
|
||||
index 1892d3abcb7..32907703730 100644
|
||||
--- a/dlls/ntdll/critsection.c
|
||||
+++ b/dlls/ntdll/critsection.c
|
||||
@@ -220,12 +220,9 @@ static inline NTSTATUS wait_semaphore( RTL_CRITICAL_SECTION *crit, int timeout )
|
||||
@@ -237,12 +237,9 @@ static inline NTSTATUS wait_semaphore( RTL_CRITICAL_SECTION *crit, int timeout )
|
||||
{
|
||||
HANDLE sem = get_semaphore( crit );
|
||||
LARGE_INTEGER time;
|
||||
@@ -25,11 +24,11 @@ index 6b17cebe0..d9add3f06 100644
|
||||
time.QuadPart = timeout * (LONGLONG)-10000000;
|
||||
- select_op.wait.op = SELECT_WAIT;
|
||||
- select_op.wait.handles[0] = wine_server_obj_handle( sem );
|
||||
- ret = server_select( &select_op, offsetof( select_op_t, wait.handles[1] ), 0, &time );
|
||||
- ret = server_wait( &select_op, offsetof( select_op_t, wait.handles[1] ), 0, &time );
|
||||
+ ret = NtWaitForSingleObject( sem, FALSE, &time );
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
--
|
||||
2.20.1
|
||||
2.26.0
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
From 997461625f8169228a34358a6908ff24b1d4f602 Mon Sep 17 00:00:00 2001
|
||||
From d67891b541cfcd5107805b088f20d3b8ca7f7d00 Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Mon, 13 Aug 2018 21:35:06 -0500
|
||||
Subject: [PATCH] ntdll, server: Revert to old implementation of hung queue
|
||||
@@ -22,7 +22,7 @@ critical code that this patchset was written for.
|
||||
3 files changed, 73 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/esync.c b/dlls/ntdll/esync.c
|
||||
index ea4654d1f13..4ffbc4bd25e 100644
|
||||
index 2cdfcca4f04..9c7e8deea85 100644
|
||||
--- a/dlls/ntdll/esync.c
|
||||
+++ b/dlls/ntdll/esync.c
|
||||
@@ -831,8 +831,8 @@ static void update_grabbed_object( struct esync *obj )
|
||||
@@ -53,7 +53,7 @@ index ea4654d1f13..4ffbc4bd25e 100644
|
||||
- * hung queues. Do it like this. */
|
||||
- select_op.wait.op = SELECT_WAIT;
|
||||
- select_op.wait.handles[0] = wine_server_obj_handle( handles[count - 1] );
|
||||
- ret = server_select( &select_op, offsetof( select_op_t, wait.handles[1] ), 0, &zero );
|
||||
- ret = server_wait( &select_op, offsetof( select_op_t, wait.handles[1] ), 0, &zero );
|
||||
- if (ret != STATUS_WAIT_0 && ret != STATUS_TIMEOUT)
|
||||
- ERR("Unexpected ret %#x\n", ret);
|
||||
}
|
||||
@@ -105,10 +105,10 @@ index ea4654d1f13..4ffbc4bd25e 100644
|
||||
const LARGE_INTEGER *timeout )
|
||||
{
|
||||
diff --git a/server/protocol.def b/server/protocol.def
|
||||
index 7082fee04b5..7078c33b94b 100644
|
||||
index ab5e205462d..2260f432311 100644
|
||||
--- a/server/protocol.def
|
||||
+++ b/server/protocol.def
|
||||
@@ -4077,7 +4077,11 @@ struct handle_info
|
||||
@@ -4085,7 +4085,11 @@ struct handle_info
|
||||
|
||||
/* Retrieve the fd to wait on for user APCs. */
|
||||
@REQ(get_esync_apc_fd)
|
||||
@@ -122,7 +122,7 @@ index 7082fee04b5..7078c33b94b 100644
|
||||
|
||||
enum esync_type
|
||||
diff --git a/server/queue.c b/server/queue.c
|
||||
index b6ed2478c6e..5eb1a046f7b 100644
|
||||
index c365eacb9e0..2b780deb112 100644
|
||||
--- a/server/queue.c
|
||||
+++ b/server/queue.c
|
||||
@@ -126,6 +126,7 @@ struct msg_queue
|
||||
@@ -133,7 +133,7 @@ index b6ed2478c6e..5eb1a046f7b 100644
|
||||
unsigned int wake_bits; /* wakeup bits */
|
||||
unsigned int wake_mask; /* wakeup mask */
|
||||
unsigned int changed_bits; /* changed wakeup bits */
|
||||
@@ -975,7 +976,21 @@ static void cleanup_results( struct msg_queue *queue )
|
||||
@@ -996,7 +997,21 @@ static void cleanup_results( struct msg_queue *queue )
|
||||
/* check if the thread owning the queue is hung (not checking for messages) */
|
||||
static int is_queue_hung( struct msg_queue *queue )
|
||||
{
|
||||
@@ -156,7 +156,7 @@ index b6ed2478c6e..5eb1a046f7b 100644
|
||||
}
|
||||
|
||||
static int msg_queue_add_queue( struct object *obj, struct wait_queue_entry *entry )
|
||||
@@ -991,12 +1006,6 @@ static int msg_queue_add_queue( struct object *obj, struct wait_queue_entry *ent
|
||||
@@ -1012,12 +1027,6 @@ static int msg_queue_add_queue( struct object *obj, struct wait_queue_entry *ent
|
||||
}
|
||||
if (process->idle_event && !(queue->wake_mask & QS_SMRESULT)) set_event( process->idle_event );
|
||||
|
||||
@@ -169,7 +169,7 @@ index b6ed2478c6e..5eb1a046f7b 100644
|
||||
if (queue->fd && list_empty( &obj->wait_queue )) /* first on the queue */
|
||||
set_fd_events( queue->fd, POLLIN );
|
||||
add_queue( obj, entry );
|
||||
@@ -1688,6 +1697,7 @@ static int send_hook_ll_message( struct desktop *desktop, struct message *hardwa
|
||||
@@ -1728,6 +1737,7 @@ static int send_hook_ll_message( struct desktop *desktop, struct message *hardwa
|
||||
|
||||
if (!(hook_thread = get_first_global_hook( id ))) return 0;
|
||||
if (!(queue = hook_thread->queue)) return 0;
|
||||
@@ -177,7 +177,7 @@ index b6ed2478c6e..5eb1a046f7b 100644
|
||||
|
||||
if (!(msg = mem_alloc( sizeof(*msg) ))) return 0;
|
||||
|
||||
@@ -3383,3 +3393,14 @@ DECL_HANDLER(get_rawinput_devices)
|
||||
@@ -3432,3 +3442,14 @@ DECL_HANDLER(get_rawinput_devices)
|
||||
|
||||
set_reply_data_ptr( devices, device_count * sizeof (*devices) );
|
||||
}
|
||||
|
Reference in New Issue
Block a user