Use ASSERT() instead of assert().
[reactos.git] / reactos / lib / kernel32 / thread / fiber.c
index efd5697..1ed67e4 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: fiber.c,v 1.6 2003/07/10 18:50:51 chorns Exp $
+/* $Id: fiber.c,v 1.13 2004/11/05 12:26:36 ekohl Exp $
  *
  * FILE: lib/kernel32/thread/fiber.c
  *
@@ -8,7 +8,7 @@
 #include <k32.h>
 
 #define NDEBUG
-#include <kernel32/kernel32.h>
+#include "../include/debug.h"
 
 struct _FIBER                                           /* Field offsets:  */
 {                                                       /* 32 bit   64 bit */
@@ -60,19 +60,11 @@ BOOL WINAPI ConvertFiberToThread(void)
  pTeb->IsFiber = FALSE;
 
  /* free the fiber */
- if(pTeb->Tib.Fib.FiberData != NULL)
-  RtlFreeHeap(pTeb->Peb->ProcessHeap, 0, pTeb->Tib.Fib.FiberData);
+ if(pTeb->Tib.FiberData != NULL)
+  RtlFreeHeap(pTeb->Peb->ProcessHeap, 0, pTeb->Tib.FiberData);
 
  /* success */
-}
-
-
-/*
- * @implemented
- */
-LPVOID WINAPI ConvertThreadToFiber(LPVOID lpParameter)
-{
- return ConvertThreadToFiberEx(lpParameter, 0);
+ return TRUE;
 }
 
 
@@ -85,7 +77,7 @@ LPVOID WINAPI ConvertThreadToFiberEx(LPVOID lpParameter, DWORD dwFlags)
  PFIBER pfCurFiber;
 
  /* the current thread is already a fiber */
- if(pTeb->IsFiber && pTeb->Tib.Fib.FiberData) return pTeb->Tib.Fib.FiberData;
+ if(pTeb->IsFiber && pTeb->Tib.FiberData) return pTeb->Tib.FiberData;
 
  /* allocate the fiber */
  pfCurFiber = (PFIBER)RtlAllocateHeap(pTeb->Peb->ProcessHeap, 0, sizeof(FIBER));
@@ -107,7 +99,7 @@ LPVOID WINAPI ConvertThreadToFiberEx(LPVOID lpParameter, DWORD dwFlags)
  pfCurFiber->DeallocationStack = pTeb->DeallocationStack;
 
  /* associate the fiber to the current thread */
- pTeb->Tib.Fib.FiberData = pfCurFiber;
+ pTeb->Tib.FiberData = pfCurFiber;
  pTeb->IsFiber = TRUE;
 
  /* success */
@@ -115,6 +107,15 @@ LPVOID WINAPI ConvertThreadToFiberEx(LPVOID lpParameter, DWORD dwFlags)
 }
 
 
+/*
+ * @implemented
+ */
+LPVOID WINAPI ConvertThreadToFiber(LPVOID lpParameter)
+{
+ return ConvertThreadToFiberEx(lpParameter, 0);
+}
+
+
 /*
  * @implemented
  */
@@ -145,10 +146,8 @@ LPVOID WINAPI CreateFiberEx
  NTSTATUS nErrCode;
  PSIZE_T pnStackReserve = NULL;
  PSIZE_T pnStackCommit = NULL;
USER_STACK usFiberStack;
INITIAL_TEB usFiberInitialTeb;
  CONTEXT ctxFiberContext;
- PCHAR pStackBase;
- PCHAR pStackLimit;
  PTEB pTeb = NtCurrentTeb();
 
  /* allocate the fiber */
