Module: wine Branch: refs/heads/master Commit: a18bdf13f7156ff96407a545170d74522171819f URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=a18bdf13f7156ff96407a545...
Author: Robert Shearman rob@codeweavers.com Date: Mon Mar 13 11:28:28 2006 +0000
ntdll: Very crude implementation of RtlQueueWorkItem.
---
dlls/ntdll/Makefile.in | 1 dlls/ntdll/ntdll.spec | 2 - dlls/ntdll/threadpool.c | 107 +++++++++++++++++++++++++++++++++++++++++++++++ include/winternl.h | 2 + 4 files changed, 111 insertions(+), 1 deletions(-) create mode 100644 dlls/ntdll/threadpool.c
diff --git a/dlls/ntdll/Makefile.in b/dlls/ntdll/Makefile.in index 73f2ef8..fa99da4 100644 --- a/dlls/ntdll/Makefile.in +++ b/dlls/ntdll/Makefile.in @@ -47,6 +47,7 @@ C_SRCS = \ tape.c \ version.c \ thread.c \ + threadpool.c \ time.c \ virtual.c \ wcstring.c diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 8117197..7ccbbfd 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -781,7 +781,7 @@ @ stub RtlQueryTagHeap @ stdcall RtlQueryTimeZoneInformation(ptr) @ stub RtlQueueApcWow64Thread -@ stub RtlQueueWorkItem +@ stdcall RtlQueueWorkItem(ptr ptr long) @ stdcall -register RtlRaiseException(ptr) @ stdcall RtlRaiseStatus(long) @ stdcall RtlRandom(ptr) diff --git a/dlls/ntdll/threadpool.c b/dlls/ntdll/threadpool.c new file mode 100644 index 0000000..10bda48 --- /dev/null +++ b/dlls/ntdll/threadpool.c @@ -0,0 +1,107 @@ +/* + * Thread pooling + * + * Copyright (c) 2006 Robert Shearman + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <stdarg.h> + +#define NONAMELESSUNION +#include "ntstatus.h" +#define WIN32_NO_STATUS +#include "winternl.h" + +#include "wine/debug.h" +#include "ntdll_misc.h" + +WINE_DEFAULT_DEBUG_CHANNEL(threadpool); + +struct work_item +{ + PRTL_WORK_ITEM_ROUTINE function; + PVOID context; +}; + +static void WINAPI worker_thread_proc(void * param) +{ + struct work_item *work_item_ptr = (struct work_item *)param; + struct work_item work_item; + + /* free the work item memory sooner to reduce memory usage */ + work_item = *work_item_ptr; + RtlFreeHeap(GetProcessHeap(), 0, work_item_ptr); + + TRACE("executing %p(%p)\n", work_item.function, work_item.context); + + /* do the work */ + work_item.function(work_item.context); + + RtlExitUserThread(0); + + /* never reached */ +} + +/*********************************************************************** + * RtlQueueWorkItem (NTDLL.@) + * + * Queues a work item into a thread in the thread pool. + * + * PARAMS + * Function [I] Work function to execute. + * Context [I] Context to pass to the work function when it is executed. + * Flags [I] Flags. See notes. + * + * RETURNS + * Success: STATUS_SUCCESS. + * Failure: Any NTSTATUS code. + * + * NOTES + * Flags can be one or more of the following: + *|WT_EXECUTEDEFAULT - Executes the work item in a non-I/O worker thread. + *|WT_EXECUTEINIOTHREAD - Executes the work item in an I/O worker thread. + *|WT_EXECUTEINPERSISTENTTHREAD - Executes the work item in a thread that is persistent. + *|WT_EXECUTELONGFUNCTION - Hints that the execution can take a long time. + *|WT_TRANSFER_IMPERSONATION - Executes the function with the current access token. + */ +NTSTATUS WINAPI RtlQueueWorkItem(PRTL_WORK_ITEM_ROUTINE Function, PVOID Context, ULONG Flags) +{ + HANDLE thread; + NTSTATUS status; + struct work_item *work_item = RtlAllocateHeap(GetProcessHeap(), 0, sizeof(struct work_item)); + + if (!work_item) + return STATUS_NO_MEMORY; + + work_item->function = Function; + work_item->context = Context; + + if (Flags != WT_EXECUTEDEFAULT) + FIXME("Flags 0x%lx not supported\n", Flags); + + /* FIXME: very crude implementation that doesn't support pooling at all */ + status = RtlCreateUserThread( GetCurrentProcess(), NULL, FALSE, + NULL, 0, 0, + worker_thread_proc, work_item, &thread, NULL ); + if (status != STATUS_SUCCESS) + { + RtlFreeHeap(GetProcessHeap(), 0, work_item); + return status; + } + NtClose( thread ); + + return STATUS_SUCCESS; +} diff --git a/include/winternl.h b/include/winternl.h index 6666294..e3548d4 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -1429,6 +1429,7 @@ typedef struct _RTL_HANDLE_TABLE
typedef void (CALLBACK *PNTAPCFUNC)(ULONG_PTR,ULONG_PTR,ULONG_PTR); /* FIXME: not the right name */ typedef void (CALLBACK *PRTL_THREAD_START_ROUTINE)(LPVOID); /* FIXME: not the right name */ +typedef DWORD (CALLBACK *PRTL_WORK_ITEM_ROUTINE)(LPVOID); /* FIXME: not the right name */
/* DbgPrintEx default levels */ @@ -2129,6 +2130,7 @@ NTSTATUS WINAPI RtlQueryInformationAcl( NTSTATUS WINAPI RtlQueryProcessDebugInformation(ULONG,ULONG,PDEBUG_BUFFER); NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID); NTSTATUS WINAPI RtlQueryTimeZoneInformation(RTL_TIME_ZONE_INFORMATION*); +NTSTATUS WINAPI RtlQueueWorkItem(PRTL_WORK_ITEM_ROUTINE,PVOID,ULONG); void WINAPI RtlRaiseException(PEXCEPTION_RECORD); void WINAPI RtlRaiseStatus(NTSTATUS); ULONG WINAPI RtlRandom(PULONG);