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