<pre style='margin:0'>
Renee Otten (reneeotten) pushed a commit to branch master
in repository macports-ports.
</pre>
<p><a href="https://github.com/macports/macports-ports/commit/cf25f062fe5fbcbb1af3814dc6719fe9cf800895">https://github.com/macports/macports-ports/commit/cf25f062fe5fbcbb1af3814dc6719fe9cf800895</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'> new cf25f062fe5 wine-devel,wine-staging: Update to 9.21
</span>cf25f062fe5 is described below
<span style='display:block; white-space:pre;color:#808000;'>commit cf25f062fe5fbcbb1af3814dc6719fe9cf800895
</span>Author: Dean M Greer <38226388+Gcenx@users.noreply.github.com>
AuthorDate: Sat Nov 9 09:15:02 2024 -0500
<span style='display:block; white-space:pre;color:#404040;'> wine-devel,wine-staging: Update to 9.21
</span>---
emulators/wine-devel/Portfile | 14 +-
.../files/0001-winemac.drv-no-flicker-patch.diff | 16 +-
emulators/wine-devel/files/1001-devel-msync.diff | 226 ++++++++++---------
emulators/wine-devel/files/1001-staging-msync.diff | 234 ++++++++++---------
emulators/wine-devel/files/macos_hacks.diff | 251 ++++++++++++---------
5 files changed, 405 insertions(+), 336 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/emulators/wine-devel/Portfile b/emulators/wine-devel/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 45a15e0aca2..1cde833b6eb 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/emulators/wine-devel/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/emulators/wine-devel/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -7,7 +7,7 @@ PortGroup muniversal 1.1
</span>
# Keep the wine-stable, wine-devel and wine-crossover portfiles as similar as possible.
<span style='display:block; white-space:pre;background:#ffe0e0;'>-github.setup wine-mirror wine 9.20 wine-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+github.setup wine-mirror wine 9.21 wine-
</span> github.tarball_from archive
name wine-devel
conflicts wine-stable wine-staging wine-crossover
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -37,9 +37,9 @@ long_description \
</span>
checksums \
${distname}${extract.suffix} \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- rmd160 a4524cd0f2c05b360be9c0ef17d2cb86c10921ec \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- sha256 ae5d1ef7fe71903bc1ff65e5b02e44b401225399eed8d6a0efa8a792bf79ad70 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- size 51667148
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ rmd160 9df39caf3f99be28c1fc73bda63edb8374fda62b \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sha256 10dbc38de71950da5f8535d419f984a218be48641f54ab98830dd8415a6d9e75 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size 51733008
</span>
depends_build \
port:bison \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -144,9 +144,9 @@ subport wine-staging {
</span>
checksums-append \
${wine_staging_distfile} \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- rmd160 fa1258bc308dcae98314a4104ef9f2f05dca47f7 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- sha256 e88fe8e23f7160489538636a2d795772415004d48cdcc85d29dd9e59b2fe575d \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- size 9518651
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ rmd160 61f5912f617b47274545bf0941802f3f6b20d37c \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sha256 2e8c9cf9e378f99de133c7d86f9f0d5d506305869f4c802cb598f97b2f6bf8a6 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size 9564841
</span>
depends_patch-append port:autoconf
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/emulators/wine-devel/files/0001-winemac.drv-no-flicker-patch.diff b/emulators/wine-devel/files/0001-winemac.drv-no-flicker-patch.diff
</span><span style='display:block; white-space:pre;color:#808080;'>index 6d7e14e836c..126639e9068 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/emulators/wine-devel/files/0001-winemac.drv-no-flicker-patch.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/emulators/wine-devel/files/0001-winemac.drv-no-flicker-patch.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,4 +1,4 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 6d2e0b68dacbece60f35c2fb77effee0a6d8b07d Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 2d72a65d874538ec1032adaf42a28940e6b6a375 Mon Sep 17 00:00:00 2001
</span> From: Ken Thomases <ken@codeweavers.com>
Date: Tue, 22 Jun 2021 07:56:43 +1000
Subject: [PATCH] winemac.drv: No Flicker patch
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -10,7 +10,7 @@ Subject: [PATCH] winemac.drv: No Flicker patch
</span> 3 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 5394a3f89fe..71ebfc9ff72 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index f9ada39d38a..89ffa0d5825 100644
</span> --- a/dlls/winemac.drv/macdrv.h
+++ b/dlls/winemac.drv/macdrv.h
@@ -43,6 +43,7 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -19,10 +19,10 @@ index 5394a3f89fe..71ebfc9ff72 100644
</span> extern BOOL allow_software_rendering;
+extern BOOL force_backing_store;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- extern const char* debugstr_cf(CFTypeRef t);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern UINT64 app_icon_callback;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern UINT64 app_quit_request_callback;
</span> diff --git a/dlls/winemac.drv/macdrv_main.c b/dlls/winemac.drv/macdrv_main.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 009d9e694a5..3c9425e6f5f 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index ea556aef68d..e67f17f9f43 100644
</span> --- a/dlls/winemac.drv/macdrv_main.c
+++ b/dlls/winemac.drv/macdrv_main.c
@@ -59,6 +59,7 @@ int use_precise_scrolling = TRUE;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -31,9 +31,9 @@ index 009d9e694a5..3c9425e6f5f 100644
</span> int enable_app_nap = FALSE;
+BOOL force_backing_store = FALSE;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- CFDictionaryRef localized_strings;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -373,6 +374,9 @@ static void setup_options(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ UINT64 app_icon_callback = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ UINT64 app_quit_request_callback = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -379,6 +380,9 @@ static void setup_options(void)
</span> if (!get_config_key(hkey, appkey, "EnableAppNap", buffer, sizeof(buffer)))
enable_app_nap = IS_OPTION_TRUE(buffer[0]);
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/emulators/wine-devel/files/1001-devel-msync.diff b/emulators/wine-devel/files/1001-devel-msync.diff
</span><span style='display:block; white-space:pre;color:#808080;'>index 3fa8748780a..116d0f5d5c8 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/emulators/wine-devel/files/1001-devel-msync.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/emulators/wine-devel/files/1001-devel-msync.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -11,7 +11,7 @@ index 37bd6c86e31..89ee0286daa 100644
</span> unix/loadorder.c \
unix/process.c \
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 92f2e2eb3a3..bc9af9d34a8 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 0dfee19f714..e4d3d3c8e99 100644
</span> --- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
@@ -90,6 +90,7 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -22,7 +22,7 @@ index 92f2e2eb3a3..bc9af9d34a8 100644
</span> #include "wine/list.h"
#include "ntsyscalls.h"
#include "wine/debug.h"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1858,6 +1859,7 @@ static void start_main_thread(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1900,6 +1901,7 @@ static void start_main_thread(void)
</span> signal_alloc_thread( teb );
dbg_init();
startup_info_size = server_init_process();
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1782,7 +1782,7 @@ index 00000000000..3e6eb2c8b1e
</span> +extern NTSTATUS msync_signal_and_wait( HANDLE signal, HANDLE wait,
+ BOOLEAN alertable, const LARGE_INTEGER *timeout );
diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index f3ffd99c3fc..aac6c8aedb7 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index f03d008e2ae..27ffbdf3001 100644
</span> --- a/dlls/ntdll/unix/server.c
+++ b/dlls/ntdll/unix/server.c
@@ -79,6 +79,7 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1793,7 +1793,7 @@ index f3ffd99c3fc..aac6c8aedb7 100644
</span> #include "ddk/wdm.h"
WINE_DEFAULT_DEBUG_CHANNEL(server);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1830,6 +1831,9 @@ NTSTATUS WINAPI NtClose( HANDLE handle )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1855,6 +1856,9 @@ NTSTATUS WINAPI NtClose( HANDLE handle )
</span> * retrieve it again */
fd = remove_fd_from_cache( handle );
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1804,7 +1804,7 @@ index f3ffd99c3fc..aac6c8aedb7 100644
</span> {
req->handle = wine_server_obj_handle( handle );
diff --git a/dlls/ntdll/unix/sync.c b/dlls/ntdll/unix/sync.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 21e66f01875..7ebc8cdd77c 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 80f82c18730..2781384229e 100644
</span> --- a/dlls/ntdll/unix/sync.c
+++ b/dlls/ntdll/unix/sync.c
@@ -66,6 +66,7 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1815,7 +1815,7 @@ index 21e66f01875..7ebc8cdd77c 100644
</span>
WINE_DEFAULT_DEBUG_CHANNEL(sync);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -319,6 +320,9 @@ NTSTATUS WINAPI NtCreateSemaphore( HANDLE *handle, ACCESS_MASK access, const OBJ
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -315,6 +316,9 @@ NTSTATUS WINAPI NtCreateSemaphore( HANDLE *handle, ACCESS_MASK access, const OBJ
</span> if (max <= 0 || initial < 0 || initial > max) return STATUS_INVALID_PARAMETER;
if ((ret = alloc_object_attributes( attr, &objattr, &len ))) return ret;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1825,7 +1825,7 @@ index 21e66f01875..7ebc8cdd77c 100644
</span> SERVER_START_REQ( create_semaphore )
{
req->access = access;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -343,6 +347,10 @@ NTSTATUS WINAPI NtOpenSemaphore( HANDLE *handle, ACCESS_MASK access, const OBJEC
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -339,6 +343,10 @@ NTSTATUS WINAPI NtOpenSemaphore( HANDLE *handle, ACCESS_MASK access, const OBJEC
</span> unsigned int ret;
*handle = 0;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1836,7 +1836,7 @@ index 21e66f01875..7ebc8cdd77c 100644
</span> if ((ret = validate_open_object_attributes( attr ))) return ret;
SERVER_START_REQ( open_semaphore )
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -379,6 +387,9 @@ NTSTATUS WINAPI NtQuerySemaphore( HANDLE handle, SEMAPHORE_INFORMATION_CLASS cla
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -375,6 +383,9 @@ NTSTATUS WINAPI NtQuerySemaphore( HANDLE handle, SEMAPHORE_INFORMATION_CLASS cla
</span>
if (len != sizeof(SEMAPHORE_BASIC_INFORMATION)) return STATUS_INFO_LENGTH_MISMATCH;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1846,7 +1846,7 @@ index 21e66f01875..7ebc8cdd77c 100644
</span> SERVER_START_REQ( query_semaphore )
{
req->handle = wine_server_obj_handle( handle );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -401,6 +412,9 @@ NTSTATUS WINAPI NtReleaseSemaphore( HANDLE handle, ULONG count, ULONG *previous
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -397,6 +408,9 @@ NTSTATUS WINAPI NtReleaseSemaphore( HANDLE handle, ULONG count, ULONG *previous
</span> {
unsigned int ret;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1856,7 +1856,7 @@ index 21e66f01875..7ebc8cdd77c 100644
</span> SERVER_START_REQ( release_semaphore )
{
req->handle = wine_server_obj_handle( handle );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -427,6 +441,10 @@ NTSTATUS WINAPI NtCreateEvent( HANDLE *handle, ACCESS_MASK access, const OBJECT_
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -423,6 +437,10 @@ NTSTATUS WINAPI NtCreateEvent( HANDLE *handle, ACCESS_MASK access, const OBJECT_
</span>
*handle = 0;
if (type != NotificationEvent && type != SynchronizationEvent) return STATUS_INVALID_PARAMETER;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1867,7 +1867,7 @@ index 21e66f01875..7ebc8cdd77c 100644
</span> if ((ret = alloc_object_attributes( attr, &objattr, &len ))) return ret;
SERVER_START_REQ( create_event )
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -455,6 +473,9 @@ NTSTATUS WINAPI NtOpenEvent( HANDLE *handle, ACCESS_MASK access, const OBJECT_AT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -451,6 +469,9 @@ NTSTATUS WINAPI NtOpenEvent( HANDLE *handle, ACCESS_MASK access, const OBJECT_AT
</span> *handle = 0;
if ((ret = validate_open_object_attributes( attr ))) return ret;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1877,7 +1877,7 @@ index 21e66f01875..7ebc8cdd77c 100644
</span> SERVER_START_REQ( open_event )
{
req->access = access;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -477,6 +498,9 @@ NTSTATUS WINAPI NtSetEvent( HANDLE handle, LONG *prev_state )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -473,6 +494,9 @@ NTSTATUS WINAPI NtSetEvent( HANDLE handle, LONG *prev_state )
</span> {
unsigned int ret;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1887,7 +1887,7 @@ index 21e66f01875..7ebc8cdd77c 100644
</span> SERVER_START_REQ( event_op )
{
req->handle = wine_server_obj_handle( handle );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -496,6 +520,10 @@ NTSTATUS WINAPI NtResetEvent( HANDLE handle, LONG *prev_state )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -492,6 +516,10 @@ NTSTATUS WINAPI NtResetEvent( HANDLE handle, LONG *prev_state )
</span> {
unsigned int ret;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1898,7 +1898,7 @@ index 21e66f01875..7ebc8cdd77c 100644
</span> SERVER_START_REQ( event_op )
{
req->handle = wine_server_obj_handle( handle );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -525,6 +553,9 @@ NTSTATUS WINAPI NtPulseEvent( HANDLE handle, LONG *prev_state )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -521,6 +549,9 @@ NTSTATUS WINAPI NtPulseEvent( HANDLE handle, LONG *prev_state )
</span> {
unsigned int ret;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1908,7 +1908,7 @@ index 21e66f01875..7ebc8cdd77c 100644
</span> SERVER_START_REQ( event_op )
{
req->handle = wine_server_obj_handle( handle );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -556,6 +587,9 @@ NTSTATUS WINAPI NtQueryEvent( HANDLE handle, EVENT_INFORMATION_CLASS class,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -552,6 +583,9 @@ NTSTATUS WINAPI NtQueryEvent( HANDLE handle, EVENT_INFORMATION_CLASS class,
</span>
if (len != sizeof(EVENT_BASIC_INFORMATION)) return STATUS_INFO_LENGTH_MISMATCH;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1918,7 +1918,7 @@ index 21e66f01875..7ebc8cdd77c 100644
</span> SERVER_START_REQ( query_event )
{
req->handle = wine_server_obj_handle( handle );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -582,6 +616,10 @@ NTSTATUS WINAPI NtCreateMutant( HANDLE *handle, ACCESS_MASK access, const OBJECT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -578,6 +612,10 @@ NTSTATUS WINAPI NtCreateMutant( HANDLE *handle, ACCESS_MASK access, const OBJECT
</span> struct object_attributes *objattr;
*handle = 0;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1929,7 +1929,7 @@ index 21e66f01875..7ebc8cdd77c 100644
</span> if ((ret = alloc_object_attributes( attr, &objattr, &len ))) return ret;
SERVER_START_REQ( create_mutex )
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -609,6 +647,9 @@ NTSTATUS WINAPI NtOpenMutant( HANDLE *handle, ACCESS_MASK access, const OBJECT_A
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -605,6 +643,9 @@ NTSTATUS WINAPI NtOpenMutant( HANDLE *handle, ACCESS_MASK access, const OBJECT_A
</span> *handle = 0;
if ((ret = validate_open_object_attributes( attr ))) return ret;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1939,7 +1939,7 @@ index 21e66f01875..7ebc8cdd77c 100644
</span> SERVER_START_REQ( open_mutex )
{
req->access = access;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -631,6 +672,9 @@ NTSTATUS WINAPI NtReleaseMutant( HANDLE handle, LONG *prev_count )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -627,6 +668,9 @@ NTSTATUS WINAPI NtReleaseMutant( HANDLE handle, LONG *prev_count )
</span> {
unsigned int ret;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1949,7 +1949,7 @@ index 21e66f01875..7ebc8cdd77c 100644
</span> SERVER_START_REQ( release_mutex )
{
req->handle = wine_server_obj_handle( handle );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -661,6 +705,9 @@ NTSTATUS WINAPI NtQueryMutant( HANDLE handle, MUTANT_INFORMATION_CLASS class,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -657,6 +701,9 @@ NTSTATUS WINAPI NtQueryMutant( HANDLE handle, MUTANT_INFORMATION_CLASS class,
</span>
if (len != sizeof(MUTANT_BASIC_INFORMATION)) return STATUS_INFO_LENGTH_MISMATCH;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1959,7 +1959,7 @@ index 21e66f01875..7ebc8cdd77c 100644
</span> SERVER_START_REQ( query_mutex )
{
req->handle = wine_server_obj_handle( handle );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1581,6 +1628,13 @@ NTSTATUS WINAPI NtWaitForMultipleObjects( DWORD count, const HANDLE *handles, BO
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1577,6 +1624,13 @@ NTSTATUS WINAPI NtWaitForMultipleObjects( DWORD count, const HANDLE *handles, BO
</span>
if (!count || count > MAXIMUM_WAIT_OBJECTS) return STATUS_INVALID_PARAMETER_1;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1973,7 +1973,7 @@ index 21e66f01875..7ebc8cdd77c 100644
</span> if (alertable) flags |= SELECT_ALERTABLE;
select_op.wait.op = wait_any ? SELECT_WAIT : SELECT_WAIT_ALL;
for (i = 0; i < count; i++) select_op.wait.handles[i] = wine_server_obj_handle( handles[i] );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1606,6 +1660,9 @@ NTSTATUS WINAPI NtSignalAndWaitForSingleObject( HANDLE signal, HANDLE wait,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1602,6 +1656,9 @@ NTSTATUS WINAPI NtSignalAndWaitForSingleObject( HANDLE signal, HANDLE wait,
</span> select_op_t select_op;
UINT flags = SELECT_INTERRUPTIBLE;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1983,7 +1983,7 @@ index 21e66f01875..7ebc8cdd77c 100644
</span> if (!signal) return STATUS_INVALID_HANDLE;
if (alertable) flags |= SELECT_ALERTABLE;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1646,7 +1703,17 @@ NTSTATUS WINAPI NtYieldExecution(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1642,7 +1699,17 @@ NTSTATUS WINAPI NtYieldExecution(void)
</span> NTSTATUS WINAPI NtDelayExecution( BOOLEAN alertable, const LARGE_INTEGER *timeout )
{
/* if alertable, we need to query the server */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2003,7 +2003,7 @@ index 21e66f01875..7ebc8cdd77c 100644
</span> if (!timeout || timeout->QuadPart == TIMEOUT_INFINITE) /* sleep forever */
{
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index ee5630e76f1..84f0bef8bda 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 8815f174de9..bfdd188d828 100644
</span> --- a/dlls/ntdll/unix/unix_private.h
+++ b/dlls/ntdll/unix/unix_private.h
@@ -103,6 +103,8 @@ struct ntdll_thread_data
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2016,10 +2016,10 @@ index ee5630e76f1..84f0bef8bda 100644
</span> int reply_fd; /* fd for receiving server replies */
int wait_fd[2]; /* fd for sleeping server requests */
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 0fedfe0fb1d..ff770ecbdb4 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index bbe82086085..1f958a0b4e3 100644
</span> --- a/dlls/ntdll/unix/virtual.c
+++ b/dlls/ntdll/unix/virtual.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -3653,6 +3653,8 @@ static TEB *init_teb( void *ptr, BOOL is_wow )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3722,6 +3722,8 @@ static TEB *init_teb( void *ptr, BOOL is_wow )
</span> teb->StaticUnicodeString.Buffer = teb->StaticUnicodeBuffer;
teb->StaticUnicodeString.MaximumLength = sizeof(teb->StaticUnicodeBuffer);
thread_data = (struct ntdll_thread_data *)&teb->GdiTebBatch;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2029,10 +2029,10 @@ index 0fedfe0fb1d..ff770ecbdb4 100644
</span> thread_data->reply_fd = -1;
thread_data->wait_fd[0] = -1;
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 74bf0f0c839..fd84ee0d1a9 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 0a9d9516f64..8d1b18367c1 100644
</span> --- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -5722,6 +5722,92 @@ struct set_keyboard_repeat_reply
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -5868,6 +5868,92 @@ struct set_keyboard_repeat_reply
</span> char __pad_12[4];
};
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2125,7 +2125,7 @@ index 74bf0f0c839..fd84ee0d1a9 100644
</span>
enum request
{
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -6011,6 +6097,11 @@ enum request
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -6162,6 +6248,11 @@ enum request
</span> REQ_resume_process,
REQ_get_next_thread,
REQ_set_keyboard_repeat,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2137,7 +2137,7 @@ index 74bf0f0c839..fd84ee0d1a9 100644
</span> REQ_NB_REQUESTS
};
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -6304,6 +6395,11 @@ union generic_request
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -6460,6 +6551,11 @@ union generic_request
</span> struct resume_process_request resume_process_request;
struct get_next_thread_request get_next_thread_request;
struct set_keyboard_repeat_request set_keyboard_repeat_request;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2149,7 +2149,7 @@ index 74bf0f0c839..fd84ee0d1a9 100644
</span> };
union generic_reply
{
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -6595,11 +6691,16 @@ union generic_reply
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -6756,11 +6852,16 @@ union generic_reply
</span> struct resume_process_reply resume_process_reply;
struct get_next_thread_reply get_next_thread_reply;
struct set_keyboard_repeat_reply set_keyboard_repeat_reply;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2162,8 +2162,8 @@ index 74bf0f0c839..fd84ee0d1a9 100644
</span>
/* ### protocol_version begin ### */
<span style='display:block; white-space:pre;background:#ffe0e0;'>--#define SERVER_PROTOCOL_VERSION 843
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define SERVER_PROTOCOL_VERSION 847
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#define SERVER_PROTOCOL_VERSION 847
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define SERVER_PROTOCOL_VERSION 851
</span>
/* ### protocol_version end ### */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2180,10 +2180,10 @@ index 7e571ac2ba6..dabe3fe83a8 100644
</span> hook.c \
mach.c \
diff --git a/server/async.c b/server/async.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 3c9b9588c6e..b53e2e5d15e 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 749c547af4f..ec39e9dc56b 100644
</span> --- a/server/async.c
+++ b/server/async.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -77,6 +77,7 @@ static const struct object_ops async_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -78,6 +78,7 @@ static const struct object_ops async_ops =
</span> add_queue, /* add_queue */
remove_queue, /* remove_queue */
async_signaled, /* signaled */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2191,7 +2191,7 @@ index 3c9b9588c6e..b53e2e5d15e 100644
</span> async_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -686,6 +687,7 @@ static const struct object_ops iosb_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -698,6 +699,7 @@ static const struct object_ops iosb_ops =
</span> no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2212,7 +2212,7 @@ index ff0799f5880..7d53bd5e3bb 100644
</span> no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/change.c b/server/change.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index f773ccf8831..798a7e9c841 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index f42ce066340..a1dd0308e92 100644
</span> --- a/server/change.c
+++ b/server/change.c
@@ -112,6 +112,7 @@ static const struct object_ops dir_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2224,7 +2224,7 @@ index f773ccf8831..798a7e9c841 100644
</span> no_signal, /* signal */
dir_get_fd, /* get_fd */
diff --git a/server/clipboard.c b/server/clipboard.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 8118a467dd8..927edb99a03 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 91f159bc7c9..7ea941b63ee 100644
</span> --- a/server/clipboard.c
+++ b/server/clipboard.c
@@ -76,6 +76,7 @@ static const struct object_ops clipboard_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2236,10 +2236,10 @@ index 8118a467dd8..927edb99a03 100644
</span> no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/completion.c b/server/completion.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 6933195e72d..6be3bc7da85 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index f9e68c523f1..bd1391855c4 100644
</span> --- a/server/completion.c
+++ b/server/completion.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -75,6 +75,7 @@ static const struct object_ops completion_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -166,6 +166,7 @@ static const struct object_ops completion_ops =
</span> add_queue, /* add_queue */
remove_queue, /* remove_queue */
completion_signaled, /* signaled */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2525,7 +2525,7 @@ index 436dac6bfe9..225f8b9890d 100644
</span> else close_handle( current->process, reply->next );
}
diff --git a/server/directory.c b/server/directory.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index b3f055dfd01..753d8904b6b 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index b37ec969a9e..96275aabdac 100644
</span> --- a/server/directory.c
+++ b/server/directory.c
@@ -69,6 +69,7 @@ static const struct object_ops object_type_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2674,10 +2674,10 @@ index f1b79b1b35e..0162b78a5be 100644
</span> unsigned int attr, const struct security_descriptor *sd )
{
diff --git a/server/fd.c b/server/fd.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index f28937466fc..17bde66453a 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 04688c5eb0d..07869ed311b 100644
</span> --- a/server/fd.c
+++ b/server/fd.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -96,6 +96,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -94,6 +94,7 @@
</span> #include "handle.h"
#include "process.h"
#include "request.h"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2685,7 +2685,7 @@ index f28937466fc..17bde66453a 100644
</span>
#include "winternl.h"
#include "winioctl.h"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -156,6 +157,7 @@ struct fd
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -154,6 +155,7 @@ struct fd
</span> struct completion *completion; /* completion object attached to this fd */
apc_param_t comp_key; /* completion key to set in completion events */
unsigned int comp_flags; /* completion flags */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2693,7 +2693,7 @@ index f28937466fc..17bde66453a 100644
</span> };
static void fd_dump( struct object *obj, int verbose );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -169,6 +171,7 @@ static const struct object_ops fd_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -167,6 +169,7 @@ static const struct object_ops fd_ops =
</span> no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2701,7 +2701,7 @@ index f28937466fc..17bde66453a 100644
</span> NULL, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -210,6 +213,7 @@ static const struct object_ops device_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -208,6 +211,7 @@ static const struct object_ops device_ops =
</span> no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2709,7 +2709,7 @@ index f28937466fc..17bde66453a 100644
</span> NULL, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -250,6 +254,7 @@ static const struct object_ops inode_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -248,6 +252,7 @@ static const struct object_ops inode_ops =
</span> no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2717,7 +2717,7 @@ index f28937466fc..17bde66453a 100644
</span> NULL, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -292,6 +297,7 @@ static const struct object_ops file_lock_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -290,6 +295,7 @@ static const struct object_ops file_lock_ops =
</span> add_queue, /* add_queue */
remove_queue, /* remove_queue */
file_lock_signaled, /* signaled */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2725,7 +2725,7 @@ index f28937466fc..17bde66453a 100644
</span> no_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1565,6 +1571,9 @@ static void fd_destroy( struct object *obj )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1563,6 +1569,9 @@ static void fd_destroy( struct object *obj )
</span> if (fd->unix_fd != -1) close( fd->unix_fd );
free( fd->unix_name );
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2735,7 +2735,7 @@ index f28937466fc..17bde66453a 100644
</span> }
/* check if the desired access is possible without violating */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1683,12 +1692,16 @@ static struct fd *alloc_fd_object(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1681,12 +1690,16 @@ static struct fd *alloc_fd_object(void)
</span> fd->poll_index = -1;
fd->completion = NULL;
fd->comp_flags = 0;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2752,7 +2752,7 @@ index f28937466fc..17bde66453a 100644
</span> if ((fd->poll_index = add_poll_user( fd )) == -1)
{
release_object( fd );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1724,11 +1737,15 @@ struct fd *alloc_pseudo_fd( const struct fd_ops *fd_user_ops, struct object *use
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1722,11 +1735,15 @@ struct fd *alloc_pseudo_fd( const struct fd_ops *fd_user_ops, struct object *use
</span> fd->completion = NULL;
fd->comp_flags = 0;
fd->no_fd_status = STATUS_BAD_DEVICE_TYPE;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2768,7 +2768,7 @@ index f28937466fc..17bde66453a 100644
</span> return fd;
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2140,6 +2157,9 @@ void set_fd_signaled( struct fd *fd, int signaled )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2131,6 +2148,9 @@ void set_fd_signaled( struct fd *fd, int signaled )
</span> if (fd->comp_flags & FILE_SKIP_SET_EVENT_ON_HANDLE) return;
fd->signaled = signaled;
if (signaled) wake_up( fd->user, 0 );
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2778,7 +2778,7 @@ index f28937466fc..17bde66453a 100644
</span> }
/* check if events are pending and if yes return which one(s) */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2165,6 +2185,15 @@ int default_fd_signaled( struct object *obj, struct wait_queue_entry *entry )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2156,6 +2176,15 @@ int default_fd_signaled( struct object *obj, struct wait_queue_entry *entry )
</span> return ret;
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2795,7 +2795,7 @@ index f28937466fc..17bde66453a 100644
</span> {
int events = 0;
diff --git a/server/file.c b/server/file.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 76c687833c9..8f51635c38a 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 8f6566a0077..74bb8336bbb 100644
</span> --- a/server/file.c
+++ b/server/file.c
@@ -94,6 +94,7 @@ static const struct object_ops file_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2807,7 +2807,7 @@ index 76c687833c9..8f51635c38a 100644
</span> no_signal, /* signal */
file_get_fd, /* get_fd */
diff --git a/server/file.h b/server/file.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 006b5a8e324..12e71541ec0 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 3d7cdc460ff..db54555a883 100644
</span> --- a/server/file.h
+++ b/server/file.h
@@ -108,6 +108,7 @@ extern char *dup_fd_name( struct fd *root, const char *name ) __WINE_DEALLOC(fre
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2819,7 +2819,7 @@ index 006b5a8e324..12e71541ec0 100644
</span> extern void default_poll_event( struct fd *fd, int event );
extern void fd_cancel_async( struct fd *fd, struct async *async );
diff --git a/server/handle.c b/server/handle.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index ef243e06e0b..48ab37b314b 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index e65831b3b22..5a60a528ff3 100644
</span> --- a/server/handle.c
+++ b/server/handle.c
@@ -126,6 +126,7 @@ static const struct object_ops handle_table_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2843,7 +2843,7 @@ index c2d2823cd61..dfb210b9de6 100644
</span> no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/mailslot.c b/server/mailslot.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 7defbccdb44..f7b8bca210d 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 61eceec94e2..573789b65f6 100644
</span> --- a/server/mailslot.c
+++ b/server/mailslot.c
@@ -81,6 +81,7 @@ static const struct object_ops mailslot_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2879,7 +2879,7 @@ index 7defbccdb44..f7b8bca210d 100644
</span> no_signal, /* signal */
mailslot_device_file_get_fd, /* get_fd */
diff --git a/server/main.c b/server/main.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 1248b92f24d..cedc5776a95 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 1248b92f24d..f5dcebe8d87 100644
</span> --- a/server/main.c
+++ b/server/main.c
@@ -34,6 +34,7 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2897,14 +2897,14 @@ index 1248b92f24d..cedc5776a95 100644
</span> + if (do_msync())
+ msync_init();
+
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (!do_msync())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (!do_msync() && debug_level)
</span> + fprintf( stderr, "wineserver: using server-side synchronization.\n" );
+
if (debug_level) fprintf( stderr, "wineserver: starting (pid=%ld)\n", (long) getpid() );
set_current_time();
init_signals();
diff --git a/server/mapping.c b/server/mapping.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 8a34760b10e..81b8e48caaf 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 2bf45780375..476669ea0f4 100644
</span> --- a/server/mapping.c
+++ b/server/mapping.c
@@ -67,6 +67,7 @@ static const struct object_ops ranges_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3983,7 +3983,7 @@ index af0efe72132..0f6d013a119 100644
</span> mutex_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/named_pipe.c b/server/named_pipe.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index dd8c14b30a9..bfe60839b6f 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 59a90c36663..903c4aaf2ec 100644
</span> --- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -119,6 +119,7 @@ static const struct object_ops named_pipe_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4026,8 +4026,28 @@ index dd8c14b30a9..bfe60839b6f 100644
</span> no_satisfied, /* satisfied */
no_signal, /* signal */
named_pipe_device_file_get_fd, /* get_fd */
<span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/server/object.c b/server/object.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index b1665fb5372..55727c2e118 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/server/object.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/server/object.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -108,6 +108,7 @@ static const struct object_ops apc_reserve_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ no_add_queue, /* add_queue */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ NULL, /* remove_queue */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ NULL, /* signaled */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ NULL, /* get_msync_idx */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ no_satisfied, /* satisfied */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ no_signal, /* signal */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ no_get_fd, /* get_fd */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -132,6 +133,7 @@ static const struct object_ops completion_reserve_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ no_add_queue, /* add_queue */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ NULL, /* remove_queue */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ NULL, /* signaled */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ NULL, /* get_msync_idx */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ no_satisfied, /* satisfied */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ no_signal, /* signal */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ no_get_fd, /* get_fd */
</span> diff --git a/server/object.h b/server/object.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 2337ee88231..77084b1ee32 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 6222e3352ed..eabef90097d 100644
</span> --- a/server/object.h
+++ b/server/object.h
@@ -78,6 +78,8 @@ struct object_ops
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4040,7 +4060,7 @@ index 2337ee88231..77084b1ee32 100644
</span> void (*satisfied)(struct object *,struct wait_queue_entry *);
/* signal an object */
diff --git a/server/process.c b/server/process.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 155dc050d95..f9b393e59e7 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 49f5c75005f..1477c2587a7 100644
</span> --- a/server/process.c
+++ b/server/process.c
@@ -63,6 +63,7 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4136,10 +4156,10 @@ index 1e73e9d47dc..217d94aa63a 100644
</span>
/* process functions */
diff --git a/server/protocol.def b/server/protocol.def
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 2c791cbdd46..9677e55f6ad 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 9ecb14cbac4..09de9793118 100644
</span> --- a/server/protocol.def
+++ b/server/protocol.def
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -3953,3 +3953,57 @@ struct handle_info
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4067,3 +4067,57 @@ typedef union
</span> @REPLY
int enable; /* previous state of auto-repeat enable */
@END
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4198,7 +4218,7 @@ index 2c791cbdd46..9677e55f6ad 100644
</span> + unsigned int shm_idx;
+@END
diff --git a/server/queue.c b/server/queue.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 0156a4c66f2..ddf88a94581 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 2641a9ba037..e4b58406fdc 100644
</span> --- a/server/queue.c
+++ b/server/queue.c
@@ -44,6 +44,7 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4261,7 +4281,7 @@ index 0156a4c66f2..ddf88a94581 100644
</span> thread->queue = queue;
if ((desktop = get_thread_desktop( thread, 0 )))
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -740,6 +751,9 @@ static inline void clear_queue_bits( struct msg_queue *queue, unsigned int bits
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -748,6 +759,9 @@ static inline void clear_queue_bits( struct msg_queue *queue, unsigned int bits
</span> if (queue->keystate_lock) unlock_input_keystate( queue->input );
queue->keystate_lock = 0;
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4271,7 +4291,7 @@ index 0156a4c66f2..ddf88a94581 100644
</span> }
/* check if message is matched by the filter */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1219,6 +1233,10 @@ static int is_queue_hung( struct msg_queue *queue )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1227,6 +1241,10 @@ static int is_queue_hung( struct msg_queue *queue )
</span> if (get_wait_queue_thread(entry)->queue == queue)
return 0; /* thread is waiting on queue -> not hung */
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4282,7 +4302,7 @@ index 0156a4c66f2..ddf88a94581 100644
</span> return 1;
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1273,6 +1291,13 @@ static int msg_queue_signaled( struct object *obj, struct wait_queue_entry *entr
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1281,6 +1299,13 @@ static int msg_queue_signaled( struct object *obj, struct wait_queue_entry *entr
</span> return ret || is_signaled( queue );
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4296,7 +4316,7 @@ index 0156a4c66f2..ddf88a94581 100644
</span> static void msg_queue_satisfied( struct object *obj, struct wait_queue_entry *entry )
{
struct msg_queue *queue = (struct msg_queue *)obj;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1329,6 +1354,8 @@ static void msg_queue_destroy( struct object *obj )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1337,6 +1362,8 @@ static void msg_queue_destroy( struct object *obj )
</span> if (queue->hooks) release_object( queue->hooks );
if (queue->fd) release_object( queue->fd );
if (queue->shared) free_shared_object( queue->shared );
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4305,7 +4325,7 @@ index 0156a4c66f2..ddf88a94581 100644
</span> }
static void msg_queue_poll_event( struct fd *fd, int event )
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -3106,6 +3133,9 @@ DECL_HANDLER(set_queue_mask)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3115,6 +3142,9 @@ DECL_HANDLER(set_queue_mask)
</span> }
else wake_up( &queue->obj, 0 );
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4315,7 +4335,7 @@ index 0156a4c66f2..ddf88a94581 100644
</span> }
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -3126,6 +3156,9 @@ DECL_HANDLER(get_queue_status)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3135,6 +3165,9 @@ DECL_HANDLER(get_queue_status)
</span> shared->changed_bits &= ~req->clear_bits;
}
SHARED_WRITE_END;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4325,7 +4345,7 @@ index 0156a4c66f2..ddf88a94581 100644
</span> }
else reply->wake_bits = reply->changed_bits = 0;
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -3383,6 +3416,11 @@ DECL_HANDLER(get_message)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3392,6 +3425,11 @@ DECL_HANDLER(get_message)
</span> SHARED_WRITE_END;
set_error( STATUS_PENDING ); /* FIXME */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4337,7 +4357,7 @@ index 0156a4c66f2..ddf88a94581 100644
</span> }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -4155,6 +4193,23 @@ DECL_HANDLER(update_rawinput_devices)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4164,6 +4202,23 @@ DECL_HANDLER(update_rawinput_devices)
</span> }
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4362,7 +4382,7 @@ index 0156a4c66f2..ddf88a94581 100644
</span> {
struct desktop *desktop;
diff --git a/server/registry.c b/server/registry.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 804cfcc638b..1b2da63cafb 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index cc9a33fff1d..1aa587faee7 100644
</span> --- a/server/registry.c
+++ b/server/registry.c
@@ -180,6 +180,7 @@ static const struct object_ops key_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4374,7 +4394,7 @@ index 804cfcc638b..1b2da63cafb 100644
</span> no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/request.c b/server/request.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 2691e0c7cff..84f5032d59f 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index dabcea68309..0ffc4a0a726 100644
</span> --- a/server/request.c
+++ b/server/request.c
@@ -90,6 +90,7 @@ static const struct object_ops master_socket_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4386,10 +4406,10 @@ index 2691e0c7cff..84f5032d59f 100644
</span> no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/request.h b/server/request.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 6158aefdb78..6b876918510 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 0ec527f2b4f..0144a9bbf4b 100644
</span> --- a/server/request.h
+++ b/server/request.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -405,6 +405,11 @@ DECL_HANDLER(suspend_process);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -410,6 +410,11 @@ DECL_HANDLER(suspend_process);
</span> DECL_HANDLER(resume_process);
DECL_HANDLER(get_next_thread);
DECL_HANDLER(set_keyboard_repeat);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4401,7 +4421,7 @@ index 6158aefdb78..6b876918510 100644
</span>
#ifdef WANT_REQUEST_HANDLERS
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -697,6 +702,11 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -707,6 +712,11 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
</span> (req_handler)req_resume_process,
(req_handler)req_get_next_thread,
(req_handler)req_set_keyboard_repeat,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4413,7 +4433,7 @@ index 6158aefdb78..6b876918510 100644
</span> };
C_ASSERT( sizeof(abstime_t) == 8 );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2341,6 +2351,34 @@ C_ASSERT( FIELD_OFFSET(struct set_keyboard_repeat_request, period) == 20 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2374,6 +2384,34 @@ C_ASSERT( FIELD_OFFSET(struct set_keyboard_repeat_request, period) == 20 );
</span> C_ASSERT( sizeof(struct set_keyboard_repeat_request) == 24 );
C_ASSERT( FIELD_OFFSET(struct set_keyboard_repeat_reply, enable) == 8 );
C_ASSERT( sizeof(struct set_keyboard_repeat_reply) == 16 );
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4485,10 +4505,10 @@ index 19b76d44c16..57415604d07 100644
</span> no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/sock.c b/server/sock.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 06ffd1b81f8..e7081476458 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index d2ec882554f..53d73e6de4d 100644
</span> --- a/server/sock.c
+++ b/server/sock.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -453,6 +453,7 @@ static const struct object_ops sock_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -471,6 +471,7 @@ static const struct object_ops sock_ops =
</span> add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4496,7 +4516,7 @@ index 06ffd1b81f8..e7081476458 100644
</span> no_satisfied, /* satisfied */
no_signal, /* signal */
sock_get_fd, /* get_fd */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -3562,6 +3563,7 @@ static const struct object_ops ifchange_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3599,6 +3600,7 @@ static const struct object_ops ifchange_ops =
</span> no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4504,7 +4524,7 @@ index 06ffd1b81f8..e7081476458 100644
</span> no_satisfied, /* satisfied */
no_signal, /* signal */
ifchange_get_fd, /* get_fd */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -3783,6 +3785,7 @@ static const struct object_ops socket_device_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3820,6 +3822,7 @@ static const struct object_ops socket_device_ops =
</span> no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4525,7 +4545,7 @@ index dd28efd3a75..d6a51f0091d 100644
</span> no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/thread.c b/server/thread.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 6542e1584ab..7026c785a13 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index f3880eebedb..7cec9704f55 100644
</span> --- a/server/thread.c
+++ b/server/thread.c
@@ -50,6 +50,7 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4577,7 +4597,7 @@ index 6542e1584ab..7026c785a13 100644
</span> thread->system_regs = 0;
thread->queue = NULL;
thread->wait = NULL;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -372,6 +379,12 @@ struct thread *create_thread( int fd, struct process *process, const struct secu
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -373,6 +380,12 @@ struct thread *create_thread( int fd, struct process *process, const struct secu
</span> }
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4590,7 +4610,7 @@ index 6542e1584ab..7026c785a13 100644
</span> set_fd_events( thread->request_fd, POLLIN ); /* start listening to events */
add_process_thread( thread->process, thread );
return thread;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -450,6 +463,12 @@ static void destroy_thread( struct object *obj )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -452,6 +465,12 @@ static void destroy_thread( struct object *obj )
</span> release_object( thread->process );
if (thread->id) free_ptid( thread->id );
if (thread->token) release_object( thread->token );
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4603,7 +4623,7 @@ index 6542e1584ab..7026c785a13 100644
</span> }
/* dump a thread on stdout for debugging purposes */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -468,6 +487,13 @@ static int thread_signaled( struct object *obj, struct wait_queue_entry *entry )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -470,6 +489,13 @@ static int thread_signaled( struct object *obj, struct wait_queue_entry *entry )
</span> return (mythread->state == TERMINATED);
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4617,7 +4637,7 @@ index 6542e1584ab..7026c785a13 100644
</span> static unsigned int thread_map_access( struct object *obj, unsigned int access )
{
access = default_map_access( obj, access );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -520,6 +546,7 @@ static struct thread_apc *create_apc( struct object *owner, const apc_call_t *ca
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -522,6 +548,7 @@ static struct thread_apc *create_apc( struct object *owner, const apc_call_t *ca
</span> apc->result.type = APC_NONE;
if (owner) grab_object( owner );
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4625,7 +4645,7 @@ index 6542e1584ab..7026c785a13 100644
</span> return apc;
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1063,6 +1090,9 @@ void wake_up( struct object *obj, int max )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1065,6 +1092,9 @@ void wake_up( struct object *obj, int max )
</span> struct list *ptr;
int ret;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4635,7 +4655,7 @@ index 6542e1584ab..7026c785a13 100644
</span> LIST_FOR_EACH( ptr, &obj->wait_queue )
{
struct wait_queue_entry *entry = LIST_ENTRY( ptr, struct wait_queue_entry, entry );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1147,8 +1177,12 @@ static int queue_apc( struct process *process, struct thread *thread, struct thr
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1149,8 +1179,12 @@ static int queue_apc( struct process *process, struct thread *thread, struct thr
</span> grab_object( apc );
list_add_tail( queue, &apc->entry );
if (!list_prev( queue, &apc->entry )) /* first one */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4648,7 +4668,7 @@ index 6542e1584ab..7026c785a13 100644
</span> return 1;
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1194,6 +1228,10 @@ static struct thread_apc *thread_dequeue_apc( struct thread *thread, int system
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1196,6 +1230,10 @@ static struct thread_apc *thread_dequeue_apc( struct thread *thread, int system
</span> apc = LIST_ENTRY( ptr, struct thread_apc, entry );
list_remove( ptr );
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4659,7 +4679,7 @@ index 6542e1584ab..7026c785a13 100644
</span> return apc;
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1289,6 +1327,8 @@ void kill_thread( struct thread *thread, int violent_death )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1291,6 +1329,8 @@ void kill_thread( struct thread *thread, int violent_death )
</span> }
kill_console_processes( thread, 0 );
abandon_mutexes( thread );
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4669,10 +4689,10 @@ index 6542e1584ab..7026c785a13 100644
</span> if (violent_death) send_thread_signal( thread, SIGQUIT );
cleanup_thread( thread );
diff --git a/server/thread.h b/server/thread.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 766ed78a72f..d9116df1cba 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 3448f332b0b..44a4bab1148 100644
</span> --- a/server/thread.h
+++ b/server/thread.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -55,6 +55,8 @@ struct thread
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -56,6 +56,8 @@ struct thread
</span> struct process *process;
thread_id_t id; /* thread id */
struct list mutex_list; /* list of currently owned mutexes */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4758,7 +4778,7 @@ index 96dc9d00ca1..75756b27c66 100644
</span>
/* create a timer */
diff --git a/server/token.c b/server/token.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index da7f0bb7ff2..1394d06750a 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 48ee1eca8fe..e3990874159 100644
</span> --- a/server/token.c
+++ b/server/token.c
@@ -145,6 +145,7 @@ static const struct object_ops token_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4770,10 +4790,10 @@ index da7f0bb7ff2..1394d06750a 100644
</span> no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/trace.c b/server/trace.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 96dc5781d4c..345b622d22b 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 5fd69aa420b..8a6825b0b84 100644
</span> --- a/server/trace.c
+++ b/server/trace.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -4641,6 +4641,63 @@ static void dump_set_keyboard_repeat_reply( const struct set_keyboard_repeat_rep
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4808,6 +4808,63 @@ static void dump_set_keyboard_repeat_reply( const struct set_keyboard_repeat_rep
</span> fprintf( stderr, " enable=%d", req->enable );
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4837,7 +4857,7 @@ index 96dc5781d4c..345b622d22b 100644
</span> static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
(dump_func)dump_new_process_request,
(dump_func)dump_get_new_process_info_request,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -4928,6 +4985,11 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -5100,6 +5157,11 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
</span> (dump_func)dump_resume_process_request,
(dump_func)dump_get_next_thread_request,
(dump_func)dump_set_keyboard_repeat_request,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4849,7 +4869,7 @@ index 96dc5781d4c..345b622d22b 100644
</span> };
static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -5217,6 +5279,11 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -5394,6 +5456,11 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
</span> NULL,
(dump_func)dump_get_next_thread_reply,
(dump_func)dump_set_keyboard_repeat_reply,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4861,7 +4881,7 @@ index 96dc5781d4c..345b622d22b 100644
</span> };
static const char * const req_names[REQ_NB_REQUESTS] = {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -5506,6 +5573,11 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -5688,6 +5755,11 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
</span> "resume_process",
"get_next_thread",
"set_keyboard_repeat",
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4874,10 +4894,10 @@ index 96dc5781d4c..345b622d22b 100644
</span>
static const struct
diff --git a/server/window.c b/server/window.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 564c69bf18d..e605324a865 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 7b2a146f406..b646203022f 100644
</span> --- a/server/window.c
+++ b/server/window.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -106,6 +106,7 @@ static const struct object_ops window_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -107,6 +107,7 @@ static const struct object_ops window_ops =
</span> no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4886,7 +4906,7 @@ index 564c69bf18d..e605324a865 100644
</span> no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/winstation.c b/server/winstation.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 76a23b197a4..da1fecf30da 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 1cd7d325fd1..4106d014503 100644
</span> --- a/server/winstation.c
+++ b/server/winstation.c
@@ -76,6 +76,7 @@ static const struct object_ops winstation_ops =
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/emulators/wine-devel/files/1001-staging-msync.diff b/emulators/wine-devel/files/1001-staging-msync.diff
</span><span style='display:block; white-space:pre;color:#808080;'>index 182ed0c7694..3d9c5db42c8 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/emulators/wine-devel/files/1001-staging-msync.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/emulators/wine-devel/files/1001-staging-msync.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -11,7 +11,7 @@ index 78b3fdf94aa..061c730bf63 100644
</span> unix/loadorder.c \
unix/process.c \
diff --git a/dlls/ntdll/unix/esync.c b/dlls/ntdll/unix/esync.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index f4748e405ef..2e116a56f4b 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 86809b610c7..55c15e02c09 100644
</span> --- a/dlls/ntdll/unix/esync.c
+++ b/dlls/ntdll/unix/esync.c
@@ -51,6 +51,7 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -51,7 +51,7 @@ index f4748e405ef..2e116a56f4b 100644
</span> if (obj->type == ESYNC_MANUAL_EVENT)
{
/* Acquire the spinlock. */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -861,7 +868,7 @@ static NTSTATUS __esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -861,7 +868,7 @@ static NTSTATUS __esync_wait_objects( unsigned int count, const HANDLE *handles,
</span> return ret;
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -60,7 +60,7 @@ index f4748e405ef..2e116a56f4b 100644
</span> msgwait = TRUE;
if (has_esync && has_server)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -890,7 +897,7 @@ static NTSTATUS __esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -890,7 +897,7 @@ static NTSTATUS __esync_wait_objects( unsigned int count, const HANDLE *handles,
</span> }
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -70,7 +70,7 @@ index f4748e405ef..2e116a56f4b 100644
</span> /* Try to check objects now, so we can obviate poll() at least. */
for (i = 0; i < count; i++)
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index d8f289054d4..67485a863f5 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index ecc26f3cceb..8784882161e 100644
</span> --- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
@@ -91,6 +91,7 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -81,7 +81,7 @@ index d8f289054d4..67485a863f5 100644
</span> #include "wine/list.h"
#include "ntsyscalls.h"
#include "wine/debug.h"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1859,6 +1860,7 @@ static void start_main_thread(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1901,6 +1902,7 @@ static void start_main_thread(void)
</span> signal_alloc_thread( teb );
dbg_init();
startup_info_size = server_init_process();
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1841,7 +1841,7 @@ index 00000000000..3e6eb2c8b1e
</span> +extern NTSTATUS msync_signal_and_wait( HANDLE signal, HANDLE wait,
+ BOOLEAN alertable, const LARGE_INTEGER *timeout );
diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 77aa995326c..f45db2f3090 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index bc723131d05..0cb08b1e505 100644
</span> --- a/dlls/ntdll/unix/server.c
+++ b/dlls/ntdll/unix/server.c
@@ -84,6 +84,7 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1852,7 +1852,7 @@ index 77aa995326c..f45db2f3090 100644
</span> #include "ddk/wdm.h"
WINE_DEFAULT_DEBUG_CHANNEL(server);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1882,6 +1883,9 @@ NTSTATUS WINAPI NtClose( HANDLE handle )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1899,6 +1900,9 @@ NTSTATUS WINAPI NtClose( HANDLE handle )
</span> * retrieve it again */
fd = remove_fd_from_cache( handle );
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1863,7 +1863,7 @@ index 77aa995326c..f45db2f3090 100644
</span> esync_close( handle );
diff --git a/dlls/ntdll/unix/sync.c b/dlls/ntdll/unix/sync.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index a52327841d2..3e3d2ea1fb4 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index ead6d3bab80..0ffbb7bac2c 100644
</span> --- a/dlls/ntdll/unix/sync.c
+++ b/dlls/ntdll/unix/sync.c
@@ -67,6 +67,7 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1874,7 +1874,7 @@ index a52327841d2..3e3d2ea1fb4 100644
</span>
WINE_DEFAULT_DEBUG_CHANNEL(sync);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -320,6 +321,9 @@ NTSTATUS WINAPI NtCreateSemaphore( HANDLE *handle, ACCESS_MASK access, const OBJ
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -316,6 +317,9 @@ NTSTATUS WINAPI NtCreateSemaphore( HANDLE *handle, ACCESS_MASK access, const OBJ
</span> if (max <= 0 || initial < 0 || initial > max) return STATUS_INVALID_PARAMETER;
if ((ret = alloc_object_attributes( attr, &objattr, &len ))) return ret;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1884,7 +1884,7 @@ index a52327841d2..3e3d2ea1fb4 100644
</span> if (do_esync())
return esync_create_semaphore( handle, access, attr, initial, max );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -348,6 +352,9 @@ NTSTATUS WINAPI NtOpenSemaphore( HANDLE *handle, ACCESS_MASK access, const OBJEC
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -344,6 +348,9 @@ NTSTATUS WINAPI NtOpenSemaphore( HANDLE *handle, ACCESS_MASK access, const OBJEC
</span>
*handle = 0;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1894,7 +1894,7 @@ index a52327841d2..3e3d2ea1fb4 100644
</span> if (do_esync())
return esync_open_semaphore( handle, access, attr );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -387,6 +394,9 @@ NTSTATUS WINAPI NtQuerySemaphore( HANDLE handle, SEMAPHORE_INFORMATION_CLASS cla
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -383,6 +390,9 @@ NTSTATUS WINAPI NtQuerySemaphore( HANDLE handle, SEMAPHORE_INFORMATION_CLASS cla
</span>
if (len != sizeof(SEMAPHORE_BASIC_INFORMATION)) return STATUS_INFO_LENGTH_MISMATCH;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1904,7 +1904,7 @@ index a52327841d2..3e3d2ea1fb4 100644
</span> if (do_esync())
return esync_query_semaphore( handle, info, ret_len );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -412,6 +422,9 @@ NTSTATUS WINAPI NtReleaseSemaphore( HANDLE handle, ULONG count, ULONG *previous
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -408,6 +418,9 @@ NTSTATUS WINAPI NtReleaseSemaphore( HANDLE handle, ULONG count, ULONG *previous
</span> {
unsigned int ret;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1914,7 +1914,7 @@ index a52327841d2..3e3d2ea1fb4 100644
</span> if (do_esync())
return esync_release_semaphore( handle, count, previous );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -442,6 +455,9 @@ NTSTATUS WINAPI NtCreateEvent( HANDLE *handle, ACCESS_MASK access, const OBJECT_
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -438,6 +451,9 @@ NTSTATUS WINAPI NtCreateEvent( HANDLE *handle, ACCESS_MASK access, const OBJECT_
</span> *handle = 0;
if (type != NotificationEvent && type != SynchronizationEvent) return STATUS_INVALID_PARAMETER;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1924,7 +1924,7 @@ index a52327841d2..3e3d2ea1fb4 100644
</span> if (do_esync())
return esync_create_event( handle, access, attr, type, state );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -473,6 +489,9 @@ NTSTATUS WINAPI NtOpenEvent( HANDLE *handle, ACCESS_MASK access, const OBJECT_AT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -469,6 +485,9 @@ NTSTATUS WINAPI NtOpenEvent( HANDLE *handle, ACCESS_MASK access, const OBJECT_AT
</span> *handle = 0;
if ((ret = validate_open_object_attributes( attr ))) return ret;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1934,7 +1934,7 @@ index a52327841d2..3e3d2ea1fb4 100644
</span> if (do_esync())
return esync_open_event( handle, access, attr );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -499,6 +518,9 @@ NTSTATUS WINAPI NtSetEvent( HANDLE handle, LONG *prev_state )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -495,6 +514,9 @@ NTSTATUS WINAPI NtSetEvent( HANDLE handle, LONG *prev_state )
</span> /* This comment is a dummy to make sure this patch applies in the right place. */
unsigned int ret;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1944,7 +1944,7 @@ index a52327841d2..3e3d2ea1fb4 100644
</span> if (do_esync())
return esync_set_event( handle );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -522,6 +544,9 @@ NTSTATUS WINAPI NtResetEvent( HANDLE handle, LONG *prev_state )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -518,6 +540,9 @@ NTSTATUS WINAPI NtResetEvent( HANDLE handle, LONG *prev_state )
</span> /* This comment is a dummy to make sure this patch applies in the right place. */
unsigned int ret;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1954,7 +1954,7 @@ index a52327841d2..3e3d2ea1fb4 100644
</span> if (do_esync())
return esync_reset_event( handle );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -555,6 +580,9 @@ NTSTATUS WINAPI NtPulseEvent( HANDLE handle, LONG *prev_state )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -551,6 +576,9 @@ NTSTATUS WINAPI NtPulseEvent( HANDLE handle, LONG *prev_state )
</span> {
unsigned int ret;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1964,7 +1964,7 @@ index a52327841d2..3e3d2ea1fb4 100644
</span> if (do_esync())
return esync_pulse_event( handle );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -589,6 +617,9 @@ NTSTATUS WINAPI NtQueryEvent( HANDLE handle, EVENT_INFORMATION_CLASS class,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -585,6 +613,9 @@ NTSTATUS WINAPI NtQueryEvent( HANDLE handle, EVENT_INFORMATION_CLASS class,
</span>
if (len != sizeof(EVENT_BASIC_INFORMATION)) return STATUS_INFO_LENGTH_MISMATCH;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1974,7 +1974,7 @@ index a52327841d2..3e3d2ea1fb4 100644
</span> if (do_esync())
return esync_query_event( handle, info, ret_len );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -619,6 +650,9 @@ NTSTATUS WINAPI NtCreateMutant( HANDLE *handle, ACCESS_MASK access, const OBJECT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -615,6 +646,9 @@ NTSTATUS WINAPI NtCreateMutant( HANDLE *handle, ACCESS_MASK access, const OBJECT
</span>
*handle = 0;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1984,7 +1984,7 @@ index a52327841d2..3e3d2ea1fb4 100644
</span> if (do_esync())
return esync_create_mutex( handle, access, attr, owned );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -649,6 +683,9 @@ NTSTATUS WINAPI NtOpenMutant( HANDLE *handle, ACCESS_MASK access, const OBJECT_A
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -645,6 +679,9 @@ NTSTATUS WINAPI NtOpenMutant( HANDLE *handle, ACCESS_MASK access, const OBJECT_A
</span> *handle = 0;
if ((ret = validate_open_object_attributes( attr ))) return ret;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1994,7 +1994,7 @@ index a52327841d2..3e3d2ea1fb4 100644
</span> if (do_esync())
return esync_open_mutex( handle, access, attr );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -674,6 +711,9 @@ NTSTATUS WINAPI NtReleaseMutant( HANDLE handle, LONG *prev_count )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -670,6 +707,9 @@ NTSTATUS WINAPI NtReleaseMutant( HANDLE handle, LONG *prev_count )
</span> {
unsigned int ret;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2004,7 +2004,7 @@ index a52327841d2..3e3d2ea1fb4 100644
</span> if (do_esync())
return esync_release_mutex( handle, prev_count );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -707,6 +747,9 @@ NTSTATUS WINAPI NtQueryMutant( HANDLE handle, MUTANT_INFORMATION_CLASS class,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -703,6 +743,9 @@ NTSTATUS WINAPI NtQueryMutant( HANDLE handle, MUTANT_INFORMATION_CLASS class,
</span>
if (len != sizeof(MUTANT_BASIC_INFORMATION)) return STATUS_INFO_LENGTH_MISMATCH;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2014,7 +2014,7 @@ index a52327841d2..3e3d2ea1fb4 100644
</span> if (do_esync())
return esync_query_mutex( handle, info, ret_len );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1630,6 +1673,13 @@ NTSTATUS WINAPI NtWaitForMultipleObjects( DWORD count, const HANDLE *handles, BO
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1626,6 +1669,13 @@ NTSTATUS WINAPI NtWaitForMultipleObjects( DWORD count, const HANDLE *handles, BO
</span>
if (!count || count > MAXIMUM_WAIT_OBJECTS) return STATUS_INVALID_PARAMETER_1;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2028,7 +2028,7 @@ index a52327841d2..3e3d2ea1fb4 100644
</span> if (do_esync())
{
NTSTATUS ret = esync_wait_objects( count, handles, wait_any, alertable, timeout );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1662,6 +1712,9 @@ NTSTATUS WINAPI NtSignalAndWaitForSingleObject( HANDLE signal, HANDLE wait,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1658,6 +1708,9 @@ NTSTATUS WINAPI NtSignalAndWaitForSingleObject( HANDLE signal, HANDLE wait,
</span> select_op_t select_op;
UINT flags = SELECT_INTERRUPTIBLE;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2038,7 +2038,7 @@ index a52327841d2..3e3d2ea1fb4 100644
</span> if (do_esync())
return esync_signal_and_wait( signal, wait, alertable, timeout );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1705,7 +1758,24 @@ NTSTATUS WINAPI NtYieldExecution(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1701,7 +1754,24 @@ NTSTATUS WINAPI NtYieldExecution(void)
</span> NTSTATUS WINAPI NtDelayExecution( BOOLEAN alertable, const LARGE_INTEGER *timeout )
{
/* if alertable, we need to query the server */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2065,7 +2065,7 @@ index a52327841d2..3e3d2ea1fb4 100644
</span> if (!timeout || timeout->QuadPart == TIMEOUT_INFINITE) /* sleep forever */
{
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 0f92988d9d5..8f62d380cc4 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 4419e3feda3..dc7402ceee3 100644
</span> --- a/dlls/ntdll/unix/unix_private.h
+++ b/dlls/ntdll/unix/unix_private.h
@@ -104,6 +104,8 @@ struct ntdll_thread_data
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2078,10 +2078,10 @@ index 0f92988d9d5..8f62d380cc4 100644
</span> int reply_fd; /* fd for receiving server replies */
int wait_fd[2]; /* fd for sleeping server requests */
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 75088a2036d..8f55f14ca66 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index c4e30fbbbef..bafb959345e 100644
</span> --- a/dlls/ntdll/unix/virtual.c
+++ b/dlls/ntdll/unix/virtual.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -3700,6 +3700,8 @@ static TEB *init_teb( void *ptr, BOOL is_wow )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3728,6 +3728,8 @@ static TEB *init_teb( void *ptr, BOOL is_wow )
</span> teb->StaticUnicodeString.MaximumLength = sizeof(teb->StaticUnicodeBuffer);
thread_data = (struct ntdll_thread_data *)&teb->GdiTebBatch;
thread_data->esync_apc_fd = -1;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2091,10 +2091,10 @@ index 75088a2036d..8f55f14ca66 100644
</span> thread_data->reply_fd = -1;
thread_data->wait_fd[0] = -1;
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 44f18710766..e6610d3cab5 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 47d4edbabf2..78b6aa34322 100644
</span> --- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -5830,6 +5830,92 @@ struct get_esync_apc_fd_reply
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -5976,6 +5976,92 @@ struct get_esync_apc_fd_reply
</span> struct reply_header __header;
};
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2187,7 +2187,7 @@ index 44f18710766..e6610d3cab5 100644
</span>
enum request
{
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -6125,6 +6211,11 @@ enum request
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -6276,6 +6362,11 @@ enum request
</span> REQ_esync_msgwait,
REQ_set_keyboard_repeat,
REQ_get_esync_apc_fd,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2199,7 +2199,7 @@ index 44f18710766..e6610d3cab5 100644
</span> REQ_NB_REQUESTS
};
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -6424,6 +6515,11 @@ union generic_request
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -6580,6 +6671,11 @@ union generic_request
</span> struct esync_msgwait_request esync_msgwait_request;
struct set_keyboard_repeat_request set_keyboard_repeat_request;
struct get_esync_apc_fd_request get_esync_apc_fd_request;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2211,7 +2211,7 @@ index 44f18710766..e6610d3cab5 100644
</span> };
union generic_reply
{
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -6721,11 +6817,16 @@ union generic_reply
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -6882,11 +6978,16 @@ union generic_reply
</span> struct esync_msgwait_reply esync_msgwait_reply;
struct set_keyboard_repeat_reply set_keyboard_repeat_reply;
struct get_esync_apc_fd_reply get_esync_apc_fd_reply;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2224,8 +2224,8 @@ index 44f18710766..e6610d3cab5 100644
</span>
/* ### protocol_version begin ### */
<span style='display:block; white-space:pre;background:#ffe0e0;'>--#define SERVER_PROTOCOL_VERSION 844
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define SERVER_PROTOCOL_VERSION 848
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#define SERVER_PROTOCOL_VERSION 848
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define SERVER_PROTOCOL_VERSION 852
</span>
/* ### protocol_version end ### */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2242,10 +2242,10 @@ index 87103cb2002..85b7b8f6693 100644
</span> hook.c \
mach.c \
diff --git a/server/async.c b/server/async.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index bea720b1f19..2dff610f4bd 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 2377c737e98..5b0f09d7799 100644
</span> --- a/server/async.c
+++ b/server/async.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -78,6 +78,7 @@ static const struct object_ops async_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -79,6 +79,7 @@ static const struct object_ops async_ops =
</span> remove_queue, /* remove_queue */
async_signaled, /* signaled */
NULL, /* get_esync_fd */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2253,7 +2253,7 @@ index bea720b1f19..2dff610f4bd 100644
</span> async_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -688,6 +689,7 @@ static const struct object_ops iosb_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -700,6 +701,7 @@ static const struct object_ops iosb_ops =
</span> NULL, /* remove_queue */
NULL, /* signaled */
NULL, /* get_esync_fd */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2274,7 +2274,7 @@ index d9824de8eac..d99f10d6f19 100644
</span> no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/change.c b/server/change.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 17a29c02867..84d4b25252b 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 682c7f724f0..f9ee9ef6329 100644
</span> --- a/server/change.c
+++ b/server/change.c
@@ -113,6 +113,7 @@ static const struct object_ops dir_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2286,7 +2286,7 @@ index 17a29c02867..84d4b25252b 100644
</span> no_signal, /* signal */
dir_get_fd, /* get_fd */
diff --git a/server/clipboard.c b/server/clipboard.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 8b265f2dcea..e7149f20488 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 0df7fd2f18e..ffc8ef20869 100644
</span> --- a/server/clipboard.c
+++ b/server/clipboard.c
@@ -77,6 +77,7 @@ static const struct object_ops clipboard_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2298,10 +2298,10 @@ index 8b265f2dcea..e7149f20488 100644
</span> no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/completion.c b/server/completion.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 3d4be86a212..d761d372314 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 9093132efac..6d82b022599 100644
</span> --- a/server/completion.c
+++ b/server/completion.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -76,6 +76,7 @@ static const struct object_ops completion_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -168,6 +168,7 @@ static const struct object_ops completion_ops =
</span> remove_queue, /* remove_queue */
completion_signaled, /* signaled */
NULL, /* get_esync_fd */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2593,7 +2593,7 @@ index c45d0102a56..93e22bbd78a 100644
</span> esync_clear( manager->esync_fd );
}
diff --git a/server/directory.c b/server/directory.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 1c44ded4606..962daee2045 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index a6c0e292071..076f8fe0d58 100644
</span> --- a/server/directory.c
+++ b/server/directory.c
@@ -70,6 +70,7 @@ static const struct object_ops object_type_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2765,10 +2765,10 @@ index f4ca3e48c6f..2770d83e6d6 100644
</span> close( event->esync_fd );
}
diff --git a/server/fd.c b/server/fd.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index b90999aae3c..17132109b8e 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 7054d46aea0..7cb0a1897ae 100644
</span> --- a/server/fd.c
+++ b/server/fd.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -98,6 +98,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -96,6 +96,7 @@
</span> #include "process.h"
#include "request.h"
#include "esync.h"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2776,7 +2776,7 @@ index b90999aae3c..17132109b8e 100644
</span>
#include "winternl.h"
#include "winioctl.h"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -163,6 +164,7 @@ struct fd
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -161,6 +162,7 @@ struct fd
</span> apc_param_t comp_key; /* completion key to set in completion events */
unsigned int comp_flags; /* completion flags */
int esync_fd; /* esync file descriptor */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2784,7 +2784,7 @@ index b90999aae3c..17132109b8e 100644
</span> };
static void fd_dump( struct object *obj, int verbose );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -177,6 +179,7 @@ static const struct object_ops fd_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -175,6 +177,7 @@ static const struct object_ops fd_ops =
</span> NULL, /* remove_queue */
NULL, /* signaled */
NULL, /* get_esync_fd */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2792,7 +2792,7 @@ index b90999aae3c..17132109b8e 100644
</span> NULL, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -219,6 +222,7 @@ static const struct object_ops device_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -217,6 +220,7 @@ static const struct object_ops device_ops =
</span> NULL, /* remove_queue */
NULL, /* signaled */
NULL, /* get_esync_fd */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2800,7 +2800,7 @@ index b90999aae3c..17132109b8e 100644
</span> NULL, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -260,6 +264,7 @@ static const struct object_ops inode_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -258,6 +262,7 @@ static const struct object_ops inode_ops =
</span> NULL, /* remove_queue */
NULL, /* signaled */
NULL, /* get_esync_fd */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2808,7 +2808,7 @@ index b90999aae3c..17132109b8e 100644
</span> NULL, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -303,6 +308,7 @@ static const struct object_ops file_lock_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -301,6 +306,7 @@ static const struct object_ops file_lock_ops =
</span> remove_queue, /* remove_queue */
file_lock_signaled, /* signaled */
NULL, /* get_esync_fd */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2816,7 +2816,7 @@ index b90999aae3c..17132109b8e 100644
</span> no_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1652,6 +1658,9 @@ static void fd_destroy( struct object *obj )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1650,6 +1656,9 @@ static void fd_destroy( struct object *obj )
</span> free( fd->unix_name );
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2826,7 +2826,7 @@ index b90999aae3c..17132109b8e 100644
</span> if (do_esync())
close( fd->esync_fd );
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1773,6 +1782,7 @@ static struct fd *alloc_fd_object(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1771,6 +1780,7 @@ static struct fd *alloc_fd_object(void)
</span> fd->completion = NULL;
fd->comp_flags = 0;
fd->esync_fd = -1;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2834,7 +2834,7 @@ index b90999aae3c..17132109b8e 100644
</span> init_async_queue( &fd->read_q );
init_async_queue( &fd->write_q );
init_async_queue( &fd->wait_q );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1782,6 +1792,9 @@ static struct fd *alloc_fd_object(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1780,6 +1790,9 @@ static struct fd *alloc_fd_object(void)
</span> if (do_esync())
fd->esync_fd = esync_create_fd( 1, 0 );
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2844,7 +2844,7 @@ index b90999aae3c..17132109b8e 100644
</span> if ((fd->poll_index = add_poll_user( fd )) == -1)
{
release_object( fd );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1818,14 +1831,19 @@ struct fd *alloc_pseudo_fd( const struct fd_ops *fd_user_ops, struct object *use
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1816,14 +1829,19 @@ struct fd *alloc_pseudo_fd( const struct fd_ops *fd_user_ops, struct object *use
</span> fd->comp_flags = 0;
fd->no_fd_status = STATUS_BAD_DEVICE_TYPE;
fd->esync_fd = -1;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2864,7 +2864,7 @@ index b90999aae3c..17132109b8e 100644
</span> return fd;
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2284,6 +2302,9 @@ void set_fd_signaled( struct fd *fd, int signaled )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2275,6 +2293,9 @@ void set_fd_signaled( struct fd *fd, int signaled )
</span> fd->signaled = signaled;
if (signaled) wake_up( fd->user, 0 );
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2874,7 +2874,7 @@ index b90999aae3c..17132109b8e 100644
</span> if (do_esync() && !signaled)
esync_clear( fd->esync_fd );
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2320,6 +2341,15 @@ int default_fd_get_esync_fd( struct object *obj, enum esync_type *type )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2311,6 +2332,15 @@ int default_fd_get_esync_fd( struct object *obj, enum esync_type *type )
</span> return ret;
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2891,7 +2891,7 @@ index b90999aae3c..17132109b8e 100644
</span> {
int events = 0;
diff --git a/server/file.c b/server/file.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 828a21c08c6..017c89bf025 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 330d956ac15..124321cfb06 100644
</span> --- a/server/file.c
+++ b/server/file.c
@@ -124,6 +124,7 @@ static const struct object_ops file_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2903,7 +2903,7 @@ index 828a21c08c6..017c89bf025 100644
</span> no_signal, /* signal */
file_get_fd, /* get_fd */
diff --git a/server/file.h b/server/file.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 0a81d7c4a3d..2654cb15ed7 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 5e192216abe..aefecfbd6e4 100644
</span> --- a/server/file.h
+++ b/server/file.h
@@ -109,6 +109,7 @@ extern void get_nt_name( struct fd *fd, struct unicode_str *name );
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2915,7 +2915,7 @@ index 0a81d7c4a3d..2654cb15ed7 100644
</span> extern void default_poll_event( struct fd *fd, int event );
extern void fd_cancel_async( struct fd *fd, struct async *async );
diff --git a/server/handle.c b/server/handle.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 7fc24d12a34..0d3e1f74655 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index e6c5707556f..d605bcea752 100644
</span> --- a/server/handle.c
+++ b/server/handle.c
@@ -127,6 +127,7 @@ static const struct object_ops handle_table_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2939,7 +2939,7 @@ index ab4d0e9dd31..0bbdcc5aa88 100644
</span> no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/mailslot.c b/server/mailslot.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index a8258328364..6301cdf06c1 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 92fe938d3b9..5c39ba6fa73 100644
</span> --- a/server/mailslot.c
+++ b/server/mailslot.c
@@ -82,6 +82,7 @@ static const struct object_ops mailslot_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2975,7 +2975,7 @@ index a8258328364..6301cdf06c1 100644
</span> no_signal, /* signal */
mailslot_device_file_get_fd, /* get_fd */
diff --git a/server/main.c b/server/main.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 5062d0999fa..d5a8c05cb86 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 5062d0999fa..f0299e5fa70 100644
</span> --- a/server/main.c
+++ b/server/main.c
@@ -35,6 +35,7 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2996,14 +2996,14 @@ index 5062d0999fa..d5a8c05cb86 100644
</span> if (do_esync())
esync_init();
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (!do_msync() && !do_esync())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (!do_msync() && !do_esync() && debug_level)
</span> + fprintf( stderr, "wineserver: using server-side synchronization.\n" );
+
if (debug_level) fprintf( stderr, "wineserver: starting (pid=%ld)\n", (long) getpid() );
set_current_time();
init_scheduler();
diff --git a/server/mapping.c b/server/mapping.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index bdb9ee5d840..597416130f1 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index b84bb08a77b..9ec2d28932c 100644
</span> --- a/server/mapping.c
+++ b/server/mapping.c
@@ -68,6 +68,7 @@ static const struct object_ops ranges_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4083,7 +4083,7 @@ index 4785a830e92..6a60adee0bd 100644
</span> mutex_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/named_pipe.c b/server/named_pipe.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 8ba8126563a..6396ea532b0 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 06a8e9d4625..49547a4b381 100644
</span> --- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -120,6 +120,7 @@ static const struct object_ops named_pipe_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4126,8 +4126,28 @@ index 8ba8126563a..6396ea532b0 100644
</span> no_satisfied, /* satisfied */
no_signal, /* signal */
named_pipe_device_file_get_fd, /* get_fd */
<span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/server/object.c b/server/object.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index f0423a305de..c53e0c0fda2 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/server/object.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/server/object.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -109,6 +109,7 @@ static const struct object_ops apc_reserve_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ NULL, /* remove_queue */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ NULL, /* signaled */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ NULL, /* get_esync_fd */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ NULL, /* get_msync_idx */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ no_satisfied, /* satisfied */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ no_signal, /* signal */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ no_get_fd, /* get_fd */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -134,6 +135,7 @@ static const struct object_ops completion_reserve_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ NULL, /* remove_queue */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ NULL, /* signaled */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ NULL, /* get_esync_fd */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ NULL, /* get_msync_idx */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ no_satisfied, /* satisfied */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ no_signal, /* signal */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ no_get_fd, /* get_fd */
</span> diff --git a/server/object.h b/server/object.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index a6e9af93664..a59eb135501 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 9f508083a6a..0c6cbc02a93 100644
</span> --- a/server/object.h
+++ b/server/object.h
@@ -80,6 +80,8 @@ struct object_ops
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4140,7 +4160,7 @@ index a6e9af93664..a59eb135501 100644
</span> void (*satisfied)(struct object *,struct wait_queue_entry *);
/* signal an object */
diff --git a/server/process.c b/server/process.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index ce34f46166a..93bcd822b38 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index dcc8be09c69..654b610fc9a 100644
</span> --- a/server/process.c
+++ b/server/process.c
@@ -64,6 +64,7 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4236,10 +4256,10 @@ index bedd8bb4586..24276142a63 100644
</span>
/* process functions */
diff --git a/server/protocol.def b/server/protocol.def
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 47c76c17c5b..5475a51639d 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 71705a5c75d..b1c960ac321 100644
</span> --- a/server/protocol.def
+++ b/server/protocol.def
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -4023,3 +4023,57 @@ enum esync_type
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4137,3 +4137,57 @@ enum esync_type
</span> /* Retrieve the fd to wait on for user APCs. */
@REQ(get_esync_apc_fd)
@END
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4298,7 +4318,7 @@ index 47c76c17c5b..5475a51639d 100644
</span> + unsigned int shm_idx;
+@END
diff --git a/server/queue.c b/server/queue.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index ef4283e27df..c6dd91f8d4a 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index c718f23488d..e3b71775303 100644
</span> --- a/server/queue.c
+++ b/server/queue.c
@@ -45,6 +45,7 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4361,7 +4381,7 @@ index ef4283e27df..c6dd91f8d4a 100644
</span> thread->queue = queue;
if ((desktop = get_thread_desktop( thread, 0 )))
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -754,6 +765,9 @@ static inline void clear_queue_bits( struct msg_queue *queue, unsigned int bits
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -762,6 +773,9 @@ static inline void clear_queue_bits( struct msg_queue *queue, unsigned int bits
</span> queue->keystate_lock = 0;
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4371,7 +4391,7 @@ index ef4283e27df..c6dd91f8d4a 100644
</span> if (do_esync() && !is_signaled( queue ))
esync_clear( queue->esync_fd );
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1245,6 +1259,9 @@ static int is_queue_hung( struct msg_queue *queue )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1253,6 +1267,9 @@ static int is_queue_hung( struct msg_queue *queue )
</span> return 0; /* thread is waiting on queue -> not hung */
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4381,7 +4401,7 @@ index ef4283e27df..c6dd91f8d4a 100644
</span> if (do_esync() && queue->esync_in_msgwait)
return 0; /* thread is waiting on queue in absentia -> not hung */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1309,6 +1326,13 @@ static int msg_queue_get_esync_fd( struct object *obj, enum esync_type *type )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1317,6 +1334,13 @@ static int msg_queue_get_esync_fd( struct object *obj, enum esync_type *type )
</span> return queue->esync_fd;
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4395,7 +4415,7 @@ index ef4283e27df..c6dd91f8d4a 100644
</span> static void msg_queue_satisfied( struct object *obj, struct wait_queue_entry *entry )
{
struct msg_queue *queue = (struct msg_queue *)obj;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1366,6 +1390,8 @@ static void msg_queue_destroy( struct object *obj )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1374,6 +1398,8 @@ static void msg_queue_destroy( struct object *obj )
</span> if (queue->fd) release_object( queue->fd );
if (queue->shared) free_shared_object( queue->shared );
if (do_esync()) close( queue->esync_fd );
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4404,7 +4424,7 @@ index ef4283e27df..c6dd91f8d4a 100644
</span> }
static void msg_queue_poll_event( struct fd *fd, int event )
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -3152,6 +3178,9 @@ DECL_HANDLER(set_queue_mask)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3161,6 +3187,9 @@ DECL_HANDLER(set_queue_mask)
</span> else wake_up( &queue->obj, 0 );
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4414,7 +4434,7 @@ index ef4283e27df..c6dd91f8d4a 100644
</span> if (do_esync() && !is_signaled( queue ))
esync_clear( queue->esync_fd );
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -3175,6 +3204,9 @@ DECL_HANDLER(get_queue_status)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3184,6 +3213,9 @@ DECL_HANDLER(get_queue_status)
</span> }
SHARED_WRITE_END;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4424,7 +4444,7 @@ index ef4283e27df..c6dd91f8d4a 100644
</span> if (do_esync() && !is_signaled( queue ))
esync_clear( queue->esync_fd );
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -3446,6 +3478,9 @@ DECL_HANDLER(get_message)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3455,6 +3487,9 @@ DECL_HANDLER(get_message)
</span>
set_error( STATUS_PENDING ); /* FIXME */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4434,7 +4454,7 @@ index ef4283e27df..c6dd91f8d4a 100644
</span> if (do_esync() && !is_signaled( queue ))
esync_clear( queue->esync_fd );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -4248,6 +4283,23 @@ DECL_HANDLER(esync_msgwait)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4257,6 +4292,23 @@ DECL_HANDLER(esync_msgwait)
</span> set_fd_events( queue->fd, req->in_msgwait ? POLLIN : 0 );
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4459,7 +4479,7 @@ index ef4283e27df..c6dd91f8d4a 100644
</span> {
struct desktop *desktop;
diff --git a/server/registry.c b/server/registry.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 1cca1acfe6b..eb54495208c 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 2205d214ffb..3601e6e5c46 100644
</span> --- a/server/registry.c
+++ b/server/registry.c
@@ -181,6 +181,7 @@ static const struct object_ops key_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4471,7 +4491,7 @@ index 1cca1acfe6b..eb54495208c 100644
</span> no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/request.c b/server/request.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 8e7d88a0d4c..3287b16170d 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 832a33917b4..2e76c45952c 100644
</span> --- a/server/request.c
+++ b/server/request.c
@@ -91,6 +91,7 @@ static const struct object_ops master_socket_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4483,10 +4503,10 @@ index 8e7d88a0d4c..3287b16170d 100644
</span> no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/request.h b/server/request.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index b8a3f24f521..a73b9bdd2f3 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 6d27205cac1..413d22e004c 100644
</span> --- a/server/request.h
+++ b/server/request.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -411,6 +411,11 @@ DECL_HANDLER(get_esync_fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -416,6 +416,11 @@ DECL_HANDLER(get_esync_fd);
</span> DECL_HANDLER(esync_msgwait);
DECL_HANDLER(set_keyboard_repeat);
DECL_HANDLER(get_esync_apc_fd);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4498,7 +4518,7 @@ index b8a3f24f521..a73b9bdd2f3 100644
</span>
#ifdef WANT_REQUEST_HANDLERS
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -709,6 +714,11 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -719,6 +724,11 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
</span> (req_handler)req_esync_msgwait,
(req_handler)req_set_keyboard_repeat,
(req_handler)req_get_esync_apc_fd,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4510,7 +4530,7 @@ index b8a3f24f521..a73b9bdd2f3 100644
</span> };
C_ASSERT( sizeof(abstime_t) == 8 );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2387,6 +2397,34 @@ C_ASSERT( sizeof(struct set_keyboard_repeat_request) == 24 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2420,6 +2430,34 @@ C_ASSERT( sizeof(struct set_keyboard_repeat_request) == 24 );
</span> C_ASSERT( FIELD_OFFSET(struct set_keyboard_repeat_reply, enable) == 8 );
C_ASSERT( sizeof(struct set_keyboard_repeat_reply) == 16 );
C_ASSERT( sizeof(struct get_esync_apc_fd_request) == 16 );
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4582,10 +4602,10 @@ index 55cd6aa037e..e86ad49df8e 100644
</span> no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/sock.c b/server/sock.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 3110a125add..3b6fb723548 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 44a4e3b7b15..1d3071c3b90 100644
</span> --- a/server/sock.c
+++ b/server/sock.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -454,6 +454,7 @@ static const struct object_ops sock_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -472,6 +472,7 @@ static const struct object_ops sock_ops =
</span> remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
NULL, /* get_esync_fd */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4593,7 +4613,7 @@ index 3110a125add..3b6fb723548 100644
</span> no_satisfied, /* satisfied */
no_signal, /* signal */
sock_get_fd, /* get_fd */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -3564,6 +3565,7 @@ static const struct object_ops ifchange_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3601,6 +3602,7 @@ static const struct object_ops ifchange_ops =
</span> NULL, /* remove_queue */
NULL, /* signaled */
NULL, /* get_esync_fd */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4601,7 +4621,7 @@ index 3110a125add..3b6fb723548 100644
</span> no_satisfied, /* satisfied */
no_signal, /* signal */
ifchange_get_fd, /* get_fd */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -3786,6 +3788,7 @@ static const struct object_ops socket_device_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3823,6 +3825,7 @@ static const struct object_ops socket_device_ops =
</span> NULL, /* remove_queue */
NULL, /* signaled */
NULL, /* get_esync_fd */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4622,7 +4642,7 @@ index c7f34412317..d40d060492b 100644
</span> no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/thread.c b/server/thread.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index dac5c43e3bd..5003898e822 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 74a586d7986..b2c3f49bbe2 100644
</span> --- a/server/thread.c
+++ b/server/thread.c
@@ -51,6 +51,7 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4674,7 +4694,7 @@ index dac5c43e3bd..5003898e822 100644
</span> thread->system_regs = 0;
thread->queue = NULL;
thread->wait = NULL;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -380,6 +387,12 @@ struct thread *create_thread( int fd, struct process *process, const struct secu
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -381,6 +388,12 @@ struct thread *create_thread( int fd, struct process *process, const struct secu
</span> }
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4687,7 +4707,7 @@ index dac5c43e3bd..5003898e822 100644
</span> if (do_esync())
{
thread->esync_fd = esync_create_fd( 0, 0 );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -468,6 +481,12 @@ static void destroy_thread( struct object *obj )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -470,6 +483,12 @@ static void destroy_thread( struct object *obj )
</span>
if (do_esync())
close( thread->esync_fd );
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4700,7 +4720,7 @@ index dac5c43e3bd..5003898e822 100644
</span> }
/* dump a thread on stdout for debugging purposes */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -493,6 +512,13 @@ static int thread_get_esync_fd( struct object *obj, enum esync_type *type )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -495,6 +514,13 @@ static int thread_get_esync_fd( struct object *obj, enum esync_type *type )
</span> return thread->esync_fd;
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4714,7 +4734,7 @@ index dac5c43e3bd..5003898e822 100644
</span> static unsigned int thread_map_access( struct object *obj, unsigned int access )
{
access = default_map_access( obj, access );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -545,6 +571,7 @@ static struct thread_apc *create_apc( struct object *owner, const apc_call_t *ca
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -547,6 +573,7 @@ static struct thread_apc *create_apc( struct object *owner, const apc_call_t *ca
</span> apc->result.type = APC_NONE;
if (owner) grab_object( owner );
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4722,7 +4742,7 @@ index dac5c43e3bd..5003898e822 100644
</span> return apc;
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1091,6 +1118,9 @@ void wake_up( struct object *obj, int max )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1093,6 +1120,9 @@ void wake_up( struct object *obj, int max )
</span> struct list *ptr;
int ret;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4732,7 +4752,7 @@ index dac5c43e3bd..5003898e822 100644
</span> if (do_esync())
esync_wake_up( obj );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1181,6 +1211,9 @@ static int queue_apc( struct process *process, struct thread *thread, struct thr
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1183,6 +1213,9 @@ static int queue_apc( struct process *process, struct thread *thread, struct thr
</span> {
wake_thread( thread );
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4742,7 +4762,7 @@ index dac5c43e3bd..5003898e822 100644
</span> if (do_esync() && queue == &thread->user_apc)
esync_wake_fd( thread->esync_apc_fd );
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1231,6 +1264,9 @@ static struct thread_apc *thread_dequeue_apc( struct thread *thread, int system
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1233,6 +1266,9 @@ static struct thread_apc *thread_dequeue_apc( struct thread *thread, int system
</span> list_remove( ptr );
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4752,7 +4772,7 @@ index dac5c43e3bd..5003898e822 100644
</span> if (do_esync() && list_empty( &thread->system_apc ) && list_empty( &thread->user_apc ))
esync_clear( thread->esync_apc_fd );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1349,6 +1385,8 @@ void kill_thread( struct thread *thread, int violent_death )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1351,6 +1387,8 @@ void kill_thread( struct thread *thread, int violent_death )
</span> }
kill_console_processes( thread, 0 );
abandon_mutexes( thread );
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4762,10 +4782,10 @@ index dac5c43e3bd..5003898e822 100644
</span> esync_abandon_mutexes( thread );
if (violent_death)
diff --git a/server/thread.h b/server/thread.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 10e9e28b432..26b41745261 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 16f3e79b540..43fbc318093 100644
</span> --- a/server/thread.h
+++ b/server/thread.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -57,6 +57,8 @@ struct thread
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -58,6 +58,8 @@ struct thread
</span> struct list mutex_list; /* list of currently owned mutexes */
int esync_fd; /* esync file descriptor (signalled on exit) */
int esync_apc_fd; /* esync apc fd (signalled when APCs are present) */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4852,7 +4872,7 @@ index 36645a2a8d2..d57a5536eb3 100644
</span>
/* create a timer */
diff --git a/server/token.c b/server/token.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index e40ba10f9aa..1101c7224b9 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 479596bdbfa..5a9187e79a3 100644
</span> --- a/server/token.c
+++ b/server/token.c
@@ -146,6 +146,7 @@ static const struct object_ops token_ops =
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4864,10 +4884,10 @@ index e40ba10f9aa..1101c7224b9 100644
</span> no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/trace.c b/server/trace.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index fd224685bfb..0d7eac7dc60 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 6d614b8b9c4..71d9fc82159 100644
</span> --- a/server/trace.c
+++ b/server/trace.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -4712,6 +4712,63 @@ static void dump_get_esync_apc_fd_request( const struct get_esync_apc_fd_request
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4879,6 +4879,63 @@ static void dump_get_esync_apc_fd_request( const struct get_esync_apc_fd_request
</span> {
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4931,7 +4951,7 @@ index fd224685bfb..0d7eac7dc60 100644
</span> static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
(dump_func)dump_new_process_request,
(dump_func)dump_get_new_process_info_request,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -5005,6 +5062,11 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -5177,6 +5234,11 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
</span> (dump_func)dump_esync_msgwait_request,
(dump_func)dump_set_keyboard_repeat_request,
(dump_func)dump_get_esync_apc_fd_request,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4943,7 +4963,7 @@ index fd224685bfb..0d7eac7dc60 100644
</span> };
static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -5300,6 +5362,11 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -5477,6 +5539,11 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
</span> NULL,
(dump_func)dump_set_keyboard_repeat_reply,
NULL,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4955,7 +4975,7 @@ index fd224685bfb..0d7eac7dc60 100644
</span> };
static const char * const req_names[REQ_NB_REQUESTS] = {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -5595,6 +5662,11 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -5777,6 +5844,11 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
</span> "esync_msgwait",
"set_keyboard_repeat",
"get_esync_apc_fd",
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4968,10 +4988,10 @@ index fd224685bfb..0d7eac7dc60 100644
</span>
static const struct
diff --git a/server/window.c b/server/window.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 7e8055bac4a..f91794e278f 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 507a9acf94f..35cf194995c 100644
</span> --- a/server/window.c
+++ b/server/window.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -107,6 +107,7 @@ static const struct object_ops window_ops =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -108,6 +108,7 @@ static const struct object_ops window_ops =
</span> NULL, /* remove_queue */
NULL, /* signaled */
NULL, /* get_esync_fd */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4980,7 +5000,7 @@ index 7e8055bac4a..f91794e278f 100644
</span> no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/winstation.c b/server/winstation.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 5cd235c528e..c1dfbc85272 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index e7884d42f40..a5b6e9ba148 100644
</span> --- a/server/winstation.c
+++ b/server/winstation.c
@@ -77,6 +77,7 @@ static const struct object_ops winstation_ops =
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/emulators/wine-devel/files/macos_hacks.diff b/emulators/wine-devel/files/macos_hacks.diff
</span><span style='display:block; white-space:pre;color:#808080;'>index ff67ced71a4..e8477d198d2 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/emulators/wine-devel/files/macos_hacks.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/emulators/wine-devel/files/macos_hacks.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,23 +1,13 @@
</span> diff --git a/dlls/kernelbase/process.c b/dlls/kernelbase/process.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 2d08481cd35..9972781a183 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index df3447a9014..4d70b83ee14 100644
</span> --- a/dlls/kernelbase/process.c
+++ b/dlls/kernelbase/process.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -502,6 +502,46 @@ done:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -502,6 +502,36 @@ done:
</span> return ret;
}
+static const WCHAR *hack_append_command_line( const WCHAR *cmd, const WCHAR *cmd_line )
+{
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* CROSSOVER HACK: bug 13322 (winehq bug 39403)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Insert --no-sandbox in command line of Steam's web helper process to
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * work around rendering problems.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * CROSSOVER HACK: bug 17315
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Insert --in-process-gpu in command line of Steam's web helper process to
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * work around page rendering problems.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * CROSSOVER HACK: bug 21883
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Insert --disable-gpu as well.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span> + static const struct
+ {
+ const WCHAR *exe_name;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -49,7 +39,7 @@ index 2d08481cd35..9972781a183 100644
</span> /**********************************************************************
* CreateProcessInternalW (kernelbase.@)
*/
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -518,6 +558,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessInternalW( HANDLE token, const WCHAR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -518,6 +548,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessInternalW( HANDLE token, const WCHAR
</span> RTL_USER_PROCESS_PARAMETERS *params = NULL;
RTL_USER_PROCESS_INFORMATION rtl_info;
HANDLE parent = 0, debug = 0;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -57,7 +47,7 @@ index 2d08481cd35..9972781a183 100644
</span> ULONG nt_flags = 0;
USHORT machine = 0;
NTSTATUS status;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -543,6 +584,20 @@ BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessInternalW( HANDLE token, const WCHAR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -543,6 +574,20 @@ BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessInternalW( HANDLE token, const WCHAR
</span> app_name = name;
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -79,16 +69,80 @@ index 2d08481cd35..9972781a183 100644
</span>
if (flags & (IDLE_PRIORITY_CLASS | HIGH_PRIORITY_CLASS | REALTIME_PRIORITY_CLASS |
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index bad1492e138..a1bf38216fd 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 2f2a7fe5427..ac525f1a477 100644
</span> --- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2712,6 +2712,331 @@ static WINE_MODREF *find_existing_module( HMODULE module )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2244,6 +2244,11 @@ static NTSTATUS perform_relocations( void *module, IMAGE_NT_HEADERS *nt, SIZE_T
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return STATUS_SUCCESS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __x86_64__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void apply_binary_patches( WINE_MODREF* wm );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*************************************************************************
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * build_module
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2324,6 +2329,15 @@ static NTSTATUS build_module( LPCWSTR load_path, const UNICODE_STRING *nt_name,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ TRACE_(loaddll)( "Loaded %s at %p: %s\n", debugstr_w(wm->ldr.FullDllName.Buffer), *module,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ is_builtin ? "builtin" : "native" );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__x86_64__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* CW HACK 22434 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (!wcscmp( wm->ldr.BaseDllName.Buffer, L"libcef.dll" ) ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ !wcscmp( wm->ldr.BaseDllName.Buffer, L"Qt5WebEngineCore.dll" ))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ apply_binary_patches( wm );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ wm->ldr.LoadCount = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *pwm = wm;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *module = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2765,6 +2779,399 @@ static WINE_MODREF *find_existing_module( HMODULE module )
</span> return NULL;
}
+#ifdef __x86_64__
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+/* CW HACK 19487: Patch out %gs:8h accesses in various versions of libcef.dll */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+static void patch_libcef( const WCHAR* libname, WINE_MODREF** pwm )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static BOOL byte_pattern_matches( const char *addr, char wildcard_byte,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const char *pattern, size_t pattern_size )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size_t i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ for (i = 0; i < pattern_size; i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (pattern[i] != wildcard_byte && addr[i] != pattern[i])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return FALSE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return TRUE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void *find_byte_pattern( void *dllbase, size_t size_of_image,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ char wildcard_byte, const char *pattern, size_t pattern_size )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size_t offset;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ for (offset = 0; offset <= size_of_image - pattern_size; offset++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ char *addr = (char *)dllbase + offset;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (byte_pattern_matches( addr, wildcard_byte, pattern, pattern_size ))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return addr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void apply_byte_pattern_patch( void *addr, char wildcard_byte, const char *after, size_t after_size )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size_t i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ for (i = 0; i < after_size; i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (after[i] != wildcard_byte)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ((char *)addr)[i] = after[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void apply_binary_patches( WINE_MODREF* wm )
</span> +{
+ static const char before_85_3_9_0[] =
+ {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -251,6 +305,23 @@ index bad1492e138..a1bf38216fd 100644
</span> + };
+ C_ASSERT( sizeof(before_qt_5_15_2_0_2) == sizeof(after_qt_5_15_2_0_2) );
+
<span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ static const char before_epic_cmd_line_args_90_6_7[] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ 0x8b, 0x47, 0x64,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ 0x89, 0x43, 0x64,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ 0x8b, 0x47, 0x68, /* mov eax, dword ptr [rdi+0x68] */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ 0x89, 0x43, 0x68, /* mov dword ptr [rbx + 0x68], eax */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ static const char after_epic_cmd_line_args_90_6_7[] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ 0x8b, 0x47, 0x64,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ 0x89, 0x43, 0x64,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ 0x31, 0xc0, /* xor eax, eax */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ 0x90, /* nop */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ 0x89, 0x43, 0x68 /* mov dword ptr [rsi+0x68], eax */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ C_ASSERT( sizeof(before_epic_cmd_line_args_90_6_7) == sizeof(after_epic_cmd_line_args_90_6_7) );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span> + struct
+ {
+ const WCHAR *libname;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -266,7 +337,7 @@ index bad1492e138..a1bf38216fd 100644
</span> + */
+ {
+ L"libcef.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "85.3.11-0",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ "CEF %gs 85.3.11-0",
</span> + /* This patch is identical to the one for 85.3.9, just at a different offset. */
+ before_85_3_9_0, after_85_3_9_0,
+ sizeof(before_85_3_9_0),
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -275,7 +346,7 @@ index bad1492e138..a1bf38216fd 100644
</span> + },
+ {
+ L"libcef.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "85.3.11-1",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ "CEF %gs 85.3.11-1",
</span> + before_85_3_11_1, after_85_3_11_1,
+ sizeof(before_85_3_11_1),
+ 0x28c521a,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -289,7 +360,7 @@ index bad1492e138..a1bf38216fd 100644
</span> + */
+ {
+ L"libcef.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "85.3.9.0",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ "CEF %gs 85.3.9.0",
</span> + before_85_3_9_0, after_85_3_9_0,
+ sizeof(before_85_3_9_0),
+ 0x28c4b30,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -302,7 +373,7 @@ index bad1492e138..a1bf38216fd 100644
</span> + */
+ {
+ L"libcef.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "72.0.3626.121",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ "CEF %gs 72.0.3626.121-0",
</span> + before_72_0_3626_121_1, after_72_0_3626_121_1,
+ sizeof(before_72_0_3626_121_1),
+ 0x23bb2ad,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -310,7 +381,7 @@ index bad1492e138..a1bf38216fd 100644
</span> + },
+ {
+ L"libcef.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "72.0.3626.121",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ "CEF %gs 72.0.3626.121-1",
</span> + before_72_0_3626_121_2, after_72_0_3626_121_2,
+ sizeof(before_72_0_3626_121_2),
+ 0x23bb329,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -318,7 +389,7 @@ index bad1492e138..a1bf38216fd 100644
</span> + },
+ {
+ L"libcef.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "72.0.3626.121",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ "CEF %gs 72.0.3626.121-2",
</span> + before_72_0_3626_121_3, after_72_0_3626_121_3,
+ sizeof(before_72_0_3626_121_3),
+ 0x23bb369,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -331,7 +402,7 @@ index bad1492e138..a1bf38216fd 100644
</span> + */
+ {
+ L"libcef.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "72.0.3626.96",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ "CEF %gs 72.0.3626.96-0",
</span> + /* This patch is identical to the one for 72.0.3626.121, just at a different offset. */
+ before_72_0_3626_121_1, after_72_0_3626_121_1,
+ sizeof(before_72_0_3626_121_1),
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -340,7 +411,7 @@ index bad1492e138..a1bf38216fd 100644
</span> + },
+ {
+ L"libcef.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "72.0.3626.96",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ "CEF %gs 72.0.3626.96-1",
</span> + before_72_0_3626_121_2, after_72_0_3626_121_2,
+ sizeof(before_72_0_3626_121_2),
+ 0x23bb8a9,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -348,7 +419,7 @@ index bad1492e138..a1bf38216fd 100644
</span> + },
+ {
+ L"libcef.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "72.0.3626.96",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ "CEF %gs 72.0.3626.96-2",
</span> + before_72_0_3626_121_3, after_72_0_3626_121_3,
+ sizeof(before_72_0_3626_121_3),
+ 0x23bb8e9,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -361,7 +432,7 @@ index bad1492e138..a1bf38216fd 100644
</span> + */
+ {
+ L"Qt5WebEngineCore.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "5.15.2.0",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ "CEF/Qt5WebEngineCore %gs 5.15.2.0-0",
</span> + before_qt_5_15_2_0_1, after_qt_5_15_2_0_1,
+ sizeof(before_qt_5_15_2_0_1),
+ 0x2810f10,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -369,39 +440,54 @@ index bad1492e138..a1bf38216fd 100644
</span> + },
+ {
+ L"Qt5WebEngineCore.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "5.15.2.0",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ "CEF/Qt5WebEngineCore %gs 5.15.2.0-1",
</span> + before_qt_5_15_2_0_2, after_qt_5_15_2_0_2,
+ sizeof(before_qt_5_15_2_0_2),
+ 0x2810f8d,
+ TRUE
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* CW HACK 23854:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Ignore the command_line_args_disabled flag in the cef_settings_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * passed to cef_inititalize. Always set it to 0.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ L"libcef.dll",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ "CEF cmd_line_args_disabled 90.6.7",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ before_epic_cmd_line_args_90_6_7,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ after_epic_cmd_line_args_90_6_7,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sizeof(before_epic_cmd_line_args_90_6_7),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ 0x3807,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ TRUE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ },
</span> + };
+
+ unsigned int i;
+ SIZE_T pagesize = page_size;
<span style='display:block; white-space:pre;background:#e0ffe0;'>++ WCHAR *libname = wm->ldr.BaseDllName.Buffer;
</span> +
+ for (i = 0; i < ARRAY_SIZE(patches); i++)
+ {
+ DWORD old_prot;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ void *dllbase = (*pwm)->ldr.DllBase;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ void *dllbase = wm->ldr.DllBase;
</span> + void *target = (void *)((ULONG_PTR)dllbase + patches[i].offset);
+ void *target_page = (void *)((ULONG_PTR)target & ~(page_size-1));
+
+ if (wcscmp( libname, patches[i].libname ))
+ continue;
+
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((*pwm)->ldr.SizeOfImage < patches[i].offset)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (wm->ldr.SizeOfImage < patches[i].offset)
</span> + {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ TRACE( "%s too small to be %s\n", debugstr_w(libname), patches[i].name );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ TRACE( "%s too small to match patch '%s'\n", debugstr_w(libname), patches[i].name );
</span> + continue;
+ }
+ if (memcmp( target, patches[i].before, patches[i].size ))
+ {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ TRACE( "%s doesn't match %s\n", debugstr_w(libname), patches[i].name );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ TRACE( "%s doesn't match patch '%s'\n", debugstr_w(libname), patches[i].name );
</span> + continue;
+ }
+
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ TRACE( "Found %s %s, patching out gs:0x8 accesses\n", debugstr_w(libname), patches[i].name );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ TRACE( "Found matching %s, applying patch '%s'\n", debugstr_w(libname), patches[i].name );
</span> + NtProtectVirtualMemory( NtCurrentProcess(), &target_page, &pagesize, PAGE_EXECUTE_READWRITE, &old_prot );
+ memcpy( target, patches[i].after, patches[i].size );
+ NtProtectVirtualMemory( NtCurrentProcess(), &target_page, &pagesize, old_prot, &old_prot );
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -414,18 +500,7 @@ index bad1492e138..a1bf38216fd 100644
</span>
/******************************************************************************
* load_native_dll (internal)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -3285,6 +3610,10 @@ static NTSTATUS load_dll( const WCHAR *load_path, const WCHAR *libname, DWORD fl
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- case STATUS_SUCCESS: /* valid PE file */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- nts = load_native_dll( load_path, &nt_name, mapping, &image_info, &id, flags, system, pwm );
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef __x86_64__
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (nts == STATUS_SUCCESS && (!wcscmp( libname, L"libcef.dll" ) || !wcscmp( libname, L"Qt5WebEngineCore.dll" )))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ patch_libcef( libname, pwm );
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -4309,6 +4638,18 @@ static void release_address_space(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4365,6 +4772,18 @@ static void release_address_space(void)
</span> #endif
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -444,7 +519,7 @@ index bad1492e138..a1bf38216fd 100644
</span> /******************************************************************
* loader_init
*
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -4388,6 +4729,25 @@ void loader_init( CONTEXT *context, void **entry )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4451,6 +4870,25 @@ void loader_init( CONTEXT *context, void **entry )
</span> }
else
{
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -471,10 +546,10 @@ index bad1492e138..a1bf38216fd 100644
</span> if (NtCurrentTeb()->WowTebOffset) init_wow64( context );
#endif
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 19fbfb2b68c..0411738ff19 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 92f2e2eb3a3..0dfee19f714 100644
</span> --- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1842,6 +1842,48 @@ static ULONG_PTR get_image_address(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1847,6 +1847,48 @@ static ULONG_PTR get_image_address(void)
</span> return 0;
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -523,7 +598,7 @@ index 19fbfb2b68c..0411738ff19 100644
</span> /***********************************************************************
* start_main_thread
*/
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1864,6 +1906,13 @@ static void start_main_thread(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1869,6 +1911,13 @@ static void start_main_thread(void)
</span> load_ntdll();
load_wow64_ntdll( main_image_info.Machine );
load_apiset_dll();
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -538,10 +613,10 @@ index 19fbfb2b68c..0411738ff19 100644
</span> }
diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index e84044fa805..17ecd21b79d 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 537e4e1f60e..73d18fc80fb 100644
</span> --- a/dlls/ntdll/unix/signal_x86_64.c
+++ b/dlls/ntdll/unix/signal_x86_64.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1003,7 +1003,11 @@ NTSTATUS WINAPI NtSetContextThread( HANDLE handle, const CONTEXT *context )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1023,7 +1023,11 @@ NTSTATUS WINAPI NtSetContextThread( HANDLE handle, const CONTEXT *context )
</span> ret = set_thread_context( handle, context, &self, IMAGE_FILE_MACHINE_AMD64 );
#ifdef __APPLE__
if ((flags & CONTEXT_DEBUG_REGISTERS) && (ret == STATUS_UNSUCCESSFUL))
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -554,7 +629,7 @@ index e84044fa805..17ecd21b79d 100644
</span> #endif
if (ret || !self) return ret;
if (flags & CONTEXT_DEBUG_REGISTERS)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1216,6 +1220,14 @@ NTSTATUS set_thread_wow64_context( HANDLE handle, const void *ctx, ULONG size )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1236,6 +1240,14 @@ NTSTATUS set_thread_wow64_context( HANDLE handle, const void *ctx, ULONG size )
</span> if (!self)
{
NTSTATUS ret = set_thread_context( handle, context, &self, IMAGE_FILE_MACHINE_I386 );
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -569,7 +644,7 @@ index e84044fa805..17ecd21b79d 100644
</span> if (ret || !self) return ret;
if (flags & CONTEXT_I386_DEBUG_REGISTERS)
{
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1711,6 +1723,135 @@ NTSTATUS WINAPI NtCallbackReturn( void *ret_ptr, ULONG ret_len, NTSTATUS status
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1742,6 +1754,135 @@ NTSTATUS WINAPI NtCallbackReturn( void *ret_ptr, ULONG ret_len, NTSTATUS status
</span> user_mode_callback_return( ret_ptr, ret_len, status, NtCurrentTeb() );
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -705,7 +780,7 @@ index e84044fa805..17ecd21b79d 100644
</span>
/***********************************************************************
* is_privileged_instr
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1952,7 +2093,14 @@ static void segv_handler( int signal, siginfo_t *siginfo, void *sigcontext )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1990,7 +2131,14 @@ static void segv_handler( int signal, siginfo_t *siginfo, void *sigcontext )
</span> rec.ExceptionCode = EXCEPTION_ARRAY_BOUNDS_EXCEEDED;
break;
case TRAP_x86_PRIVINFLT: /* Invalid opcode exception */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -720,53 +795,7 @@ index e84044fa805..17ecd21b79d 100644
</span> break;
case TRAP_x86_STKFLT: /* Stack fault */
rec.ExceptionCode = EXCEPTION_STACK_OVERFLOW;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2203,6 +2351,34 @@ static void usr1_handler( int signal, siginfo_t *siginfo, void *sigcontext )
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/* CW HACK 22350 */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/**********************************************************************
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * sigsys_handler
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Handler for SIGSYS, signals that a non-existent system call was invoked.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Only called on macOS 14 Sonoma and later.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+static void sigsys_handler( int signal, siginfo_t *siginfo, void *sigcontext )
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ extern const void *__wine_syscall_dispatcher_prolog_end_ptr;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ struct syscall_frame *frame = amd64_thread_data()->syscall_frame;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ ucontext_t *ctx = sigcontext;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ TRACE_(seh)("SIGSYS, rax %#llx, rip %#llx.\n", RAX_sig(ctx), RIP_sig(ctx));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ frame->rip = RIP_sig(ctx) + 0xb;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ frame->rcx = RIP_sig(ctx);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ frame->eflags = EFL_sig(ctx);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ frame->restore_flags = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ RCX_sig(ctx) = (ULONG_PTR)frame;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ R11_sig(ctx) = frame->eflags;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ EFL_sig(ctx) &= ~0x100; /* clear single-step flag */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ RIP_sig(ctx) = (ULONG64)__wine_syscall_dispatcher_prolog_end_ptr;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /***********************************************************************
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * LDT support
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2496,6 +2672,10 @@ void signal_init_process(void)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if (sigaction( SIGSEGV, &sig_act, NULL ) == -1) goto error;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if (sigaction( SIGILL, &sig_act, NULL ) == -1) goto error;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if (sigaction( SIGBUS, &sig_act, NULL ) == -1) goto error;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ sig_act.sa_sigaction = sigsys_handler;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (sigaction( SIGSYS, &sig_act, NULL ) == -1) goto error;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- error:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2530,6 +2710,8 @@ void call_init_thunk( LPTHREAD_START_ROUTINE entry, void *arg, BOOL suspend, TEB
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2600,6 +2748,8 @@ void call_init_thunk( LPTHREAD_START_ROUTINE entry, void *arg, BOOL suspend, TEB
</span> __asm__ volatile (".byte 0x65\n\tmovq %0,%c1" :: "r" (teb->Tib.Self), "n" (FIELD_OFFSET(TEB, Tib.Self)));
__asm__ volatile (".byte 0x65\n\tmovq %0,%c1" :: "r" (teb->ThreadLocalStoragePointer), "n" (FIELD_OFFSET(TEB, ThreadLocalStoragePointer)));
thread_data->pthread_teb = mac_thread_gsbase();
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -776,7 +805,7 @@ index e84044fa805..17ecd21b79d 100644
</span> thread's gsbase. Have each thread record its gsbase pointer into its
TEB so alloc_tls_slot() can find it. */
diff --git a/dlls/ntdll/unix/thread.c b/dlls/ntdll/unix/thread.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 3d151e7b2b8..03d1516fc03 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 3909470dd66..ef6867ecdca 100644
</span> --- a/dlls/ntdll/unix/thread.c
+++ b/dlls/ntdll/unix/thread.c
@@ -1096,6 +1096,16 @@ static DECLSPEC_NORETURN void pthread_exit_wrapper( int status )
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -797,7 +826,7 @@ index 3d151e7b2b8..03d1516fc03 100644
</span> }
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 0d88315164a..0a19f1aed7b 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 684a58a724b..bbe82086085 100644
</span> --- a/dlls/ntdll/unix/virtual.c
+++ b/dlls/ntdll/unix/virtual.c
@@ -62,6 +62,7 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -808,7 +837,7 @@ index 0d88315164a..0a19f1aed7b 100644
</span> #endif
#include "ntstatus.h"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1714,6 +1715,42 @@ static void mprotect_range( void *base, size_t size, BYTE set, BYTE clear )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1744,6 +1745,42 @@ static void mprotect_range( void *base, size_t size, BYTE set, BYTE clear )
</span> if (count) mprotect_exec( addr, count << page_shift, prot );
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -851,7 +880,7 @@ index 0d88315164a..0a19f1aed7b 100644
</span>
/***********************************************************************
* set_vprot
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2085,7 +2122,7 @@ static NTSTATUS map_file_into_view( struct file_view *view, int fd, size_t start
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2114,7 +2151,7 @@ static NTSTATUS map_file_into_view( struct file_view *view, int fd, size_t start
</span> /* only try mmap if media is not removable (or if we require write access) */
if (!removable || (flags & MAP_SHARED))
{
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -860,7 +889,7 @@ index 0d88315164a..0a19f1aed7b 100644
</span> goto done;
switch (errno)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2413,7 +2450,7 @@ static NTSTATUS map_pe_header( void *ptr, size_t size, int fd, BOOL *removable )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2442,7 +2479,7 @@ static NTSTATUS map_pe_header( void *ptr, size_t size, int fd, BOOL *removable )
</span>
if (!*removable)
{
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -869,7 +898,7 @@ index 0d88315164a..0a19f1aed7b 100644
</span> return STATUS_SUCCESS;
switch (errno)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -3911,7 +3948,7 @@ void virtual_map_user_shared_data(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3943,7 +3980,7 @@ void virtual_map_user_shared_data(void)
</span> exit(1);
}
if ((res = server_get_unix_fd( section, 0, &fd, &needs_close, NULL, NULL )) ||
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -878,7 +907,7 @@ index 0d88315164a..0a19f1aed7b 100644
</span> {
ERR( "failed to remap the process USD: %d\n", res );
exit(1);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -6045,6 +6082,56 @@ NTSTATUS WINAPI NtReadVirtualMemory( HANDLE process, const void *addr, void *buf
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -6124,6 +6161,56 @@ NTSTATUS WINAPI NtReadVirtualMemory( HANDLE process, const void *addr, void *buf
</span> return status;
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -935,7 +964,7 @@ index 0d88315164a..0a19f1aed7b 100644
</span>
/***********************************************************************
* NtWriteVirtualMemory (NTDLL.@)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -6065,6 +6152,10 @@ NTSTATUS WINAPI NtWriteVirtualMemory( HANDLE process, void *addr, const void *bu
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -6144,6 +6231,10 @@ NTSTATUS WINAPI NtWriteVirtualMemory( HANDLE process, void *addr, const void *bu
</span> if ((status = wine_server_call( req ))) size = 0;
}
SERVER_END_REQ;
</pre><pre style='margin:0'>
</pre>