a84a7f04c58861c4dbdbca1a4cd8bb88d577f9fc
[reactos.git] / lib / kernel32 / thread / fls.c
1 /* $Id$
2  *
3  * COPYRIGHT:  See COPYING in the top level directory
4  * PROJECT:    ReactOS system libraries
5  * FILE:       lib/kernel32/thread/fls.c
6  * PURPOSE:    Fiber local storage functions
7  * PROGRAMMER: KJK::Hyperion <noog@libero.it>
8  *
9  * UPDATE HISTORY:
10  *             28/05/2003 - created. Stubs only
11  *
12  */
13
14 #include <k32.h>
15
16 #include <kernel32/kernel32.h>
17
18 /*
19  * @unimplemented
20  */
21 DWORD WINAPI FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback)
22 {
23  (void)lpCallback;
24
25  UNIMPLEMENTED;
26  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
27  return FLS_OUT_OF_INDEXES;
28 }
29
30
31 /*
32  * @unimplemented
33  */
34 BOOL WINAPI FlsFree(DWORD dwFlsIndex)
35 {
36  (void)dwFlsIndex;
37
38  UNIMPLEMENTED;
39  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
40  return FALSE;
41 }
42
43
44 /*
45  * @implemented
46  */
47 PVOID WINAPI FlsGetValue(DWORD dwFlsIndex)
48 {
49  PVOID * ppFlsSlots;
50  PVOID pRetVal;
51  
52  if(dwFlsIndex >= 128) goto l_InvalidParam;
53
54  ppFlsSlots = NtCurrentTeb()->FlsSlots;
55  
56  if(ppFlsSlots == NULL) goto l_InvalidParam;
57
58  SetLastError(0);
59  pRetVal = ppFlsSlots[dwFlsIndex + 2];
60  
61  return pRetVal;
62
63 l_InvalidParam:
64  SetLastError(ERROR_INVALID_PARAMETER);
65  return NULL;
66 }
67
68
69 /*
70  * @implemented
71  */
72 BOOL WINAPI FlsSetValue(DWORD dwFlsIndex, PVOID lpFlsData)
73 {
74  PVOID * ppFlsSlots;
75  TEB * pTeb = NtCurrentTeb();
76
77  if(dwFlsIndex >= 128) goto l_InvalidParam;
78
79  ppFlsSlots = pTeb->FlsSlots;
80
81  if(ppFlsSlots == NULL)
82  {
83   PEB * pPeb = pTeb->Peb;
84
85   ppFlsSlots = RtlAllocateHeap
86   (
87    pPeb->ProcessHeap,
88    HEAP_ZERO_MEMORY,
89    (128 + 2) * sizeof(PVOID)
90   );
91
92   if(ppFlsSlots == NULL) goto l_OutOfMemory;
93
94   pTeb->FlsSlots = ppFlsSlots;
95
96   RtlAcquirePebLock();
97
98   /* TODO: initialization */
99
100   RtlReleasePebLock();
101  }
102
103  ppFlsSlots[dwFlsIndex + 2] = lpFlsData;
104  
105  return TRUE;
106
107 l_OutOfMemory:
108  SetLastError(ERROR_NOT_ENOUGH_MEMORY);
109  goto l_Fail;
110  
111 l_InvalidParam:
112  SetLastError(ERROR_INVALID_PARAMETER);
113
114 l_Fail:
115  return FALSE;
116 }
117
118 /* EOF */