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
);