[UPDATED] PATCH: implemented Fiber APIs
Alberto Massari
alby at exln.com
Tue Dec 17 05:17:24 CST 2002
As requested by Dimitrie, this version of the patch has just one #ifdef block.
Alberto
Index: dlls/kernel/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/kernel/Makefile.in,v
retrieving revision 1.52
diff -u -r1.52 Makefile.in
--- dlls/kernel/Makefile.in 11 Dec 2002 01:34:52 -0000 1.52
+++ dlls/kernel/Makefile.in 17 Dec 2002 11:11:46 -0000
@@ -16,6 +16,7 @@
console.c \
debugger.c \
editline.c \
+ fiber.c \
format_msg.c \
kernel_main.c \
locale.c \
Index: dlls/kernel/kernel32.spec
===================================================================
RCS file: /home/wine/wine/dlls/kernel/kernel32.spec,v
retrieving revision 1.85
diff -u -r1.85 kernel32.spec
--- dlls/kernel/kernel32.spec 15 Dec 2002 01:22:41 -0000 1.85
+++ dlls/kernel/kernel32.spec 17 Dec 2002 11:11:47 -0000
@@ -182,7 +182,6 @@
@ stdcall ConnectNamedPipe(long ptr) ConnectNamedPipe
@ stdcall ContinueDebugEvent(long long long) ContinueDebugEvent
@ stdcall ConvertDefaultLocale (long) ConvertDefaultLocale
-@ stub ConvertThreadToFiber
@ stdcall ConvertToGlobalHandle(long) ConvertToGlobalHandle
@ stdcall CopyFileA(str str long) CopyFileA
@ stdcall CopyFileW(wstr wstr long) CopyFileW
@@ -983,10 +982,11 @@
@ stdcall CancelWaitableTimer(long) CancelWaitableTimer
@ stdcall CopyFileExA (str str ptr ptr ptr long) CopyFileExA
@ stdcall CopyFileExW (wstr wstr ptr ptr ptr long) CopyFileExW
-@ stub CreateFiber
+@ stdcall ConvertThreadToFiber(ptr) ConvertThreadToFiber
+@ stdcall CreateFiber(long ptr ptr) CreateFiber
@ stdcall CreateWaitableTimerA(ptr long str) CreateWaitableTimerA
@ stdcall CreateWaitableTimerW(ptr long wstr) CreateWaitableTimerW
-@ stub DeleteFiber
+@ stdcall DeleteFiber(ptr) DeleteFiber
@ stub DuplicateConsoleHandle
@ stdcall FindFirstFileExA(str long ptr long ptr long)FindFirstFileExA
@ stdcall FindFirstFileExW(wstr long ptr long ptr long)FindFirstFileExW
@@ -1018,7 +1018,7 @@
@ stdcall SetThreadPriorityBoost(long long) SetThreadPriorityBoost
@ stdcall SetWaitableTimer(long ptr long ptr ptr long) SetWaitableTimer
@ stub SignalObjectAndWait
-@ stub SwitchToFiber
+@ stdcall SwitchToFiber(ptr) SwitchToFiber
@ stdcall SwitchToThread() SwitchToThread
@ stdcall TryEnterCriticalSection(ptr) ntdll.RtlTryEnterCriticalSection
@ stdcall VirtualAllocEx(long ptr long long long) VirtualAllocEx
Index: dlls/kernel/kernel_main.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/kernel_main.c,v
retrieving revision 1.39
diff -u -r1.39 kernel_main.c
--- dlls/kernel/kernel_main.c 15 Nov 2002 01:01:48 -0000 1.39
+++ dlls/kernel/kernel_main.c 17 Dec 2002 11:11:47 -0000
@@ -41,6 +41,8 @@
#include "wincon.h"
#include "console_private.h"
+extern DWORD fiber_tls_index;
+
extern void LOCALE_Init(void);
extern BOOL RELAY_Init(void);
extern void COMPUTERNAME_Init(void);
@@ -137,8 +139,10 @@
switch(reason)
{
case DLL_PROCESS_ATTACH:
+ fiber_tls_index=TlsAlloc();
return process_attach();
case DLL_PROCESS_DETACH:
+ TlsFree(fiber_tls_index);
WriteOutProfiles16();
break;
}
--- /dev/null 1970-01-01 01:00:00.000000000 +0100
+++ dlls/kernel/fiber.c 2002-12-17 12:22:20.000000000 +0100
@@ -0,0 +1,170 @@
+/*
+ * Fiber code
+ *
+ * Copyright 2002 Alberto Massari
+ *
+ * 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 "config.h"
+#include "wine/port.h"
+
+#include "wine/winbase16.h"
+#include "winnt.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(fiber);
+
+DWORD fiber_tls_index=0;
+
+#ifdef HAVE_UCONTEXT_H
+
+#include <ucontext.h>
+
+typedef struct {
+ BOOL bDeleteStack;
+ ucontext_t context;
+} HFIBER, *PHFIBER;
+
+/***********************************************************************
+ * ConvertThreadToFiber (KERNEL32.@)
+ *
+ * Converts the current thread into a fiber (fibers are just like threads
+ * but the scheduling is done by the user)
+ *
+ */
+LPVOID WINAPI ConvertThreadToFiber(LPVOID lpParameter)
+{
+ PHFIBER pFiber;
+ TRACE("(%p)\n",lpParameter);
+ pFiber=HeapAlloc( GetProcessHeap(), 0, sizeof(HFIBER) );
+ pFiber->bDeleteStack=FALSE;
+ getcontext(&pFiber->context);
+ TlsSetValue(fiber_tls_index,pFiber);
+ return pFiber;
+}
+
+/***********************************************************************
+ * CreateFiber (KERNEL32.@)
+ *
+ * Creates a new fiber object
+ *
+ */
+
+typedef void (*contextFn)();
+
+LPVOID WINAPI CreateFiber(DWORD dwStackSize, LPFIBER_START_ROUTINE lpStartAddress, LPVOID lpParameter)
+{
+ PHFIBER pFiber;
+ TRACE("(%ld,%p,%p)\n",dwStackSize,lpStartAddress,lpParameter);
+ if(dwStackSize==0)
+ dwStackSize=1024*1024; /* default value is 1Mb */
+ pFiber=HeapAlloc( GetProcessHeap(), 0, sizeof(HFIBER) );
+ pFiber->bDeleteStack=TRUE;
+ /* get the current context */
+ getcontext(&pFiber->context);
+ // Modify the context to a new stack
+ pFiber->context.uc_link=0;
+ pFiber->context.uc_stack.ss_sp=HeapAlloc( GetProcessHeap(), 0, dwStackSize);
+ pFiber->context.uc_stack.ss_size=dwStackSize;
+ pFiber->context.uc_stack.ss_flags=0;
+ makecontext(&pFiber->context,(contextFn)lpStartAddress,1,lpParameter);
+ return pFiber;
+}
+
+/***********************************************************************
+ * SwitchToFiber (KERNEL32.@)
+ *
+ * Schedules a fiber for execution
+ *
+ */
+void WINAPI SwitchToFiber(LPVOID lpFiber)
+{
+ PHFIBER pFiber,pCurrentFiber;
+ pFiber=(PHFIBER)lpFiber;
+ pCurrentFiber=(PHFIBER)TlsGetValue(fiber_tls_index);
+ TRACE("Switching from %p to %p\n",pFiber,pCurrentFiber);
+ TlsSetValue(fiber_tls_index,pFiber);
+ swapcontext(&pCurrentFiber->context,&pFiber->context);
+}
+
+/***********************************************************************
+ * DeleteFiber (KERNEL32.@)
+ *
+ * Deletes a fiber object
+ *
+ */
+void WINAPI DeleteFiber(LPVOID lpFiber)
+{
+ PHFIBER pFiber;
+ TRACE("(%p)\n",lpFiber);
+ pFiber=(PHFIBER)lpFiber;
+ if(pFiber->bDeleteStack)
+ HeapFree(GetProcessHeap(), 0, pFiber->context.uc_stack.ss_sp);
+ HeapFree(GetProcessHeap(), 0, pFiber);
+}
+
+#else
+
+/***********************************************************************
+ * ConvertThreadToFiber (KERNEL32.@)
+ *
+ * Converts the current thread into a fiber (fibers are just like threads
+ * but the scheduling is done by the user)
+ *
+ */
+LPVOID WINAPI ConvertThreadToFiber(LPVOID lpParameter)
+{
+ FIXME("(%p) stub\n",lpParameter);
+ return NULL;
+}
+
+/***********************************************************************
+ * CreateFiber (KERNEL32.@)
+ *
+ * Creates a new fiber object
+ *
+ */
+LPVOID WINAPI CreateFiber(DWORD dwStackSize, LPFIBER_START_ROUTINE lpStartAddress, LPVOID lpParameter)
+{
+ FIXME("(%ld, %p, %p) stub\n",dwStackSize,lpStartAddress,lpParameter);
+ return NULL;
+}
+
+/***********************************************************************
+ * SwitchToFiber (KERNEL32.@)
+ *
+ * Schedules a fiber for execution
+ *
+ */
+void WINAPI SwitchToFiber(LPVOID lpFiber)
+{
+ FIXME("(%p) stub\n",lpFiber);
+}
+
+/***********************************************************************
+ * DeleteFiber (KERNEL32.@)
+ *
+ * Deletes a fiber object
+ *
+ */
+void WINAPI DeleteFiber(LPVOID lpFiber)
+{
+ FIXME("(%p) stub\n",lpFiber);
+}
+
+#endif /* #ifdef HAVE_UCONTEXT_H */
+
More information about the wine-patches
mailing list