2003-07-10 Casper S. Hornstrup <chorns@users.sourceforge.net>
[reactos.git] / reactos / lib / kernel32 / thread / fls.c
1 /* $Id: fls.c,v 1.3 2003/07/10 18:50:51 chorns Exp $
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 */