Rebase against eeabbe812ffc3ed7c06fc85cd63f0d85bffe207e.

This commit is contained in:
Alistair Leslie-Hughes
2024-11-05 11:32:58 +11:00
parent 0e08b05863
commit 0236a37992
3 changed files with 38 additions and 25 deletions

View File

@ -1,4 +1,4 @@
From 7476e7b2e8680352cf2e1de7552ae58e11ff7869 Mon Sep 17 00:00:00 2001
From 0ef3de9bd3b51a1e37c50fd75ceb3db6ea24abd0 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <zfigura@codeweavers.com>
Date: Mon, 6 Jul 2020 15:19:37 -0500
Subject: [PATCH] ntdll, server: Implement waiting on server-bound objects.
@ -16,14 +16,15 @@ With this patch we break waiting on svcctl.exe.
dlls/ntdll/unix/esync.c | 84 ++++++++++++++++++++++++++++++++++++++---
server/esync.c | 16 ++++++++
server/esync.h | 1 +
server/named_pipe.c | 1 +
server/thread.c | 4 ++
4 files changed, 99 insertions(+), 6 deletions(-)
5 files changed, 100 insertions(+), 6 deletions(-)
diff --git a/dlls/ntdll/unix/esync.c b/dlls/ntdll/unix/esync.c
index 4f993689e0d..6fd195df759 100644
index 65ef70acd36..b0168f5cde5 100644
--- a/dlls/ntdll/unix/esync.c
+++ b/dlls/ntdll/unix/esync.c
@@ -199,6 +199,72 @@ static struct esync *get_cached_object( HANDLE handle )
@@ -193,6 +193,72 @@ static struct esync *get_cached_object( HANDLE handle )
return &esync_list[entry][idx];
}
@ -96,7 +97,7 @@ index 4f993689e0d..6fd195df759 100644
NTSTATUS esync_close( HANDLE handle )
{
UINT_PTR entry, idx = handle_to_index( handle, &entry );
@@ -278,10 +344,11 @@ NTSTATUS esync_release_semaphore( HANDLE handle, ULONG count, ULONG *prev )
@@ -272,10 +338,11 @@ NTSTATUS esync_release_semaphore( HANDLE handle, ULONG count, ULONG *prev )
struct semaphore *semaphore;
uint64_t count64 = count;
ULONG current;
@ -109,7 +110,7 @@ index 4f993689e0d..6fd195df759 100644
semaphore = obj->shm;
do
@@ -320,10 +387,11 @@ NTSTATUS esync_set_event( HANDLE handle )
@@ -314,10 +381,11 @@ NTSTATUS esync_set_event( HANDLE handle )
{
static const uint64_t value = 1;
struct esync *obj;
@ -122,7 +123,7 @@ index 4f993689e0d..6fd195df759 100644
if (write( obj->fd, &value, sizeof(value) ) == -1)
ERR("write: %s\n", strerror(errno));
@@ -335,10 +403,11 @@ NTSTATUS esync_reset_event( HANDLE handle )
@@ -329,10 +397,11 @@ NTSTATUS esync_reset_event( HANDLE handle )
{
uint64_t value;
struct esync *obj;
@ -135,7 +136,7 @@ index 4f993689e0d..6fd195df759 100644
if (read( obj->fd, &value, sizeof(value) ) == -1 && errno != EWOULDBLOCK && errno != EAGAIN)
ERR("read: %s\n", strerror(errno));
@@ -427,10 +496,13 @@ NTSTATUS esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEAN wait_an
@@ -421,10 +490,13 @@ NTSTATUS esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEAN wait_an
for (i = 0; i < count; i++)
{
@ -151,7 +152,7 @@ index 4f993689e0d..6fd195df759 100644
}
if (has_esync && has_server)
@@ -483,7 +555,7 @@ NTSTATUS esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEAN wait_an
@@ -477,7 +549,7 @@ NTSTATUS esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEAN wait_an
int64_t value;
ssize_t size;
@ -161,10 +162,10 @@ index 4f993689e0d..6fd195df759 100644
/* Don't grab the object, just check if it's signaled. */
if (fds[i].revents & POLLIN)
diff --git a/server/esync.c b/server/esync.c
index e18b76bff5b..2b9307267f9 100644
index 44214e5fe02..60e98936455 100644
--- a/server/esync.c
+++ b/server/esync.c
@@ -315,6 +315,22 @@ int esync_create_fd( int initval, int flags )
@@ -313,6 +313,22 @@ int esync_create_fd( int initval, int flags )
#endif
}
@ -188,19 +189,31 @@ index e18b76bff5b..2b9307267f9 100644
{
struct esync *esync;
diff --git a/server/esync.h b/server/esync.h
index 6a0a367124d..1e12560ddd6 100644
index 8522d8a69ae..1241e6d9f1a 100644
--- a/server/esync.h
+++ b/server/esync.h
@@ -21,3 +21,4 @@
@@ -23,3 +23,4 @@
extern int do_esync(void);
void esync_init(void);
int esync_create_fd( int initval, int flags );
+void esync_wake_up( struct object *obj );
diff --git a/server/named_pipe.c b/server/named_pipe.c
index 68fa8953cca..1535c5188ec 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -344,6 +344,7 @@ static const struct object_ops named_pipe_dir_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
+ NULL, /* get_esync_fd */
no_satisfied, /* satisfied */
no_signal, /* signal */
named_pipe_dir_get_fd, /* get_fd */
diff --git a/server/thread.c b/server/thread.c
index 1e6f60182df..0413e889c7d 100644
index 339cdfec1fa..4262b841fca 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -51,6 +51,7 @@
@@ -50,6 +50,7 @@
#include "request.h"
#include "user.h"
#include "security.h"
@ -208,7 +221,7 @@ index 1e6f60182df..0413e889c7d 100644
/* thread queues */
@@ -1053,6 +1054,9 @@ void wake_up( struct object *obj, int max )
@@ -1073,6 +1074,9 @@ void wake_up( struct object *obj, int max )
struct list *ptr;
int ret;
@ -219,5 +232,5 @@ index 1e6f60182df..0413e889c7d 100644
{
struct wait_queue_entry *entry = LIST_ENTRY( ptr, struct wait_queue_entry, entry );
--
2.30.2
2.45.2