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