revert my last change
[reactos.git] / reactos / lib / crt / misc / tls.c
1 #include <precomp.h>
2 #include <stdlib.h>
3 #include <internal/tls.h>
4 #include <internal/rterror.h>
5
6
7 static unsigned long TlsIndex = (unsigned long)-1;
8
9
10 static void InitThreadData(PTHREADDATA ThreadData)
11 {
12 ThreadData->terrno = 0;
13 ThreadData->tdoserrno = 0;
14
15 ThreadData->fpecode = 0;
16
17 /* FIXME: init more thread local data */
18
19 }
20
21
22 int CreateThreadData(void)
23 {
24 PTHREADDATA ThreadData;
25
26 TlsIndex = TlsAlloc();
27 if (TlsIndex == (unsigned long)-1)
28 return FALSE;
29
30 ThreadData = (PTHREADDATA)calloc(1, sizeof(THREADDATA));
31 if (ThreadData == NULL)
32 return FALSE;
33
34 if(!TlsSetValue(TlsIndex, (LPVOID)ThreadData))
35 return FALSE;
36
37 InitThreadData(ThreadData);
38
39 return TRUE;
40 }
41
42
43 void DestroyThreadData(void)
44 {
45 if (TlsIndex != (unsigned long)-1)
46 {
47 TlsFree(TlsIndex);
48 TlsIndex = (unsigned long)-1;
49 }
50 }
51
52
53 void FreeThreadData(PTHREADDATA ThreadData)
54 {
55 if (TlsIndex != (unsigned long)-1)
56 {
57 if (ThreadData == NULL)
58 ThreadData = TlsGetValue(TlsIndex);
59
60 if (ThreadData != NULL)
61 {
62 /* FIXME: free more thread local data */
63
64 free(ThreadData);
65 }
66
67 TlsSetValue(TlsIndex, NULL);
68 }
69 }
70
71
72 PTHREADDATA GetThreadData(void)
73 {
74 PTHREADDATA ThreadData;
75 DWORD LastError;
76
77 LastError = GetLastError();
78 ThreadData = TlsGetValue(TlsIndex);
79 if (ThreadData == NULL)
80 {
81 ThreadData = (PTHREADDATA)calloc(1, sizeof(THREADDATA));
82 if (ThreadData != NULL)
83 {
84 TlsSetValue(TlsIndex, (LPVOID)ThreadData);
85
86 InitThreadData(ThreadData);
87 }
88 else
89 {
90 _amsg_exit(_RT_THREAD); /* write message and die */
91 }
92 }
93
94 SetLastError(LastError);
95
96 return ThreadData;
97 }
98
99 /* EOF */
100