4 #include <msvcrt/internal/tls.h>
5 #include <msvcrt/internal/rterror.h>
8 static unsigned long TlsIndex = (unsigned long)-1;
11 static void InitThreadData(PTHREADDATA ThreadData)
13 ThreadData->terrno = 0;
14 ThreadData->tdoserrno = 0;
16 ThreadData->fpecode = 0;
18 /* FIXME: init more thread local data */
23 int CreateThreadData(void)
25 PTHREADDATA ThreadData;
27 TlsIndex = TlsAlloc();
28 if (TlsIndex == (unsigned long)-1)
31 ThreadData = (PTHREADDATA)calloc(1, sizeof(THREADDATA));
32 if (ThreadData == NULL)
35 if(!TlsSetValue(TlsIndex, (LPVOID)ThreadData))
38 InitThreadData(ThreadData);
44 void DestroyThreadData(void)
46 if (TlsIndex != (unsigned long)-1)
49 TlsIndex = (unsigned long)-1;
54 void FreeThreadData(PTHREADDATA ThreadData)
56 if (TlsIndex != (unsigned long)-1)
58 if (ThreadData == NULL)
59 ThreadData = TlsGetValue(TlsIndex);
61 if (ThreadData != NULL)
63 /* FIXME: free more thread local data */
68 TlsSetValue(TlsIndex, NULL);
73 PTHREADDATA GetThreadData(void)
75 PTHREADDATA ThreadData;
78 LastError = GetLastError();
79 ThreadData = TlsGetValue(TlsIndex);
80 if (ThreadData == NULL)
82 ThreadData = (PTHREADDATA)calloc(1, sizeof(THREADDATA));
83 if (ThreadData != NULL)
85 TlsSetValue(TlsIndex, (LPVOID)ThreadData);
87 InitThreadData(ThreadData);
91 _amsg_exit(_RT_THREAD); /* write message and die */
95 SetLastError(LastError);