Robert Shearman : ntdll: Very crude implementation of
RtlQueueWorkItem.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Mar 13 08:46:44 CST 2006
Module: wine
Branch: refs/heads/master
Commit: a18bdf13f7156ff96407a545170d74522171819f
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=a18bdf13f7156ff96407a545170d74522171819f
Author: Robert Shearman <rob at 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);
More information about the wine-cvs
mailing list