@@ -169,7 +168,7 @@ LPVOID WINAPI CreateFiberEx
  nErrCode = RtlRosCreateStack
  (
   NtCurrentProcess(),
-  &usFiberStack,
+  &usFiberInitialTeb,
   0,
   pnStackReserve,
   pnStackCommit
@@ -179,12 +178,12 @@ LPVOID WINAPI CreateFiberEx
  if(!NT_SUCCESS(nErrCode)) goto l_CleanupFiber;
 
  /* initialize the context for the fiber */
- nErrCode = RtlRosInitializeContextEx
+ nErrCode = RtlRosInitializeContext
  (
   NtCurrentProcess(),
   &ctxFiberContext,
   FiberStartup,
-  &usFiberStack,
+  &usFiberInitialTeb,
   1,
   (ULONG_PTR *)&lpStartAddress
  );
@@ -195,23 +194,23 @@ LPVOID WINAPI CreateFiberEx
  /* copy the data into the fiber */
 
  /* fixed-size stack */
- if(usFiberStack.FixedStackBase && usFiberStack.FixedStackLimit)
+ if(usFiberInitialTeb.StackBase && usFiberInitialTeb.StackLimit)
  {
-  pfCurFiber->StackBase = usFiberStack.FixedStackBase;
-  pfCurFiber->StackLimit = usFiberStack.FixedStackLimit;
-  pfCurFiber->DeallocationStack = usFiberStack.FixedStackLimit;
+  pfCurFiber->StackBase = usFiberInitialTeb.StackBase;
+  pfCurFiber->StackLimit = usFiberInitialTeb.StackLimit;
+  pfCurFiber->DeallocationStack = usFiberInitialTeb.StackLimit;
  }
  /* expandable stack */
  else if
  (
-  usFiberStack.ExpandableStackBase &&
-  usFiberStack.ExpandableStackLimit &&
-  usFiberStack.ExpandableStackBottom
+  usFiberInitialTeb.StackCommit &&
+  usFiberInitialTeb.StackCommitMax &&
+  usFiberInitialTeb.StackReserved
  )
  {
-  pfCurFiber->StackBase = usFiberStack.ExpandableStackBase;
-  pfCurFiber->StackLimit = usFiberStack.ExpandableStackLimit;
-  pfCurFiber->DeallocationStack = usFiberStack.ExpandableStackBottom;
+  pfCurFiber->StackBase = usFiberInitialTeb.StackCommit;
+  pfCurFiber->StackLimit = usFiberInitialTeb.StackCommitMax;
+  pfCurFiber->DeallocationStack = usFiberInitialTeb.StackReserved;
  }
  /* bad initial stack */
  else goto l_CleanupStack;
@@ -240,14 +239,14 @@ LPVOID WINAPI CreateFiberEx
 
 l_CleanupStack:
  /* free the stack */
- RtlRosDeleteStack(NtCurrentProcess(), &usFiberStack);
+ RtlRosDeleteStack(NtCurrentProcess(), &usFiberInitialTeb);
 
 l_CleanupFiber:
  /* free the fiber */
  RtlFreeHeap(pTeb->Peb->ProcessHeap, 0, pfCurFiber);
 
  /* failure */
assert(!NT_SUCCESS(nErrCode));
ASSERT(!NT_SUCCESS(nErrCode));
  SetLastErrorByStatus(nErrCode);
  return NULL;
 }
@@ -266,7 +265,7 @@ void WINAPI DeleteFiber(LPVOID lpFiber)
  RtlFreeHeap(pTeb->Peb->ProcessHeap, 0, lpFiber);
 
  /* the fiber is deleting itself: let the system deallocate the stack */
- if(pTeb->Tib.Fib.FiberData == lpFiber) ExitThread(1);
+ if(pTeb->Tib.FiberData == lpFiber) ExitThread(1);
 
  /* deallocate the stack */
  NtFreeVirtualMemory
@@ -289,7 +288,7 @@ __declspec(noreturn) extern void WINAPI ThreadStartup
 __declspec(noreturn) void WINAPI FiberStartup(PVOID lpStartAddress)
 {
  /* FIXME? this should be pretty accurate */
- ThreadStartup(lpStartAddress, NtCurrentTeb()->Tib.Fib.FiberData);
+ ThreadStartup(lpStartAddress, GetFiberData());
 }
 
 /* EOF */