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