mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2024-11-21 16:46:54 -08:00
Rebase against b922b5aeef18fd30b13a4e86c115d68e505c9393.
This commit is contained in:
parent
41e15516bd
commit
41cb9f5179
@ -1,17 +1,17 @@
|
||||
From e9a9468200f7f0b42e806822d1c5519cae3d4f9c Mon Sep 17 00:00:00 2001
|
||||
From af2439799ba730871f55e481523605a3dbc114e7 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Sat, 5 Aug 2017 03:39:37 +0200
|
||||
Subject: [PATCH] ntdll: Use fast CS functions for threadpool locking.
|
||||
|
||||
---
|
||||
dlls/ntdll/threadpool.c | 96 ++++++++++++++++++++---------------------
|
||||
1 file changed, 48 insertions(+), 48 deletions(-)
|
||||
dlls/ntdll/threadpool.c | 90 ++++++++++++++++++++---------------------
|
||||
1 file changed, 45 insertions(+), 45 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/threadpool.c b/dlls/ntdll/threadpool.c
|
||||
index 84286fbee90..0c7a454c705 100644
|
||||
index bdc1ebddd7d..b806963a1f8 100644
|
||||
--- a/dlls/ntdll/threadpool.c
|
||||
+++ b/dlls/ntdll/threadpool.c
|
||||
@@ -1279,7 +1279,7 @@ static void CALLBACK timerqueue_thread_proc( void *param )
|
||||
@@ -1052,7 +1052,7 @@ static void CALLBACK timerqueue_thread_proc( void *param )
|
||||
|
||||
TRACE( "starting timer queue thread\n" );
|
||||
|
||||
@ -20,7 +20,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
for (;;)
|
||||
{
|
||||
NtQuerySystemTime( &now );
|
||||
@@ -1353,7 +1353,7 @@ static void CALLBACK timerqueue_thread_proc( void *param )
|
||||
@@ -1126,7 +1126,7 @@ static void CALLBACK timerqueue_thread_proc( void *param )
|
||||
}
|
||||
|
||||
timerqueue.thread_running = FALSE;
|
||||
@ -29,7 +29,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
|
||||
TRACE( "terminating timer queue thread\n" );
|
||||
RtlExitUserThread( 0 );
|
||||
@@ -1398,7 +1398,7 @@ static NTSTATUS tp_timerqueue_lock( struct threadpool_object *timer )
|
||||
@@ -1171,7 +1171,7 @@ static NTSTATUS tp_timerqueue_lock( struct threadpool_object *timer )
|
||||
timer->u.timer.period = 0;
|
||||
timer->u.timer.window_length = 0;
|
||||
|
||||
@ -38,7 +38,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
|
||||
/* Make sure that the timerqueue thread is running. */
|
||||
if (!timerqueue.thread_running)
|
||||
@@ -1419,7 +1419,7 @@ static NTSTATUS tp_timerqueue_lock( struct threadpool_object *timer )
|
||||
@@ -1192,7 +1192,7 @@ static NTSTATUS tp_timerqueue_lock( struct threadpool_object *timer )
|
||||
timerqueue.objcount++;
|
||||
}
|
||||
|
||||
@ -47,7 +47,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -1432,7 +1432,7 @@ static void tp_timerqueue_unlock( struct threadpool_object *timer )
|
||||
@@ -1205,7 +1205,7 @@ static void tp_timerqueue_unlock( struct threadpool_object *timer )
|
||||
{
|
||||
assert( timer->type == TP_OBJECT_TYPE_TIMER );
|
||||
|
||||
@ -56,7 +56,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
if (timer->u.timer.timer_initialized)
|
||||
{
|
||||
/* If timer was pending, remove it. */
|
||||
@@ -1451,7 +1451,7 @@ static void tp_timerqueue_unlock( struct threadpool_object *timer )
|
||||
@@ -1224,7 +1224,7 @@ static void tp_timerqueue_unlock( struct threadpool_object *timer )
|
||||
|
||||
timer->u.timer.timer_initialized = FALSE;
|
||||
}
|
||||
@ -65,7 +65,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
@@ -1469,7 +1469,7 @@ static void CALLBACK waitqueue_thread_proc( void *param )
|
||||
@@ -1242,7 +1242,7 @@ static void CALLBACK waitqueue_thread_proc( void *param )
|
||||
|
||||
TRACE( "starting wait queue thread\n" );
|
||||
|
||||
@ -74,32 +74,29 @@ index 84286fbee90..0c7a454c705 100644
|
||||
|
||||
for (;;)
|
||||
{
|
||||
@@ -1506,10 +1506,10 @@ static void CALLBACK waitqueue_thread_proc( void *param )
|
||||
@@ -1291,10 +1291,10 @@ static void CALLBACK waitqueue_thread_proc( void *param )
|
||||
/* All wait objects have been destroyed, if no new wait objects are created
|
||||
* within some amount of time, then we can shutdown this thread. */
|
||||
assert( num_handles == 0 );
|
||||
- RtlLeaveCriticalSection( &waitqueue.cs );
|
||||
+ leave_critical_section( &waitqueue.cs );
|
||||
timeout.QuadPart = (ULONGLONG)THREADPOOL_WORKER_TIMEOUT * -10000;
|
||||
status = NtWaitForMultipleObjects( 1, &bucket->update_event, TRUE, FALSE, &timeout );
|
||||
status = NtWaitForMultipleObjects( 1, &bucket->update_event, TRUE, bucket->alertable, &timeout );
|
||||
- RtlEnterCriticalSection( &waitqueue.cs );
|
||||
+ enter_critical_section( &waitqueue.cs );
|
||||
|
||||
if (status == STATUS_TIMEOUT && !bucket->objcount)
|
||||
break;
|
||||
@@ -1517,9 +1517,9 @@ static void CALLBACK waitqueue_thread_proc( void *param )
|
||||
else
|
||||
{
|
||||
@@ -1304,7 +1304,7 @@ static void CALLBACK waitqueue_thread_proc( void *param )
|
||||
handles[num_handles] = bucket->update_event;
|
||||
- RtlLeaveCriticalSection( &waitqueue.cs );
|
||||
+ leave_critical_section( &waitqueue.cs );
|
||||
status = NtWaitForMultipleObjects( num_handles + 1, handles, TRUE, FALSE, &timeout );
|
||||
RtlLeaveCriticalSection( &waitqueue.cs );
|
||||
status = NtWaitForMultipleObjects( num_handles + 1, handles, TRUE, bucket->alertable, &timeout );
|
||||
- RtlEnterCriticalSection( &waitqueue.cs );
|
||||
+ enter_critical_section( &waitqueue.cs );
|
||||
|
||||
if (status >= STATUS_WAIT_0 && status < STATUS_WAIT_0 + num_handles)
|
||||
{
|
||||
@@ -1592,7 +1592,7 @@ static void CALLBACK waitqueue_thread_proc( void *param )
|
||||
@@ -1388,7 +1388,7 @@ static void CALLBACK waitqueue_thread_proc( void *param )
|
||||
if (!--waitqueue.num_buckets)
|
||||
assert( list_empty( &waitqueue.buckets ) );
|
||||
|
||||
@ -108,7 +105,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
|
||||
TRACE( "terminating wait queue thread\n" );
|
||||
|
||||
@@ -1621,7 +1621,7 @@ static NTSTATUS tp_waitqueue_lock( struct threadpool_object *wait )
|
||||
@@ -1418,7 +1418,7 @@ static NTSTATUS tp_waitqueue_lock( struct threadpool_object *wait )
|
||||
wait->u.wait.timeout = 0;
|
||||
wait->u.wait.handle = INVALID_HANDLE_VALUE;
|
||||
|
||||
@ -117,7 +114,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
|
||||
/* Try to assign to existing bucket if possible. */
|
||||
LIST_FOR_EACH_ENTRY( bucket, &waitqueue.buckets, struct waitqueue_bucket, bucket_entry )
|
||||
@@ -1677,7 +1677,7 @@ static NTSTATUS tp_waitqueue_lock( struct threadpool_object *wait )
|
||||
@@ -1475,7 +1475,7 @@ static NTSTATUS tp_waitqueue_lock( struct threadpool_object *wait )
|
||||
}
|
||||
|
||||
out:
|
||||
@ -126,7 +123,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -1688,7 +1688,7 @@ static void tp_waitqueue_unlock( struct threadpool_object *wait )
|
||||
@@ -1486,7 +1486,7 @@ static void tp_waitqueue_unlock( struct threadpool_object *wait )
|
||||
{
|
||||
assert( wait->type == TP_OBJECT_TYPE_WAIT );
|
||||
|
||||
@ -135,7 +132,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
if (wait->u.wait.bucket)
|
||||
{
|
||||
struct waitqueue_bucket *bucket = wait->u.wait.bucket;
|
||||
@@ -1700,7 +1700,7 @@ static void tp_waitqueue_unlock( struct threadpool_object *wait )
|
||||
@@ -1498,7 +1498,7 @@ static void tp_waitqueue_unlock( struct threadpool_object *wait )
|
||||
|
||||
NtSetEvent( bucket->update_event, NULL );
|
||||
}
|
||||
@ -144,7 +141,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
}
|
||||
|
||||
static void CALLBACK ioqueue_thread_proc( void *param )
|
||||
@@ -1955,7 +1955,7 @@ static NTSTATUS tp_threadpool_lock( struct threadpool **out, TP_CALLBACK_ENVIRON
|
||||
@@ -1753,7 +1753,7 @@ static NTSTATUS tp_threadpool_lock( struct threadpool **out, TP_CALLBACK_ENVIRON
|
||||
pool = default_threadpool;
|
||||
}
|
||||
|
||||
@ -153,7 +150,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
|
||||
/* Make sure that the threadpool has at least one thread. */
|
||||
if (!pool->num_workers)
|
||||
@@ -1969,7 +1969,7 @@ static NTSTATUS tp_threadpool_lock( struct threadpool **out, TP_CALLBACK_ENVIRON
|
||||
@@ -1767,7 +1767,7 @@ static NTSTATUS tp_threadpool_lock( struct threadpool **out, TP_CALLBACK_ENVIRON
|
||||
pool->objcount++;
|
||||
}
|
||||
|
||||
@ -162,7 +159,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
|
||||
if (status != STATUS_SUCCESS)
|
||||
return status;
|
||||
@@ -1985,9 +1985,9 @@ static NTSTATUS tp_threadpool_lock( struct threadpool **out, TP_CALLBACK_ENVIRON
|
||||
@@ -1783,9 +1783,9 @@ static NTSTATUS tp_threadpool_lock( struct threadpool **out, TP_CALLBACK_ENVIRON
|
||||
*/
|
||||
static void tp_threadpool_unlock( struct threadpool *pool )
|
||||
{
|
||||
@ -174,7 +171,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
tp_threadpool_release( pool );
|
||||
}
|
||||
|
||||
@@ -2124,10 +2124,10 @@ static void tp_object_initialize( struct threadpool_object *object, struct threa
|
||||
@@ -1923,10 +1923,10 @@ static void tp_object_initialize( struct threadpool_object *object, struct threa
|
||||
struct threadpool_group *group = object->group;
|
||||
InterlockedIncrement( &group->refcount );
|
||||
|
||||
@ -187,7 +184,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
}
|
||||
|
||||
if (is_simple_callback)
|
||||
@@ -2154,7 +2154,7 @@ static void tp_object_submit( struct threadpool_object *object, BOOL signaled )
|
||||
@@ -1953,7 +1953,7 @@ static void tp_object_submit( struct threadpool_object *object, BOOL signaled )
|
||||
assert( !object->shutdown );
|
||||
assert( !pool->shutdown );
|
||||
|
||||
@ -196,7 +193,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
|
||||
/* Start new worker threads if required. */
|
||||
if (pool->num_busy_workers >= pool->num_workers &&
|
||||
@@ -2177,7 +2177,7 @@ static void tp_object_submit( struct threadpool_object *object, BOOL signaled )
|
||||
@@ -1976,7 +1976,7 @@ static void tp_object_submit( struct threadpool_object *object, BOOL signaled )
|
||||
RtlWakeConditionVariable( &pool->update_event );
|
||||
}
|
||||
|
||||
@ -205,7 +202,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
@@ -2190,7 +2190,7 @@ static void tp_object_cancel( struct threadpool_object *object )
|
||||
@@ -1989,7 +1989,7 @@ static void tp_object_cancel( struct threadpool_object *object )
|
||||
struct threadpool *pool = object->pool;
|
||||
LONG pending_callbacks = 0;
|
||||
|
||||
@ -214,7 +211,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
if (object->num_pending_callbacks)
|
||||
{
|
||||
pending_callbacks = object->num_pending_callbacks;
|
||||
@@ -2202,7 +2202,7 @@ static void tp_object_cancel( struct threadpool_object *object )
|
||||
@@ -2001,7 +2001,7 @@ static void tp_object_cancel( struct threadpool_object *object )
|
||||
}
|
||||
if (object->type == TP_OBJECT_TYPE_IO)
|
||||
object->u.io.pending_count = 0;
|
||||
@ -223,7 +220,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
|
||||
while (pending_callbacks--)
|
||||
tp_object_release( object );
|
||||
@@ -2231,7 +2231,7 @@ static void tp_object_wait( struct threadpool_object *object, BOOL group_wait )
|
||||
@@ -2030,7 +2030,7 @@ static void tp_object_wait( struct threadpool_object *object, BOOL group_wait )
|
||||
{
|
||||
struct threadpool *pool = object->pool;
|
||||
|
||||
@ -232,7 +229,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
while (!object_is_finished( object, group_wait ))
|
||||
{
|
||||
if (group_wait)
|
||||
@@ -2239,7 +2239,7 @@ static void tp_object_wait( struct threadpool_object *object, BOOL group_wait )
|
||||
@@ -2038,7 +2038,7 @@ static void tp_object_wait( struct threadpool_object *object, BOOL group_wait )
|
||||
else
|
||||
RtlSleepConditionVariableCS( &object->finished_event, &pool->cs, NULL );
|
||||
}
|
||||
@ -241,7 +238,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
@@ -2279,13 +2279,13 @@ static BOOL tp_object_release( struct threadpool_object *object )
|
||||
@@ -2078,13 +2078,13 @@ static BOOL tp_object_release( struct threadpool_object *object )
|
||||
{
|
||||
struct threadpool_group *group = object->group;
|
||||
|
||||
@ -257,7 +254,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
|
||||
tp_group_release( group );
|
||||
}
|
||||
@@ -2329,7 +2329,7 @@ static void CALLBACK threadpool_worker_proc( void *param )
|
||||
@@ -2286,7 +2286,7 @@ static void CALLBACK threadpool_worker_proc( void *param )
|
||||
|
||||
TRACE( "starting worker thread for pool %p\n", pool );
|
||||
|
||||
@ -266,25 +263,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
for (;;)
|
||||
{
|
||||
while ((ptr = threadpool_get_next_item( pool )))
|
||||
@@ -2359,7 +2359,7 @@ static void CALLBACK threadpool_worker_proc( void *param )
|
||||
/* Leave critical section and do the actual callback. */
|
||||
object->num_associated_callbacks++;
|
||||
object->num_running_callbacks++;
|
||||
- RtlLeaveCriticalSection( &pool->cs );
|
||||
+ leave_critical_section( &pool->cs );
|
||||
|
||||
/* Initialize threadpool instance struct. */
|
||||
callback_instance = (TP_CALLBACK_INSTANCE *)&instance;
|
||||
@@ -2463,7 +2463,7 @@ static void CALLBACK threadpool_worker_proc( void *param )
|
||||
}
|
||||
|
||||
skip_cleanup:
|
||||
- RtlEnterCriticalSection( &pool->cs );
|
||||
+ enter_critical_section( &pool->cs );
|
||||
assert(pool->num_busy_workers);
|
||||
pool->num_busy_workers--;
|
||||
|
||||
@@ -2506,7 +2506,7 @@ static void CALLBACK threadpool_worker_proc( void *param )
|
||||
@@ -2326,7 +2326,7 @@ static void CALLBACK threadpool_worker_proc( void *param )
|
||||
}
|
||||
}
|
||||
pool->num_workers--;
|
||||
@ -293,7 +272,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
|
||||
TRACE( "terminating worker thread for pool %p\n", pool );
|
||||
tp_threadpool_release( pool );
|
||||
@@ -2746,7 +2746,7 @@ NTSTATUS WINAPI TpCallbackMayRunLong( TP_CALLBACK_INSTANCE *instance )
|
||||
@@ -2572,7 +2572,7 @@ NTSTATUS WINAPI TpCallbackMayRunLong( TP_CALLBACK_INSTANCE *instance )
|
||||
return STATUS_SUCCESS;
|
||||
|
||||
pool = object->pool;
|
||||
@ -302,7 +281,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
|
||||
/* Start new worker threads if required. */
|
||||
if (pool->num_busy_workers >= pool->num_workers)
|
||||
@@ -2761,7 +2761,7 @@ NTSTATUS WINAPI TpCallbackMayRunLong( TP_CALLBACK_INSTANCE *instance )
|
||||
@@ -2587,7 +2587,7 @@ NTSTATUS WINAPI TpCallbackMayRunLong( TP_CALLBACK_INSTANCE *instance )
|
||||
}
|
||||
}
|
||||
|
||||
@ -311,7 +290,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
this->may_run_long = TRUE;
|
||||
return status;
|
||||
}
|
||||
@@ -2842,13 +2842,13 @@ VOID WINAPI TpDisassociateCallback( TP_CALLBACK_INSTANCE *instance )
|
||||
@@ -2668,13 +2668,13 @@ VOID WINAPI TpDisassociateCallback( TP_CALLBACK_INSTANCE *instance )
|
||||
return;
|
||||
|
||||
pool = object->pool;
|
||||
@ -327,7 +306,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
this->associated = FALSE;
|
||||
}
|
||||
|
||||
@@ -2900,7 +2900,7 @@ VOID WINAPI TpReleaseCleanupGroupMembers( TP_CLEANUP_GROUP *group, BOOL cancel_p
|
||||
@@ -2726,7 +2726,7 @@ VOID WINAPI TpReleaseCleanupGroupMembers( TP_CLEANUP_GROUP *group, BOOL cancel_p
|
||||
|
||||
TRACE( "%p %u %p\n", group, cancel_pending, userdata );
|
||||
|
||||
@ -336,7 +315,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
|
||||
/* Unset group, increase references, and mark objects for shutdown */
|
||||
LIST_FOR_EACH_ENTRY_SAFE( object, next, &this->members, struct threadpool_object, group_entry )
|
||||
@@ -2926,7 +2926,7 @@ VOID WINAPI TpReleaseCleanupGroupMembers( TP_CLEANUP_GROUP *group, BOOL cancel_p
|
||||
@@ -2752,7 +2752,7 @@ VOID WINAPI TpReleaseCleanupGroupMembers( TP_CLEANUP_GROUP *group, BOOL cancel_p
|
||||
list_init( &members );
|
||||
list_move_tail( &members, &this->members );
|
||||
|
||||
@ -345,7 +324,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
|
||||
/* Cancel pending callbacks if requested */
|
||||
if (cancel_pending)
|
||||
@@ -3040,10 +3040,10 @@ VOID WINAPI TpSetPoolMaxThreads( TP_POOL *pool, DWORD maximum )
|
||||
@@ -2866,10 +2866,10 @@ VOID WINAPI TpSetPoolMaxThreads( TP_POOL *pool, DWORD maximum )
|
||||
|
||||
TRACE( "%p %u\n", pool, maximum );
|
||||
|
||||
@ -358,7 +337,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
@@ -3056,7 +3056,7 @@ BOOL WINAPI TpSetPoolMinThreads( TP_POOL *pool, DWORD minimum )
|
||||
@@ -2882,7 +2882,7 @@ BOOL WINAPI TpSetPoolMinThreads( TP_POOL *pool, DWORD minimum )
|
||||
|
||||
TRACE( "%p %u\n", pool, minimum );
|
||||
|
||||
@ -367,7 +346,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
|
||||
while (this->num_workers < minimum)
|
||||
{
|
||||
@@ -3071,7 +3071,7 @@ BOOL WINAPI TpSetPoolMinThreads( TP_POOL *pool, DWORD minimum )
|
||||
@@ -2897,7 +2897,7 @@ BOOL WINAPI TpSetPoolMinThreads( TP_POOL *pool, DWORD minimum )
|
||||
this->max_workers = max( this->min_workers, this->max_workers );
|
||||
}
|
||||
|
||||
@ -376,7 +355,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
return !status;
|
||||
}
|
||||
|
||||
@@ -3087,7 +3087,7 @@ VOID WINAPI TpSetTimer( TP_TIMER *timer, LARGE_INTEGER *timeout, LONG period, LO
|
||||
@@ -2913,7 +2913,7 @@ VOID WINAPI TpSetTimer( TP_TIMER *timer, LARGE_INTEGER *timeout, LONG period, LO
|
||||
|
||||
TRACE( "%p %p %u %u\n", timer, timeout, period, window_length );
|
||||
|
||||
@ -385,7 +364,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
|
||||
assert( this->u.timer.timer_initialized );
|
||||
this->u.timer.timer_set = timeout != NULL;
|
||||
@@ -3147,7 +3147,7 @@ VOID WINAPI TpSetTimer( TP_TIMER *timer, LARGE_INTEGER *timeout, LONG period, LO
|
||||
@@ -2973,7 +2973,7 @@ VOID WINAPI TpSetTimer( TP_TIMER *timer, LARGE_INTEGER *timeout, LONG period, LO
|
||||
this->u.timer.timer_pending = TRUE;
|
||||
}
|
||||
|
||||
@ -394,7 +373,7 @@ index 84286fbee90..0c7a454c705 100644
|
||||
|
||||
if (submit_timer)
|
||||
tp_object_submit( this, FALSE );
|
||||
@@ -3164,7 +3164,7 @@ VOID WINAPI TpSetWait( TP_WAIT *wait, HANDLE handle, LARGE_INTEGER *timeout )
|
||||
@@ -2989,7 +2989,7 @@ VOID WINAPI TpSetWait( TP_WAIT *wait, HANDLE handle, LARGE_INTEGER *timeout )
|
||||
|
||||
TRACE( "%p %p %p\n", wait, handle, timeout );
|
||||
|
||||
@ -403,15 +382,15 @@ index 84286fbee90..0c7a454c705 100644
|
||||
|
||||
assert( this->u.wait.bucket );
|
||||
this->u.wait.handle = handle;
|
||||
@@ -3208,7 +3208,7 @@ VOID WINAPI TpSetWait( TP_WAIT *wait, HANDLE handle, LARGE_INTEGER *timeout )
|
||||
@@ -3028,7 +3028,7 @@ VOID WINAPI TpSetWait( TP_WAIT *wait, HANDLE handle, LARGE_INTEGER *timeout )
|
||||
NtSetEvent( bucket->update_event, NULL );
|
||||
}
|
||||
|
||||
- RtlLeaveCriticalSection( &waitqueue.cs );
|
||||
+ leave_critical_section( &waitqueue.cs );
|
||||
}
|
||||
|
||||
if (submit_wait)
|
||||
tp_object_submit( this, FALSE );
|
||||
/***********************************************************************
|
||||
--
|
||||
2.27.0
|
||||
2.30.0
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 3544dcdce27e40469fe57ddbc9be2128cf13cee8 Mon Sep 17 00:00:00 2001
|
||||
From d44f0a6e60f59ea4ca6ba91e4cd3b0e81a99cb20 Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Mon, 2 Nov 2020 20:24:07 -0600
|
||||
Subject: [PATCH] ntdll: Reimplement Win32 futexes on top of thread-ID alerts.
|
||||
@ -14,10 +14,10 @@ Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
|
||||
6 files changed, 187 insertions(+), 173 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
|
||||
index 60b8ffc46d6..6d6b73effb4 100644
|
||||
index e0d371e4c54..8fc5e54e4a4 100644
|
||||
--- a/dlls/ntdll/ntdll_misc.h
|
||||
+++ b/dlls/ntdll/ntdll_misc.h
|
||||
@@ -89,6 +89,8 @@ extern void init_directories(void) DECLSPEC_HIDDEN;
|
||||
@@ -90,6 +90,8 @@ extern void init_directories(void) DECLSPEC_HIDDEN;
|
||||
|
||||
extern struct _KUSER_SHARED_DATA *user_shared_data DECLSPEC_HIDDEN;
|
||||
|
||||
@ -248,23 +248,23 @@ index 8df7015df9f..a1c0b90b366 100644
|
||||
+ }
|
||||
}
|
||||
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
|
||||
index 8e5a3a3a3a3..3a74b55aa1e 100644
|
||||
index 425e8770294..bc308e17bee 100644
|
||||
--- a/dlls/ntdll/thread.c
|
||||
+++ b/dlls/ntdll/thread.c
|
||||
@@ -86,6 +86,8 @@ void WINAPI RtlExitUserThread( ULONG status )
|
||||
@@ -85,6 +85,8 @@ void WINAPI RtlExitUserThread( ULONG status )
|
||||
NtQueryInformationThread( GetCurrentThread(), ThreadAmILastThread, &last, sizeof(last), NULL );
|
||||
if (last) RtlExitUserProcess( status );
|
||||
LdrShutdownThread();
|
||||
RtlFreeThreadActivationContextStack();
|
||||
+ /* must be done last, in particular after any heap allocations */
|
||||
+ addr_wait_free_entry();
|
||||
for (;;) NtTerminateThread( GetCurrentThread(), status );
|
||||
}
|
||||
|
||||
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
|
||||
index e8853415205..585b30ea21b 100644
|
||||
index bfbdfa1a5c4..5d59d2684b8 100644
|
||||
--- a/dlls/ntdll/unix/loader.c
|
||||
+++ b/dlls/ntdll/unix/loader.c
|
||||
@@ -1582,9 +1582,6 @@ static struct unix_funcs unix_funcs =
|
||||
@@ -1583,9 +1583,6 @@ static struct unix_funcs unix_funcs =
|
||||
#endif
|
||||
DbgUiIssueRemoteBreakin,
|
||||
RtlGetSystemTimePrecise,
|
||||
@ -275,10 +275,10 @@ index e8853415205..585b30ea21b 100644
|
||||
fast_RtlpUnWaitCriticalSection,
|
||||
fast_RtlDeleteCriticalSection,
|
||||
diff --git a/dlls/ntdll/unix/sync.c b/dlls/ntdll/unix/sync.c
|
||||
index 569334580cd..39766a88e20 100644
|
||||
index 86b9b3a4978..0ea8e28613c 100644
|
||||
--- a/dlls/ntdll/unix/sync.c
|
||||
+++ b/dlls/ntdll/unix/sync.c
|
||||
@@ -77,10 +77,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(sync);
|
||||
@@ -78,10 +78,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(sync);
|
||||
|
||||
HANDLE keyed_event = 0;
|
||||
|
||||
@ -289,7 +289,7 @@ index 569334580cd..39766a88e20 100644
|
||||
static const char *debugstr_timeout( const LARGE_INTEGER *timeout )
|
||||
{
|
||||
if (!timeout) return "(infinite)";
|
||||
@@ -190,24 +186,6 @@ static void timespec_from_timeout( struct timespec *timespec, const LARGE_INTEGE
|
||||
@@ -191,24 +187,6 @@ static void timespec_from_timeout( struct timespec *timespec, const LARGE_INTEGE
|
||||
#endif
|
||||
|
||||
|
||||
@ -314,7 +314,7 @@ index 569334580cd..39766a88e20 100644
|
||||
/* create a struct security_descriptor and contained information in one contiguous piece of memory */
|
||||
NTSTATUS alloc_object_attributes( const OBJECT_ATTRIBUTES *attr, struct object_attributes **ret,
|
||||
data_size_t *ret_len )
|
||||
@@ -2839,71 +2817,6 @@ NTSTATUS CDECL fast_RtlWakeConditionVariable( RTL_CONDITION_VARIABLE *variable,
|
||||
@@ -2895,71 +2873,6 @@ NTSTATUS CDECL fast_RtlWakeConditionVariable( RTL_CONDITION_VARIABLE *variable,
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
@ -386,7 +386,7 @@ index 569334580cd..39766a88e20 100644
|
||||
#else
|
||||
|
||||
NTSTATUS CDECL fast_RtlTryAcquireSRWLockExclusive( RTL_SRWLOCK *lock )
|
||||
@@ -2946,79 +2859,4 @@ NTSTATUS CDECL fast_wait_cv( RTL_CONDITION_VARIABLE *variable, const void *value
|
||||
@@ -3002,79 +2915,4 @@ NTSTATUS CDECL fast_wait_cv( RTL_CONDITION_VARIABLE *variable, const void *value
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
@ -491,5 +491,5 @@ index ed78d08559a..cd890152230 100644
|
||||
/* fast locks */
|
||||
NTSTATUS (CDECL *fast_RtlpWaitForCriticalSection)( RTL_CRITICAL_SECTION *crit, int timeout );
|
||||
--
|
||||
2.20.1
|
||||
2.30.0
|
||||
|
||||
|
@ -51,7 +51,7 @@ usage()
|
||||
# Get the upstream commit sha
|
||||
upstream_commit()
|
||||
{
|
||||
echo "2d6b0b67d91b6433744ec859b10b8ee8eb4a37b3"
|
||||
echo "b922b5aeef18fd30b13a4e86c115d68e505c9393"
|
||||
}
|
||||
|
||||
# Show version information
|
||||
|
@ -1 +1 @@
|
||||
2d6b0b67d91b6433744ec859b10b8ee8eb4a37b3
|
||||
b922b5aeef18fd30b13a4e86c115d68e505c9393
|
||||
|
Loading…
Reference in New Issue
Block a user