4 #include <msvcrt/stdlib.h>
5 #include <msvcrt/internal/tls.h>
6 #include <msvcrt/internal/rterror.h>
9 static unsigned long TlsIndex = (unsigned long)-1;
12 static void InitThreadData(PTHREADDATA ThreadData)
14 ThreadData->terrno = 0;
15 ThreadData->tdoserrno = 0;
17 ThreadData->fpecode = 0;
19 /* FIXME: init more thread local data */
24 int CreateThreadData(void)
26 PTHREADDATA ThreadData;
28 TlsIndex = TlsAlloc();
29 if (TlsIndex == (unsigned long)-1)
32 ThreadData = (PTHREADDATA)calloc(1, sizeof(THREADDATA));
33 if (ThreadData == NULL)
36 if(!TlsSetValue(TlsIndex, (LPVOID)ThreadData))
39 InitThreadData(ThreadData);
45 void DestroyThreadData(void)
47 if (TlsIndex != (unsigned long)-1)
50 TlsIndex = (unsigned long)-1;
55 void FreeThreadData(PTHREADDATA ThreadData)
57 if (TlsIndex != (unsigned long)-1)
59 if (ThreadData == NULL)
60 ThreadData = TlsGetValue(TlsIndex);
62 if (ThreadData != NULL)
64 /* FIXME: free more thread local data */
69 TlsSetValue(TlsIndex, NULL);
74 PTHREADDATA GetThreadData(void)
76 PTHREADDATA ThreadData;
79 LastError = GetLastError();
80 ThreadData = TlsGetValue(TlsIndex);
81 if (ThreadData == NULL)
83 ThreadData = (PTHREADDATA)calloc(1, sizeof(THREADDATA));
84 if (ThreadData != NULL)
86 TlsSetValue(TlsIndex, (LPVOID)ThreadData);
88 InitThreadData(ThreadData);
92 _amsg_exit(_RT_THREAD); /* write message and die */
96 SetLastError(LastError);