:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / 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 */
101