Module: wine
Branch: refs/heads/master
Commit: a18bdf13f7156ff96407a545170d74522171819f
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=a18bdf13f7156ff96407a54…
Author: Robert Shearman <rob(a)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);
Module: wine
Branch: refs/heads/master
Commit: 0252e5e875d6db0b774431c820029f98112e17a3
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=0252e5e875d6db0b774431c…
Author: Robert Shearman <rob(a)codeweavers.com>
Date: Sat Mar 11 18:11:25 2006 +0000
wininet: Fix the conversion of NULL component values from InternetCreateUrlA.
---
dlls/wininet/internet.c | 7 +++++--
dlls/wininet/tests/http.c | 2 --
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c
index 5e303ae..51db944 100644
--- a/dlls/wininet/internet.c
+++ b/dlls/wininet/internet.c
@@ -1097,14 +1097,17 @@ static void ConvertUrlComponentValue(LPS
LPWSTR lpwszComponent, DWORD dwwComponentLen,
LPCSTR lpszStart, LPCWSTR lpwszStart)
{
- TRACE("%p %p %p %ld %p %p\n", lppszComponent, dwComponentLen, lpwszComponent, dwwComponentLen, lpszStart, lpwszStart);
+ TRACE("%p %ld %p %ld %p %p\n", lppszComponent, *dwComponentLen, lpwszComponent, dwwComponentLen, lpszStart, lpwszStart);
if (*dwComponentLen != 0)
{
DWORD nASCIILength=WideCharToMultiByte(CP_ACP,0,lpwszComponent,dwwComponentLen,NULL,0,NULL,NULL);
if (*lppszComponent == NULL)
{
int nASCIIOffset=WideCharToMultiByte(CP_ACP,0,lpwszStart,lpwszComponent-lpwszStart,NULL,0,NULL,NULL);
- *lppszComponent = (LPSTR)lpszStart+nASCIIOffset;
+ if (lpwszComponent)
+ *lppszComponent = (LPSTR)lpszStart+nASCIIOffset;
+ else
+ *lppszComponent = NULL;
*dwComponentLen = nASCIILength;
}
else
diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c
index 9c7e213..093fb74 100644
--- a/dlls/wininet/tests/http.c
+++ b/dlls/wininet/tests/http.c
@@ -610,11 +610,9 @@ static void InternetCrackUrl_test(void)
ok(!strncmp(urlComponents.lpszHostName,TEST_URL_HOST,strlen(TEST_URL_HOST)),"lpszHostName should be %s but is %s\n", TEST_URL_HOST, urlComponents.lpszHostName);
ok(urlComponents.nPort == INTERNET_DEFAULT_HTTP_PORT,"urlComponents->nPort should have been 80 instead of %d\n", urlComponents.nPort);
ok(urlComponents.nScheme == INTERNET_SCHEME_HTTP,"urlComponents->nScheme should have been INTERNET_SCHEME_HTTP instead of %d\n", urlComponents.nScheme);
- todo_wine {
ok(!urlComponents.lpszUserName, ".lpszUserName should have been set to NULL\n");
ok(!urlComponents.lpszPassword, ".lpszPassword should have been set to NULL\n");
ok(!urlComponents.lpszExtraInfo, ".lpszExtraInfo should have been set to NULL\n");
- }
ok(!urlComponents.dwUserNameLength,".dwUserNameLength should be 0, but is %ld\n", urlComponents.dwUserNameLength);
ok(!urlComponents.dwPasswordLength,".dwPasswordLength should be 0, but is %ld\n", urlComponents.dwPasswordLength);
ok(!urlComponents.dwExtraInfoLength,".dwExtraInfoLength should be 0, but is %ld\n", urlComponents.dwExtraInfoLength);