remove wine's broken _beginthread() and _endthread() and implement them properly
[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 DWORD TlsIndex = TLS_OUT_OF_INDEXES;
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 SetThreadData(PTHREADDATA ThreadData)
23 {
24 if(TlsIndex == TLS_OUT_OF_INDEXES ||
25 !TlsSetValue(TlsIndex, ThreadData))
26 return FALSE;
27
28 InitThreadData(ThreadData);
29
30 return TRUE;
31 }
32
33
34 int CreateThreadData(void)
35 {
36 TlsIndex = TlsAlloc();
37 return (TlsIndex != TLS_OUT_OF_INDEXES);
38 }
39
40
41 void DestroyThreadData(void)
42 {
43 if (TlsIndex != TLS_OUT_OF_INDEXES)
44 {
45 TlsFree(TlsIndex);
46 TlsIndex = TLS_OUT_OF_INDEXES;
47 }
48 }
49
50
51 void FreeThreadData(PTHREADDATA ThreadData)
52 {
53 if (TlsIndex != TLS_OUT_OF_INDEXES)
54 {
55 if (ThreadData == NULL)
56 ThreadData = TlsGetValue(TlsIndex);
57
58 if (ThreadData != NULL)
59 {
60 /* FIXME: free more thread local data */
61
62 free(ThreadData);
63 }
64
65 TlsSetValue(TlsIndex, NULL);
66 }
67 }
68
69
70 PTHREADDATA GetThreadData(void)
71 {
72 PTHREADDATA ThreadData;
73 DWORD LastError;
74
75 LastError = GetLastError();
76 ThreadData = TlsGetValue(TlsIndex);
77 if (ThreadData == NULL)
78 {
79 ThreadData = (PTHREADDATA)calloc(1, sizeof(THREADDATA));
80 if (ThreadData != NULL)
81 {
82 TlsSetValue(TlsIndex, (LPVOID)ThreadData);
83
84 InitThreadData(ThreadData);
85
86 ThreadData->hThread = GetCurrentThread();
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