<div dir="ltr"><div>Thanks, I applied this patch and the sink that was trapped on my kitchen ceiling fell off! Finally, freedom at last! Nothing else was able to remove it...</div><div>Now I have zero overhead sinks in my kitchen.<br></div><div><br></div><div>- Josh 🐸<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, 1 Apr 2020 at 06:14, Zebediah Figura <<a href="mailto:z.figura12@gmail.com">z.figura12@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">After spending nearly two years trying to figure out how to implement<br>
synchronization primitives in a correct and performant manner, I've finally<br>
developed a solution which is not only simple and straightforward, but an<br>
amazing 100% more performant than current Wine!<br>
<br>
I've nicknamed this patch "zsync", short for "zero-overhead sync". It's faster<br>
than esync, faster than fsync, in fact, it even beats out native Windows!<br>
<br>
I've been developing this patch for several minutes, and I think it's finally<br>
ready to submit to the Wine tree. There's still some weird crashes I have yet to<br>
pin down in pretty much every game I've tested, but regardless I think this<br>
patch is a big step forward and should be committed as soon as possible.<br>
---<br>
 dlls/ntdll/sync.c | 75 ++++++++---------------------------------------<br>
 1 file changed, 13 insertions(+), 62 deletions(-)<br>
<br>
diff --git a/dlls/ntdll/sync.c b/dlls/ntdll/sync.c<br>
index 2b5b6ce44a5..b5c0ecfcd55 100644<br>
--- a/dlls/ntdll/sync.c<br>
+++ b/dlls/ntdll/sync.c<br>
@@ -328,18 +328,8 @@ NTSTATUS WINAPI NtQuerySemaphore( HANDLE handle, SEMAPHORE_INFORMATION_CLASS cla<br>
  */<br>
 NTSTATUS WINAPI NtReleaseSemaphore( HANDLE handle, ULONG count, PULONG previous )<br>
 {<br>
-    NTSTATUS ret;<br>
-    SERVER_START_REQ( release_semaphore )<br>
-    {<br>
-        req->handle = wine_server_obj_handle( handle );<br>
-        req->count  = count;<br>
-        if (!(ret = wine_server_call( req )))<br>
-        {<br>
-            if (previous) *previous = reply->prev_count;<br>
-        }<br>
-    }<br>
-    SERVER_END_REQ;<br>
-    return ret;<br>
+    /* No need to signal — the other thread is already running! */<br>
+    return STATUS_SUCCESS;<br>
 }<br>
<br>
 /*<br>
@@ -405,16 +395,8 @@ NTSTATUS WINAPI NtOpenEvent( HANDLE *handle, ACCESS_MASK access, const OBJECT_AT<br>
  */<br>
 NTSTATUS WINAPI NtSetEvent( HANDLE handle, LONG *prev_state )<br>
 {<br>
-    NTSTATUS ret;<br>
-    SERVER_START_REQ( event_op )<br>
-    {<br>
-        req->handle = wine_server_obj_handle( handle );<br>
-        req->op     = SET_EVENT;<br>
-        ret = wine_server_call( req );<br>
-        if (!ret && prev_state) *prev_state = reply->state;<br>
-    }<br>
-    SERVER_END_REQ;<br>
-    return ret;<br>
+    /* No need to signal - the other thread is already running! */<br>
+    return STATUS_SUCCESS;<br>
 }<br>
<br>
 /******************************************************************************<br>
@@ -422,16 +404,8 @@ NTSTATUS WINAPI NtSetEvent( HANDLE handle, LONG *prev_state )<br>
  */<br>
 NTSTATUS WINAPI NtResetEvent( HANDLE handle, LONG *prev_state )<br>
 {<br>
-    NTSTATUS ret;<br>
-    SERVER_START_REQ( event_op )<br>
-    {<br>
-        req->handle = wine_server_obj_handle( handle );<br>
-        req->op     = RESET_EVENT;<br>
-        ret = wine_server_call( req );<br>
-        if (!ret && prev_state) *prev_state = reply->state;<br>
-    }<br>
-    SERVER_END_REQ;<br>
-    return ret;<br>
+    /* We never set the event, so we don't need to reset it. */<br>
+    return STATUS_SUCCESS;<br>
 }<br>
<br>
 /******************************************************************************<br>
@@ -453,17 +427,8 @@ NTSTATUS WINAPI NtClearEvent ( HANDLE handle )<br>
  */<br>
 NTSTATUS WINAPI NtPulseEvent( HANDLE handle, LONG *prev_state )<br>
 {<br>
-    NTSTATUS ret;<br>
-<br>
-    SERVER_START_REQ( event_op )<br>
-    {<br>
-        req->handle = wine_server_obj_handle( handle );<br>
-        req->op     = PULSE_EVENT;<br>
-        ret = wine_server_call( req );<br>
-        if (!ret && prev_state) *prev_state = reply->state;<br>
-    }<br>
-    SERVER_END_REQ;<br>
-    return ret;<br>
+    /* Set and then reset an event? We might as well just do nothing. */<br>
+    return STATUS_SUCCESS;<br>
 }<br>
<br>
 /******************************************************************************<br>
@@ -564,16 +529,8 @@ NTSTATUS WINAPI NtOpenMutant( HANDLE *handle, ACCESS_MASK access, const OBJECT_A<br>
  */<br>
 NTSTATUS WINAPI NtReleaseMutant( IN HANDLE handle, OUT PLONG prev_count OPTIONAL)<br>
 {<br>
-    NTSTATUS    status;<br>
-<br>
-    SERVER_START_REQ( release_mutex )<br>
-    {<br>
-        req->handle = wine_server_obj_handle( handle );<br>
-        status = wine_server_call( req );<br>
-        if (prev_count) *prev_count = 1 - reply->prev_count;<br>
-    }<br>
-    SERVER_END_REQ;<br>
-    return status;<br>
+    /* There'll be no mutant enemy, we shall certify. */<br>
+    return STATUS_SUCCESS;<br>
 }<br>
<br>
 /******************************************************************<br>
@@ -1076,15 +1033,9 @@ static NTSTATUS wait_objects( DWORD count, const HANDLE *handles,<br>
                               BOOLEAN wait_any, BOOLEAN alertable,<br>
                               const LARGE_INTEGER *timeout )<br>
 {<br>
-    select_op_t select_op;<br>
-    UINT i, flags = SELECT_INTERRUPTIBLE;<br>
-<br>
-    if (!count || count > MAXIMUM_WAIT_OBJECTS) return STATUS_INVALID_PARAMETER_1;<br>
-<br>
-    if (alertable) flags |= SELECT_ALERTABLE;<br>
-    select_op.wait.op = wait_any ? SELECT_WAIT : SELECT_WAIT_ALL;<br>
-    for (i = 0; i < count; i++) select_op.wait.handles[i] = wine_server_obj_handle( handles[i] );<br>
-    return server_select( &select_op, offsetof( select_op_t, wait.handles[count] ), flags, timeout );<br>
+    /* 99% of real time elapsed in all programs is spent sleeping. We can<br>
+     * optimize by not doing that. */<br>
+    return STATUS_SUCCESS;<br>
 }<br>
<br>
<br>
-- <br>
2.26.0<br>
<br>
<br>
</blockquote></div>