3 #include <internal/tls.h>
4 #include <internal/rterror.h>
7 static unsigned long TlsIndex
= (unsigned long)-1;
10 static void InitThreadData(PTHREADDATA ThreadData
)
12 ThreadData
->terrno
= 0;
13 ThreadData
->tdoserrno
= 0;
15 ThreadData
->fpecode
= 0;
17 /* FIXME: init more thread local data */
22 int CreateThreadData(void)
24 PTHREADDATA ThreadData
;
26 TlsIndex
= TlsAlloc();
27 if (TlsIndex
== (unsigned long)-1)
30 ThreadData
= (PTHREADDATA
)calloc(1, sizeof(THREADDATA
));
31 if (ThreadData
== NULL
)
34 if(!TlsSetValue(TlsIndex
, (LPVOID
)ThreadData
))
37 InitThreadData(ThreadData
);
43 void DestroyThreadData(void)
45 if (TlsIndex
!= (unsigned long)-1)
48 TlsIndex
= (unsigned long)-1;
53 void FreeThreadData(PTHREADDATA ThreadData
)
55 if (TlsIndex
!= (unsigned long)-1)
57 if (ThreadData
== NULL
)
58 ThreadData
= TlsGetValue(TlsIndex
);
60 if (ThreadData
!= NULL
)
62 /* FIXME: free more thread local data */
67 TlsSetValue(TlsIndex
, NULL
);
72 PTHREADDATA
GetThreadData(void)
74 PTHREADDATA ThreadData
;
77 LastError
= GetLastError();
78 ThreadData
= TlsGetValue(TlsIndex
);
79 if (ThreadData
== NULL
)
81 ThreadData
= (PTHREADDATA
)calloc(1, sizeof(THREADDATA
));
82 if (ThreadData
!= NULL
)
84 TlsSetValue(TlsIndex
, (LPVOID
)ThreadData
);
86 InitThreadData(ThreadData
);
90 _amsg_exit(_RT_THREAD
); /* write message and die */
94 SetLastError(LastError
);