mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-01-28 22:04:43 -08:00
Added patchset to implement Vista+ threadpool functions for work / timers.
This commit is contained in:
parent
e51f6d2439
commit
af245c20be
@ -38,12 +38,15 @@ Wine. All those differences are also documented on the
|
||||
Included bug fixes and improvements
|
||||
===================================
|
||||
|
||||
**Bugfixes and features included in the next upcoming release [4]:**
|
||||
**Bugfixes and features included in the next upcoming release [7]:**
|
||||
|
||||
* Add implementation for CreateThreadpool ([Wine Bug #35192](https://bugs.winehq.org/show_bug.cgi?id=35192))
|
||||
* Call DriverUnload function when unloading a device driver.
|
||||
* Fix check for end_frame in RtlUnwindEx on x86_64. ([Wine Bug #34254](https://bugs.winehq.org/show_bug.cgi?id=34254))
|
||||
* Fix mouse jittering in Planetside 2 ([Wine Bug #32913](https://bugs.winehq.org/show_bug.cgi?id=32913))
|
||||
* Implement additional stubs for vcomp dlls ([Wine Bug #31640](https://bugs.winehq.org/show_bug.cgi?id=31640))
|
||||
* Implement threadpool timers ([Wine Bug #37306](https://bugs.winehq.org/show_bug.cgi?id=37306))
|
||||
* Implement threadpool work items ([Wine Bug #32531](https://bugs.winehq.org/show_bug.cgi?id=32531))
|
||||
|
||||
|
||||
**Bugs fixed in Wine Staging 1.7.35 [146]:**
|
||||
|
1
debian/changelog
vendored
1
debian/changelog
vendored
@ -3,6 +3,7 @@ wine-staging (1.7.36) UNRELEASED; urgency=low
|
||||
* Added patch to fix check for end_frame in RtlUnwindEx on x86_64.
|
||||
* Added patch to fix mouse jittering in Planetside 2.
|
||||
* Added patch to implement additional stubs for vcomp dlls.
|
||||
* Added patchset to implement Vista+ threadpool functions for work / timers.
|
||||
-- Sebastian Lackner <sebastian@fds-team.de> Sun, 25 Jan 2015 05:58:36 +0100
|
||||
|
||||
wine-staging (1.7.35) unstable; urgency=low
|
||||
|
@ -0,0 +1,81 @@
|
||||
From 31df48db7d885ca5679ccc010d954d5df7fba288 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Sat, 31 Jan 2015 02:26:17 +0100
|
||||
Subject: ntdll: Add threadpool stub functions to specfile.
|
||||
|
||||
---
|
||||
dlls/ntdll/ntdll.spec | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 62 insertions(+)
|
||||
|
||||
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
|
||||
index 51de6e7..771f669 100644
|
||||
--- a/dlls/ntdll/ntdll.spec
|
||||
+++ b/dlls/ntdll/ntdll.spec
|
||||
@@ -969,2 +969,64 @@
|
||||
@ stdcall RtlxUnicodeStringToOemSize(ptr) RtlUnicodeStringToOemSize
|
||||
+# @ stub TpAllocAlpcCompletion
|
||||
+# @ stub TpAllocAlpcCompletionEx
|
||||
+# @ stub TpAllocCleanupGroup
|
||||
+# @ stub TpAllocIoCompletion
|
||||
+# @ stub TpAllocJobNotification
|
||||
+# @ stub TpAllocPool
|
||||
+# @ stub TpAllocTimer
|
||||
+# @ stub TpAllocWait
|
||||
+# @ stub TpAllocWork
|
||||
+# @ stub TpAlpcRegisterCompletionList
|
||||
+# @ stub TpAlpcUnregisterCompletionList
|
||||
+# @ stub TpCallbackDetectedUnrecoverableError
|
||||
+# @ stub TpCallbackIndependent
|
||||
+# @ stub TpCallbackLeaveCriticalSectionOnCompletion
|
||||
+# @ stub TpCallbackMayRunLong
|
||||
+# @ stub TpCallbackReleaseMutexOnCompletion
|
||||
+# @ stub TpCallbackReleaseSemaphoreOnCompletion
|
||||
+# @ stub TpCallbackSendAlpcMessageOnCompletion
|
||||
+# @ stub TpCallbackSendPendingAlpcMessage
|
||||
+# @ stub TpCallbackSetEventOnCompletion
|
||||
+# @ stub TpCallbackUnloadDllOnCompletion
|
||||
+# @ stub TpCancelAsyncIoOperation
|
||||
+# @ stub TpCaptureCaller
|
||||
+# @ stub TpCheckTerminateWorker
|
||||
+# @ stub TpDbgDumpHeapUsage
|
||||
+# @ stub TpDbgSetLogRoutine
|
||||
+# @ stub TpDisablePoolCallbackChecks
|
||||
+# @ stub TpDisassociateCallback
|
||||
+# @ stub TpIsTimerSet
|
||||
+# @ stub TpPostWork
|
||||
+# @ stub TpQueryPoolStackInformation
|
||||
+# @ stub TpReleaseAlpcCompletion
|
||||
+# @ stub TpReleaseCleanupGroup
|
||||
+# @ stub TpReleaseCleanupGroupMembers
|
||||
+# @ stub TpReleaseIoCompletion
|
||||
+# @ stub TpReleaseJobNotification
|
||||
+# @ stub TpReleasePool
|
||||
+# @ stub TpReleaseTimer
|
||||
+# @ stub TpReleaseWait
|
||||
+# @ stub TpReleaseWork
|
||||
+# @ stub TpSetDefaultPoolMaxThreads
|
||||
+# @ stub TpSetDefaultPoolStackInformation
|
||||
+# @ stub TpSetPoolMaxThreads
|
||||
+# @ stub TpSetPoolMaxThreadsSoftLimit
|
||||
+# @ stub TpSetPoolMinThreads
|
||||
+# @ stub TpSetPoolStackInformation
|
||||
+# @ stub TpSetPoolThreadBasePriority
|
||||
+# @ stub TpSetPoolWorkerThreadIdleTimeout
|
||||
+# @ stub TpSetTimer
|
||||
+# @ stub TpSetTimerEx
|
||||
+# @ stub TpSetWait
|
||||
+# @ stub TpSetWaitEx
|
||||
+# @ stub TpSimpleTryPost
|
||||
+# @ stub TpStartAsyncIoOperation
|
||||
+# @ stub TpTimerOutstandingCallbackCount
|
||||
+# @ stub TpTrimPools
|
||||
+# @ stub TpWaitForAlpcCompletion
|
||||
+# @ stub TpWaitForIoCompletion
|
||||
+# @ stub TpWaitForJobNotification
|
||||
+# @ stub TpWaitForTimer
|
||||
+# @ stub TpWaitForWait
|
||||
+# @ stub TpWaitForWork
|
||||
@ stdcall -ret64 VerSetConditionMask(int64 long long)
|
||||
--
|
||||
2.2.2
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,212 @@
|
||||
From 1dc1074ad196b6d869028d3dea283dbab8a8a707 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Sun, 1 Feb 2015 18:06:08 +0100
|
||||
Subject: ntdll: Implement additional threadpool work item functions.
|
||||
|
||||
---
|
||||
dlls/ntdll/ntdll.spec | 8 ++--
|
||||
dlls/ntdll/threadpool2.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++-
|
||||
2 files changed, 102 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
|
||||
index 256ec6d..bf9e795 100644
|
||||
--- a/dlls/ntdll/ntdll.spec
|
||||
+++ b/dlls/ntdll/ntdll.spec
|
||||
@@ -975,7 +975,7 @@
|
||||
@ stdcall TpAllocPool(ptr ptr)
|
||||
# @ stub TpAllocTimer
|
||||
# @ stub TpAllocWait
|
||||
-# @ stub TpAllocWork
|
||||
+@ stdcall TpAllocWork(ptr ptr ptr ptr)
|
||||
# @ stub TpAlpcRegisterCompletionList
|
||||
# @ stub TpAlpcUnregisterCompletionList
|
||||
# @ stub TpCallbackDetectedUnrecoverableError
|
||||
@@ -996,7 +996,7 @@
|
||||
# @ stub TpDisablePoolCallbackChecks
|
||||
@ stdcall TpDisassociateCallback(ptr)
|
||||
# @ stub TpIsTimerSet
|
||||
-# @ stub TpPostWork
|
||||
+@ stdcall TpPostWork(ptr)
|
||||
# @ stub TpQueryPoolStackInformation
|
||||
# @ stub TpReleaseAlpcCompletion
|
||||
@ stdcall TpReleaseCleanupGroup(ptr)
|
||||
@@ -1006,7 +1006,7 @@
|
||||
@ stdcall TpReleasePool(ptr)
|
||||
# @ stub TpReleaseTimer
|
||||
# @ stub TpReleaseWait
|
||||
-# @ stub TpReleaseWork
|
||||
+@ stdcall TpReleaseWork(ptr)
|
||||
# @ stub TpSetDefaultPoolMaxThreads
|
||||
# @ stub TpSetDefaultPoolStackInformation
|
||||
@ stdcall TpSetPoolMaxThreads(ptr long)
|
||||
@@ -1030,3 +1030,3 @@
|
||||
# @ stub TpWaitForWait
|
||||
-# @ stub TpWaitForWork
|
||||
+@ stdcall TpWaitForWork(ptr long)
|
||||
@ stdcall -ret64 VerSetConditionMask(int64 long long)
|
||||
diff --git a/dlls/ntdll/threadpool2.c b/dlls/ntdll/threadpool2.c
|
||||
index c4f54af..acc477f 100644
|
||||
--- a/dlls/ntdll/threadpool2.c
|
||||
+++ b/dlls/ntdll/threadpool2.c
|
||||
@@ -123,7 +123,8 @@ struct threadpool_object
|
||||
enum
|
||||
{
|
||||
TP_OBJECT_TYPE_UNDEFINED,
|
||||
- TP_OBJECT_TYPE_SIMPLE
|
||||
+ TP_OBJECT_TYPE_SIMPLE,
|
||||
+ TP_OBJECT_TYPE_WORK
|
||||
} type;
|
||||
|
||||
/* arguments for callback */
|
||||
@@ -134,6 +135,11 @@ struct threadpool_object
|
||||
{
|
||||
PTP_SIMPLE_CALLBACK callback;
|
||||
} simple;
|
||||
+ /* work callback */
|
||||
+ struct
|
||||
+ {
|
||||
+ PTP_WORK_CALLBACK callback;
|
||||
+ } work;
|
||||
} u;
|
||||
};
|
||||
|
||||
@@ -153,6 +159,13 @@ static inline struct threadpool *impl_from_TP_POOL( TP_POOL *pool )
|
||||
return (struct threadpool *)pool;
|
||||
}
|
||||
|
||||
+static inline struct threadpool_object *impl_from_TP_WORK( TP_WORK *work )
|
||||
+{
|
||||
+ struct threadpool_object *object = (struct threadpool_object *)work;
|
||||
+ assert( !object || object->type == TP_OBJECT_TYPE_WORK );
|
||||
+ return object;
|
||||
+}
|
||||
+
|
||||
static inline struct threadpool_group *impl_from_TP_CLEANUP_GROUP( TP_CLEANUP_GROUP *group )
|
||||
{
|
||||
return (struct threadpool_group *)group;
|
||||
@@ -410,6 +423,16 @@ static void CALLBACK threadpool_worker_proc( void *param )
|
||||
break;
|
||||
}
|
||||
|
||||
+ case TP_OBJECT_TYPE_WORK:
|
||||
+ {
|
||||
+ TP_CALLBACK_INSTANCE *cb_instance = (TP_CALLBACK_INSTANCE *)&instance;
|
||||
+ TRACE( "executing callback %p(%p, %p)\n",
|
||||
+ object->u.work.callback, cb_instance, object->userdata );
|
||||
+ object->u.work.callback( cb_instance, object->userdata, (TP_WORK *)object );
|
||||
+ TRACE( "callback %p returned\n", object->u.work.callback );
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
default:
|
||||
FIXME( "callback type %u not implemented\n", object->type );
|
||||
break;
|
||||
@@ -554,6 +577,31 @@ static NTSTATUS tp_object_alloc_simple( struct threadpool_object **out, PTP_SIMP
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
+static NTSTATUS tp_object_alloc_work( struct threadpool_object **out, PTP_WORK_CALLBACK callback,
|
||||
+ PVOID userdata, TP_CALLBACK_ENVIRON *environment )
|
||||
+{
|
||||
+ struct threadpool_object *object;
|
||||
+ struct threadpool *pool;
|
||||
+
|
||||
+ /* determine threadpool */
|
||||
+ pool = environment ? (struct threadpool *)environment->Pool : NULL;
|
||||
+ if (!pool) pool = get_default_threadpool();
|
||||
+ if (!pool) return STATUS_NO_MEMORY;
|
||||
+
|
||||
+ object = RtlAllocateHeap( GetProcessHeap(), 0, sizeof(*object) );
|
||||
+ if (!object)
|
||||
+ return STATUS_NO_MEMORY;
|
||||
+
|
||||
+ object->type = TP_OBJECT_TYPE_WORK;
|
||||
+ object->u.work.callback = callback;
|
||||
+ tp_object_initialize( object, pool, userdata, environment );
|
||||
+
|
||||
+ TRACE("allocated object %p of type %u\n", object, object->type);
|
||||
+
|
||||
+ *out = object;
|
||||
+ return STATUS_SUCCESS;
|
||||
+}
|
||||
+
|
||||
static BOOL tp_object_release( struct threadpool_object *object )
|
||||
{
|
||||
struct threadpool_group *group;
|
||||
@@ -795,6 +843,16 @@ NTSTATUS WINAPI TpAllocPool( TP_POOL **out, PVOID reserved )
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
+ * TpAllocWork (NTDLL.@)
|
||||
+ */
|
||||
+NTSTATUS WINAPI TpAllocWork( TP_WORK **out, PTP_WORK_CALLBACK callback, PVOID userdata,
|
||||
+ TP_CALLBACK_ENVIRON *environment )
|
||||
+{
|
||||
+ TRACE("%p %p %p %p\n", out, callback, userdata, environment);
|
||||
+ return tp_object_alloc_work( (struct threadpool_object **)out, callback, userdata, environment );
|
||||
+}
|
||||
+
|
||||
+/***********************************************************************
|
||||
* TpCallbackLeaveCriticalSectionOnCompletion (NTDLL.@)
|
||||
*/
|
||||
VOID WINAPI TpCallbackLeaveCriticalSectionOnCompletion( TP_CALLBACK_INSTANCE *instance, CRITICAL_SECTION *crit )
|
||||
@@ -889,6 +947,16 @@ VOID WINAPI TpDisassociateCallback( TP_CALLBACK_INSTANCE *instance )
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
+ * TpPostWork (NTDLL.@)
|
||||
+ */
|
||||
+VOID WINAPI TpPostWork( TP_WORK *work )
|
||||
+{
|
||||
+ struct threadpool_object *this = impl_from_TP_WORK( work );
|
||||
+ TRACE("%p\n", work);
|
||||
+ if (this) tp_object_submit( this );
|
||||
+}
|
||||
+
|
||||
+/***********************************************************************
|
||||
* TpReleaseCleanupGroup (NTDLL.@)
|
||||
*/
|
||||
VOID WINAPI TpReleaseCleanupGroup( TP_CLEANUP_GROUP *group )
|
||||
@@ -927,6 +995,20 @@ VOID WINAPI TpReleasePool( TP_POOL *pool )
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
+ * TpReleaseWork (NTDLL.@)
|
||||
+ */
|
||||
+VOID WINAPI TpReleaseWork( TP_WORK *work )
|
||||
+{
|
||||
+ struct threadpool_object *this = impl_from_TP_WORK( work );
|
||||
+ TRACE("%p\n", work);
|
||||
+ if (this)
|
||||
+ {
|
||||
+ tp_object_shutdown( this );
|
||||
+ tp_object_release( this );
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/***********************************************************************
|
||||
* TpSetPoolMaxThreads (NTDLL.@)
|
||||
*/
|
||||
VOID WINAPI TpSetPoolMaxThreads( TP_POOL *pool, DWORD maximum )
|
||||
@@ -964,3 +1046,18 @@ NTSTATUS WINAPI TpSimpleTryPost( PTP_SIMPLE_CALLBACK callback, PVOID userdata, T
|
||||
}
|
||||
return status;
|
||||
}
|
||||
+
|
||||
+/***********************************************************************
|
||||
+ * TpWaitForWork (NTDLL.@)
|
||||
+ */
|
||||
+VOID WINAPI TpWaitForWork( TP_WORK *work, BOOL cancel_pending )
|
||||
+{
|
||||
+ struct threadpool_object *this = impl_from_TP_WORK( work );
|
||||
+ TRACE("%p %d\n", work, cancel_pending);
|
||||
+ if (this)
|
||||
+ {
|
||||
+ if (cancel_pending)
|
||||
+ tp_object_cancel( this, FALSE, NULL );
|
||||
+ tp_object_wait( this );
|
||||
+ }
|
||||
+}
|
||||
--
|
||||
2.2.2
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,342 @@
|
||||
From 3477bdc9e48312f6188f9c9beb8d062291f8b81f Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Sun, 1 Feb 2015 19:41:13 +0100
|
||||
Subject: kernel32: Forward various threadpool functions to ntdll.
|
||||
|
||||
---
|
||||
dlls/kernel32/kernel32.spec | 48 ++++++++++----------
|
||||
dlls/kernel32/tests/thread.c | 6 +--
|
||||
dlls/kernel32/thread.c | 101 +++++++++++++++++++++++++++++++++++++++++++
|
||||
include/winternl.h | 27 ++++++++++++
|
||||
4 files changed, 155 insertions(+), 27 deletions(-)
|
||||
|
||||
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
|
||||
index 3719505..4d170d5 100644
|
||||
--- a/dlls/kernel32/kernel32.spec
|
||||
+++ b/dlls/kernel32/kernel32.spec
|
||||
@@ -204,7 +204,7 @@
|
||||
@ stdcall BuildCommDCBAndTimeoutsA(str ptr ptr)
|
||||
@ stdcall BuildCommDCBAndTimeoutsW(wstr ptr ptr)
|
||||
@ stdcall BuildCommDCBW(wstr ptr)
|
||||
-# @ stub CallbackMayRunLong
|
||||
+@ stdcall CallbackMayRunLong(ptr) ntdll.TpCallbackMayRunLong
|
||||
@ stdcall CallNamedPipeA(str ptr long ptr long ptr long)
|
||||
@ stdcall CallNamedPipeW(wstr ptr long ptr long ptr long)
|
||||
@ stub CancelDeviceWakeupRequest
|
||||
@@ -228,13 +228,13 @@
|
||||
# @ stub ClosePrivateNamespace
|
||||
@ stdcall CloseProfileUserMapping()
|
||||
@ stub CloseSystemHandle
|
||||
-# @ stub CloseThreadpool
|
||||
-# @ stub CloseThreadpoolCleanupGroup
|
||||
-# @ stub CloseThreadpoolCleanupGroupMembers
|
||||
+@ stdcall CloseThreadpool(ptr) ntdll.TpReleasePool
|
||||
+@ stdcall CloseThreadpoolCleanupGroup(ptr) ntdll.TpReleaseCleanupGroup
|
||||
+@ stdcall CloseThreadpoolCleanupGroupMembers(ptr long ptr) ntdll.TpReleaseCleanupGroupMembers
|
||||
# @ stub CloseThreadpoolIo
|
||||
-# @ stub CloseThreadpoolTimer
|
||||
+@ stdcall CloseThreadpoolTimer(ptr) ntdll.TpReleaseTimer
|
||||
# @ stub CloseThreadpoolWait
|
||||
-# @ stub CloseThreadpoolWork
|
||||
+@ stdcall CloseThreadpoolWork(ptr) ntdll.TpReleaseWork
|
||||
@ stdcall CmdBatNotification(long)
|
||||
@ stdcall CommConfigDialogA(str long ptr)
|
||||
@ stdcall CommConfigDialogW(wstr long ptr)
|
||||
@@ -331,12 +331,12 @@
|
||||
@ stdcall CreateSymbolicLinkW(wstr wstr long)
|
||||
@ stdcall CreateTapePartition(long long long long)
|
||||
@ stdcall CreateThread(ptr long ptr long long ptr)
|
||||
-# @ stub CreateThreadpool
|
||||
-# @ stub CreateThreadpoolCleanupGroup
|
||||
+@ stdcall CreateThreadpool(ptr)
|
||||
+@ stdcall CreateThreadpoolCleanupGroup()
|
||||
# @ stub CreateThreadpoolIo
|
||||
-# @ stub CreateThreadpoolTimer
|
||||
+@ stdcall CreateThreadpoolTimer(ptr ptr ptr)
|
||||
# @ stub CreateThreadpoolWait
|
||||
-# @ stub CreateThreadpoolWork
|
||||
+@ stdcall CreateThreadpoolWork(ptr ptr ptr)
|
||||
@ stdcall CreateTimerQueue ()
|
||||
@ stdcall CreateTimerQueueTimer(ptr long ptr ptr long long long)
|
||||
@ stdcall CreateToolhelp32Snapshot(long long)
|
||||
@@ -369,7 +369,7 @@
|
||||
@ stdcall DeleteFileW(wstr)
|
||||
# @ stub DeleteProcThreadAttributeList
|
||||
# @ stub DisableThreadProfiling
|
||||
-# @ stub DisassociateCurrentThreadFromCallback
|
||||
+@ stdcall DisassociateCurrentThreadFromCallback(ptr) ntdll.TpDisassociateCallback
|
||||
@ stdcall DeleteTimerQueue(long)
|
||||
@ stdcall DeleteTimerQueueEx (long long)
|
||||
@ stdcall DeleteTimerQueueTimer(long long long)
|
||||
@@ -495,7 +495,6 @@
|
||||
@ stdcall FindFirstVolumeMountPointA(str ptr long)
|
||||
@ stdcall FindFirstVolumeMountPointW(wstr ptr long)
|
||||
@ stdcall FindFirstVolumeW(ptr long)
|
||||
-# @ stub FreeLibraryWhenCallbackReturns
|
||||
@ stdcall FindNextChangeNotification(long)
|
||||
@ stdcall FindNextFileA(long ptr)
|
||||
# @ stub FindNextFileNameW
|
||||
@@ -533,6 +532,7 @@
|
||||
@ stub -i386 FreeLSCallback
|
||||
@ stdcall FreeLibrary(long)
|
||||
@ stdcall FreeLibraryAndExitThread(long long)
|
||||
+@ stdcall FreeLibraryWhenCallbackReturns(ptr ptr) ntdll.TpCallbackUnloadDllOnCompletion
|
||||
@ stdcall FreeResource(long)
|
||||
@ stdcall -i386 -private FreeSLCallback(long) krnl386.exe16.FreeSLCallback
|
||||
@ stub FreeUserPhysicalPages
|
||||
@@ -980,7 +980,7 @@
|
||||
@ stub -i386 IsSLCallback
|
||||
@ stdcall IsSystemResumeAutomatic()
|
||||
@ stdcall IsThreadAFiber()
|
||||
-# @ stub IsThreadpoolTimerSet
|
||||
+@ stdcall IsThreadpoolTimerSet(ptr) ntdll.TpIsTimerSet
|
||||
# @ stub IsTimeZoneRedirectionEnabled
|
||||
# @ stub IsValidCalDateTime
|
||||
@ stdcall IsValidCodePage(long)
|
||||
@@ -1034,7 +1034,7 @@
|
||||
@ stdcall LZSeek(long long long)
|
||||
@ stdcall LZStart()
|
||||
@ stdcall LeaveCriticalSection(ptr) ntdll.RtlLeaveCriticalSection
|
||||
-# @ stub LeaveCriticalSectionWhenCallbackReturns
|
||||
+@ stdcall LeaveCriticalSectionWhenCallbackReturns(ptr ptr) ntdll.TpCallbackLeaveCriticalSectionOnCompletion
|
||||
# @ stub LoadAppInitDlls
|
||||
@ stdcall LoadLibraryA(str)
|
||||
@ stdcall LoadLibraryExA( str long long)
|
||||
@@ -1251,9 +1251,9 @@
|
||||
@ stdcall ReinitializeCriticalSection(ptr)
|
||||
@ stdcall ReleaseActCtx(ptr)
|
||||
@ stdcall ReleaseMutex(long)
|
||||
-# @ stub ReleaseMutexWhenCallbackReturns
|
||||
+@ stdcall ReleaseMutexWhenCallbackReturns(ptr long) ntdll.TpCallbackReleaseMutexOnCompletion
|
||||
@ stdcall ReleaseSemaphore(long long ptr)
|
||||
-# @ stub ReleaseSemaphoreWhenCallbackReturns
|
||||
+@ stdcall ReleaseSemaphoreWhenCallbackReturns(ptr long long) ntdll.TpCallbackReleaseSemaphoreOnCompletion
|
||||
@ stdcall ReleaseSRWLockExclusive(ptr) ntdll.RtlReleaseSRWLockExclusive
|
||||
@ stdcall ReleaseSRWLockShared(ptr) ntdll.RtlReleaseSRWLockShared
|
||||
@ stdcall RemoveDirectoryA(str)
|
||||
@@ -1384,7 +1384,7 @@
|
||||
@ stdcall SetEnvironmentVariableW(wstr wstr)
|
||||
@ stdcall SetErrorMode(long)
|
||||
@ stdcall SetEvent(long)
|
||||
-# @ stub SetEventWhenCallbackReturns
|
||||
+@ stdcall SetEventWhenCallbackReturns(ptr long) ntdll.TpCallbackSetEventOnCompletion
|
||||
@ stdcall SetFileApisToANSI()
|
||||
@ stdcall SetFileApisToOEM()
|
||||
@ stdcall SetFileAttributesA(str long)
|
||||
@@ -1453,9 +1453,9 @@
|
||||
# @ stub SetThreadToken
|
||||
@ stdcall SetThreadUILanguage(long)
|
||||
# @ stub SetThreadpoolStackInformation
|
||||
-# @ stub SetThreadpoolThreadMaximum
|
||||
-# @ stub SetThreadpoolThreadMinimum
|
||||
-# @ stub SetThreadpoolTimer
|
||||
+@ stdcall SetThreadpoolThreadMaximum(ptr long) ntdll.TpSetPoolMaxThreads
|
||||
+@ stdcall SetThreadpoolThreadMinimum(ptr long) ntdll.TpSetPoolMinThreads
|
||||
+@ stdcall SetThreadpoolTimer(ptr ptr long long)
|
||||
# @ stub SetThreadpoolWait
|
||||
@ stdcall SetTimeZoneInformation(ptr)
|
||||
@ stub SetTimerQueueTimer
|
||||
@@ -1481,7 +1481,7 @@
|
||||
# @ stub SortCloseHandle
|
||||
# @ stub SortGetHandle
|
||||
# @ stub StartThreadpoolIo
|
||||
-# @ stub SubmitThreadpoolWork
|
||||
+@ stdcall SubmitThreadpoolWork(ptr) ntdll.TpPostWork
|
||||
@ stdcall SuspendThread(long)
|
||||
@ stdcall SwitchToFiber(ptr)
|
||||
@ stdcall SwitchToThread()
|
||||
@@ -1508,7 +1508,7 @@
|
||||
@ stdcall TryAcquireSRWLockExclusive(ptr) ntdll.RtlTryAcquireSRWLockExclusive
|
||||
@ stdcall TryAcquireSRWLockShared(ptr) ntdll.RtlTryAcquireSRWLockShared
|
||||
@ stdcall TryEnterCriticalSection(ptr) ntdll.RtlTryEnterCriticalSection
|
||||
-# @ stub TrySubmitThreadpoolCallback
|
||||
+@ stdcall TrySubmitThreadpoolCallback(ptr ptr ptr) ntdll.TpSimpleTryPost
|
||||
@ stdcall TzSpecificLocalTimeToSystemTime(ptr ptr ptr)
|
||||
# @ stub TzSpecificLocalTimeToSystemTimeEx
|
||||
# @ stub -arch=x86_64 uaw_lstrcmpW
|
||||
@@ -1570,9 +1570,9 @@
|
||||
@ stdcall WaitForSingleObject(long long)
|
||||
@ stdcall WaitForSingleObjectEx(long long long)
|
||||
# @ stub WaitForThreadpoolIoCallbacks
|
||||
-# @ stub WaitForThreadpoolTimerCallbacks
|
||||
+@ stdcall WaitForThreadpoolTimerCallbacks(ptr long) ntdll.TpWaitForTimer
|
||||
# @ stub WaitForThreadpoolWaitCallbacks
|
||||
-# @ stub WaitForThreadpoolWorkCallbacks
|
||||
+@ stdcall WaitForThreadpoolWorkCallbacks(ptr long) ntdll.TpWaitForWork
|
||||
@ stdcall WaitNamedPipeA (str long)
|
||||
@ stdcall WaitNamedPipeW (wstr long)
|
||||
@ stdcall WakeAllConditionVariable(ptr) ntdll.RtlWakeAllConditionVariable
|
||||
diff --git a/dlls/kernel32/tests/thread.c b/dlls/kernel32/tests/thread.c
|
||||
index d3ecd2a..25801b2 100644
|
||||
--- a/dlls/kernel32/tests/thread.c
|
||||
+++ b/dlls/kernel32/tests/thread.c
|
||||
@@ -1627,8 +1627,8 @@ static void test_threadpool(void)
|
||||
int workcalled = 0;
|
||||
|
||||
if (!pCreateThreadpool) {
|
||||
- todo_wine win_skip("thread pool apis not supported.\n");
|
||||
- return;
|
||||
+ win_skip("thread pool apis not supported.\n");
|
||||
+ return;
|
||||
}
|
||||
|
||||
work = pCreateThreadpoolWork(threadpool_workcallback, &workcalled, NULL);
|
||||
@@ -1640,7 +1640,7 @@ static void test_threadpool(void)
|
||||
ok (workcalled == 1, "expected work to be called once, got %d\n", workcalled);
|
||||
|
||||
pool = pCreateThreadpool(NULL);
|
||||
- todo_wine ok (pool != NULL, "CreateThreadpool failed\n");
|
||||
+ ok (pool != NULL, "CreateThreadpool failed\n");
|
||||
}
|
||||
|
||||
static void test_reserved_tls(void)
|
||||
diff --git a/dlls/kernel32/thread.c b/dlls/kernel32/thread.c
|
||||
index 0abfdf1..085b011 100644
|
||||
--- a/dlls/kernel32/thread.c
|
||||
+++ b/dlls/kernel32/thread.c
|
||||
@@ -831,3 +831,104 @@ BOOL WINAPI GetThreadPreferredUILanguages( DWORD flags, PULONG count, PCZZWSTR b
|
||||
*buffersize = 0;
|
||||
return TRUE;
|
||||
}
|
||||
+
|
||||
+/***********************************************************************
|
||||
+ * CreateThreadpool (KERNEL32.@)
|
||||
+ */
|
||||
+PTP_POOL WINAPI CreateThreadpool( PVOID reserved )
|
||||
+{
|
||||
+ TP_POOL *pool;
|
||||
+ NTSTATUS status;
|
||||
+
|
||||
+ TRACE( "%p\n", reserved );
|
||||
+
|
||||
+ status = TpAllocPool( &pool, reserved );
|
||||
+ if (status)
|
||||
+ {
|
||||
+ SetLastError( RtlNtStatusToDosError(status) );
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ return pool;
|
||||
+}
|
||||
+
|
||||
+/***********************************************************************
|
||||
+ * CreateThreadpoolCleanupGroup (KERNEL32.@)
|
||||
+ */
|
||||
+PTP_CLEANUP_GROUP WINAPI CreateThreadpoolCleanupGroup( void )
|
||||
+{
|
||||
+ TP_CLEANUP_GROUP *group;
|
||||
+ NTSTATUS status;
|
||||
+
|
||||
+ TRACE( "\n" );
|
||||
+
|
||||
+ status = TpAllocCleanupGroup( &group );
|
||||
+ if (status)
|
||||
+ {
|
||||
+ SetLastError( RtlNtStatusToDosError(status) );
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ return group;
|
||||
+}
|
||||
+
|
||||
+/***********************************************************************
|
||||
+ * CreateThreadpoolTimer (KERNEL32.@)
|
||||
+ */
|
||||
+PTP_TIMER WINAPI CreateThreadpoolTimer( PTP_TIMER_CALLBACK callback, PVOID userdata,
|
||||
+ TP_CALLBACK_ENVIRON *environment )
|
||||
+{
|
||||
+ TP_TIMER *timer;
|
||||
+ NTSTATUS status;
|
||||
+
|
||||
+ TRACE( "%p, %p, %p\n", callback, userdata, environment );
|
||||
+
|
||||
+ status = TpAllocTimer( &timer, callback, userdata, environment );
|
||||
+ if (status)
|
||||
+ {
|
||||
+ SetLastError( RtlNtStatusToDosError(status) );
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ return timer;
|
||||
+}
|
||||
+
|
||||
+/***********************************************************************
|
||||
+ * CreateThreadpoolWork (KERNEL32.@)
|
||||
+ */
|
||||
+PTP_WORK WINAPI CreateThreadpoolWork( PTP_WORK_CALLBACK callback, PVOID userdata,
|
||||
+ TP_CALLBACK_ENVIRON *environment )
|
||||
+{
|
||||
+ TP_WORK *work;
|
||||
+ NTSTATUS status;
|
||||
+
|
||||
+ TRACE( "%p, %p, %p\n", callback, userdata, environment );
|
||||
+
|
||||
+ status = TpAllocWork( &work, callback, userdata, environment );
|
||||
+ if (status)
|
||||
+ {
|
||||
+ SetLastError( RtlNtStatusToDosError(status) );
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ return work;
|
||||
+}
|
||||
+
|
||||
+/***********************************************************************
|
||||
+ * SetThreadpoolTimer (KERNEL32.@)
|
||||
+ */
|
||||
+VOID WINAPI SetThreadpoolTimer( TP_TIMER *timer, FILETIME *due_time,
|
||||
+ DWORD period, DWORD window_length )
|
||||
+{
|
||||
+ LARGE_INTEGER timeout;
|
||||
+
|
||||
+ TRACE( "%p, %p, %u, %u\n", timer, due_time, period, window_length );
|
||||
+
|
||||
+ if (due_time)
|
||||
+ {
|
||||
+ timeout.u.LowPart = due_time->dwLowDateTime;
|
||||
+ timeout.u.HighPart = due_time->dwHighDateTime;
|
||||
+ }
|
||||
+
|
||||
+ TpSetTimer( timer, due_time ? &timeout : NULL, period, window_length );
|
||||
+}
|
||||
diff --git a/include/winternl.h b/include/winternl.h
|
||||
index 1a694da..a534bd1 100644
|
||||
--- a/include/winternl.h
|
||||
+++ b/include/winternl.h
|
||||
@@ -2599,6 +2599,33 @@ NTSYSAPI LONGLONG WINAPI RtlLargeIntegerSubtract(LONGLONG,LONGLONG);
|
||||
NTSYSAPI NTSTATUS WINAPI RtlLargeIntegerToChar(const ULONGLONG *,ULONG,ULONG,PCHAR);
|
||||
#endif
|
||||
|
||||
+/* Threadpool functions */
|
||||
+
|
||||
+NTSYSAPI NTSTATUS WINAPI TpAllocCleanupGroup(TP_CLEANUP_GROUP **);
|
||||
+NTSYSAPI NTSTATUS WINAPI TpAllocPool(TP_POOL **,PVOID);
|
||||
+NTSYSAPI NTSTATUS WINAPI TpAllocTimer(TP_TIMER **,PTP_TIMER_CALLBACK,PVOID,TP_CALLBACK_ENVIRON *);
|
||||
+NTSYSAPI NTSTATUS WINAPI TpAllocWork(TP_WORK **,PTP_WORK_CALLBACK,PVOID,TP_CALLBACK_ENVIRON *);
|
||||
+NTSYSAPI void WINAPI TpCallbackLeaveCriticalSectionOnCompletion(TP_CALLBACK_INSTANCE *,RTL_CRITICAL_SECTION *);
|
||||
+NTSYSAPI NTSTATUS WINAPI TpCallbackMayRunLong(TP_CALLBACK_INSTANCE *);
|
||||
+NTSYSAPI void WINAPI TpCallbackReleaseMutexOnCompletion(TP_CALLBACK_INSTANCE *,HANDLE);
|
||||
+NTSYSAPI void WINAPI TpCallbackReleaseSemaphoreOnCompletion(TP_CALLBACK_INSTANCE *,HANDLE,DWORD);
|
||||
+NTSYSAPI void WINAPI TpCallbackSetEventOnCompletion(TP_CALLBACK_INSTANCE *,HANDLE);
|
||||
+NTSYSAPI void WINAPI TpCallbackUnloadDllOnCompletion(TP_CALLBACK_INSTANCE *,HMODULE);
|
||||
+NTSYSAPI void WINAPI TpDisassociateCallback(TP_CALLBACK_INSTANCE *);
|
||||
+NTSYSAPI BOOL WINAPI TpIsTimerSet(TP_TIMER *);
|
||||
+NTSYSAPI void WINAPI TpPostWork(TP_WORK *);
|
||||
+NTSYSAPI void WINAPI TpReleaseCleanupGroup(TP_CLEANUP_GROUP *);
|
||||
+NTSYSAPI void WINAPI TpReleaseCleanupGroupMembers(TP_CLEANUP_GROUP *,BOOL,PVOID);
|
||||
+NTSYSAPI void WINAPI TpReleasePool(TP_POOL *);
|
||||
+NTSYSAPI void WINAPI TpReleaseTimer(TP_TIMER *);
|
||||
+NTSYSAPI void WINAPI TpReleaseWork(TP_WORK *);
|
||||
+NTSYSAPI void WINAPI TpSetPoolMaxThreads(TP_POOL *,DWORD);
|
||||
+NTSYSAPI BOOL WINAPI TpSetPoolMinThreads(TP_POOL *,DWORD);
|
||||
+NTSYSAPI void WINAPI TpSetTimer(TP_TIMER *, LARGE_INTEGER *,LONG,LONG);
|
||||
+NTSYSAPI NTSTATUS WINAPI TpSimpleTryPost(PTP_SIMPLE_CALLBACK,PVOID,TP_CALLBACK_ENVIRON *);
|
||||
+NTSYSAPI void WINAPI TpWaitForTimer(TP_TIMER *,BOOL);
|
||||
+NTSYSAPI void WINAPI TpWaitForWork(TP_WORK *,BOOL);
|
||||
+
|
||||
/* Wine internal functions */
|
||||
|
||||
NTSYSAPI NTSTATUS CDECL wine_nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRING *unix_name_ret,
|
||||
--
|
||||
2.2.2
|
||||
|
3
patches/ntdll-Vista_Threadpool/definition
Normal file
3
patches/ntdll-Vista_Threadpool/definition
Normal file
@ -0,0 +1,3 @@
|
||||
Fixes: [35192] Add implementation for CreateThreadpool
|
||||
Fixes: [32531] Implement threadpool work items
|
||||
Fixes: [37306] Implement threadpool timers
|
@ -14,15 +14,11 @@ diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
|
||||
index 51de6e7..44dfc22 100644
|
||||
--- a/dlls/ntdll/ntdll.spec
|
||||
+++ b/dlls/ntdll/ntdll.spec
|
||||
@@ -968,6 +968,8 @@
|
||||
@ stdcall RtlxUnicodeStringToAnsiSize(ptr) RtlUnicodeStringToAnsiSize
|
||||
@ stdcall RtlxUnicodeStringToOemSize(ptr) RtlUnicodeStringToOemSize
|
||||
@@ -970,2 +970,4 @@
|
||||
@ stdcall -ret64 VerSetConditionMask(int64 long long)
|
||||
+@ stdcall WinSqmEndSession(ptr)
|
||||
+@ stdcall WinSqmStartSession(ptr long long)
|
||||
@ stdcall ZwAcceptConnectPort(ptr long ptr long long ptr) NtAcceptConnectPort
|
||||
@ stdcall ZwAccessCheck(ptr long long ptr ptr ptr ptr ptr) NtAccessCheck
|
||||
@ stdcall ZwAccessCheckAndAuditAlarm(ptr long ptr ptr ptr long ptr long ptr ptr ptr) NtAccessCheckAndAuditAlarm
|
||||
diff --git a/dlls/ntdll/rtl.c b/dlls/ntdll/rtl.c
|
||||
index 8f6f386..2e87beb 100644
|
||||
--- a/dlls/ntdll/rtl.c
|
||||
|
@ -132,6 +132,7 @@ patch_enable_all ()
|
||||
enable_ntdll_RtlUnwindEx="$1"
|
||||
enable_ntdll_ThreadTime="$1"
|
||||
enable_ntdll_User_Shared_Data="$1"
|
||||
enable_ntdll_Vista_Threadpool="$1"
|
||||
enable_ntdll_WRITECOPY="$1"
|
||||
enable_ntdll_WinSqm="$1"
|
||||
enable_ntoskrnl_DriverTest="$1"
|
||||
@ -417,6 +418,9 @@ patch_enable ()
|
||||
ntdll-User_Shared_Data)
|
||||
enable_ntdll_User_Shared_Data="$2"
|
||||
;;
|
||||
ntdll-Vista_Threadpool)
|
||||
enable_ntdll_Vista_Threadpool="$2"
|
||||
;;
|
||||
ntdll-WRITECOPY)
|
||||
enable_ntdll_WRITECOPY="$2"
|
||||
;;
|
||||
@ -2212,6 +2216,35 @@ if test "$enable_ntdll_User_Shared_Data" -eq 1; then
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset ntdll-Vista_Threadpool
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#35192] Add implementation for CreateThreadpool
|
||||
# | * [#32531] Implement threadpool work items
|
||||
# | * [#37306] Implement threadpool timers
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/kernel32/kernel32.spec, dlls/kernel32/tests/thread.c, dlls/kernel32/thread.c, dlls/ntdll/Makefile.in,
|
||||
# | dlls/ntdll/ntdll.spec, dlls/ntdll/tests/Makefile.in, dlls/ntdll/tests/threadpool.c, dlls/ntdll/threadpool2.c,
|
||||
# | include/winternl.h
|
||||
# |
|
||||
if test "$enable_ntdll_Vista_Threadpool" -eq 1; then
|
||||
patch_apply ntdll-Vista_Threadpool/0001-ntdll-Add-threadpool-stub-functions-to-specfile.patch
|
||||
patch_apply ntdll-Vista_Threadpool/0002-ntdll-Implement-threadpool-cleanup-group-and-callbac.patch
|
||||
patch_apply ntdll-Vista_Threadpool/0003-ntdll-Implement-additional-threadpool-work-item-func.patch
|
||||
patch_apply ntdll-Vista_Threadpool/0004-ntdll-Implement-threadpool-timer-functions.patch
|
||||
patch_apply ntdll-Vista_Threadpool/0005-ntdll-tests-Add-tests-for-Tp-threadpool-functions.patch
|
||||
patch_apply ntdll-Vista_Threadpool/0006-kernel32-Forward-various-threadpool-functions-to-ntd.patch
|
||||
(
|
||||
echo '+ { "Sebastian Lackner", "ntdll: Add threadpool stub functions to specfile.", 1 },';
|
||||
echo '+ { "Sebastian Lackner", "ntdll: Implement threadpool, cleanup group and callback instance functions.", 1 },';
|
||||
echo '+ { "Sebastian Lackner", "ntdll: Implement additional threadpool work item functions.", 1 },';
|
||||
echo '+ { "Sebastian Lackner", "ntdll: Implement threadpool timer functions.", 1 },';
|
||||
echo '+ { "Sebastian Lackner", "ntdll/tests: Add tests for Tp* threadpool functions.", 1 },';
|
||||
echo '+ { "Sebastian Lackner", "kernel32: Forward various threadpool functions to ntdll.", 1 },';
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset ntdll-WinSqm
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
|
Loading…
x
Reference in New Issue
Block a user