3 #include <internal/tls.h>
4 #include <internal/rterror.h>
7 static DWORD TlsIndex
= TLS_OUT_OF_INDEXES
;
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 SetThreadData(PTHREADDATA ThreadData
)
24 if(TlsIndex
== TLS_OUT_OF_INDEXES
||
25 !TlsSetValue(TlsIndex
, ThreadData
))
28 InitThreadData(ThreadData
);
34 int CreateThreadData(void)
36 TlsIndex
= TlsAlloc();
37 return (TlsIndex
!= TLS_OUT_OF_INDEXES
);
41 void DestroyThreadData(void)
43 if (TlsIndex
!= TLS_OUT_OF_INDEXES
)
46 TlsIndex
= TLS_OUT_OF_INDEXES
;
51 void FreeThreadData(PTHREADDATA ThreadData
)
53 if (TlsIndex
!= TLS_OUT_OF_INDEXES
)
55 if (ThreadData
== NULL
)
56 ThreadData
= TlsGetValue(TlsIndex
);
58 if (ThreadData
!= NULL
)
60 /* FIXME: free more thread local data */
65 TlsSetValue(TlsIndex
, NULL
);
70 PTHREADDATA
GetThreadData(void)
72 PTHREADDATA ThreadData
;
75 LastError
= GetLastError();
76 ThreadData
= TlsGetValue(TlsIndex
);
77 if (ThreadData
== NULL
)
79 ThreadData
= (PTHREADDATA
)calloc(1, sizeof(THREADDATA
));
80 if (ThreadData
!= NULL
)
82 TlsSetValue(TlsIndex
, (LPVOID
)ThreadData
);
84 InitThreadData(ThreadData
);
86 ThreadData
->hThread
= GetCurrentThread();
90 _amsg_exit(_RT_THREAD
); /* write message and die */
94 SetLastError(LastError
);