tls.c
来自「一个类似windows」· C语言 代码 · 共 101 行
C
101 行
#include <precomp.h>
#include <stdlib.h>
#include <internal/tls.h>
#include <internal/rterror.h>
static unsigned long TlsIndex = (unsigned long)-1;
static void InitThreadData(PTHREADDATA ThreadData)
{
ThreadData->terrno = 0;
ThreadData->tdoserrno = 0;
ThreadData->fpecode = 0;
/* FIXME: init more thread local data */
}
int CreateThreadData(void)
{
PTHREADDATA ThreadData;
TlsIndex = TlsAlloc();
if (TlsIndex == (unsigned long)-1)
return FALSE;
ThreadData = (PTHREADDATA)calloc(1, sizeof(THREADDATA));
if (ThreadData == NULL)
return FALSE;
if(!TlsSetValue(TlsIndex, (LPVOID)ThreadData))
return FALSE;
InitThreadData(ThreadData);
return TRUE;
}
void DestroyThreadData(void)
{
if (TlsIndex != (unsigned long)-1)
{
TlsFree(TlsIndex);
TlsIndex = (unsigned long)-1;
}
}
void FreeThreadData(PTHREADDATA ThreadData)
{
if (TlsIndex != (unsigned long)-1)
{
if (ThreadData == NULL)
ThreadData = TlsGetValue(TlsIndex);
if (ThreadData != NULL)
{
/* FIXME: free more thread local data */
free(ThreadData);
}
TlsSetValue(TlsIndex, NULL);
}
}
PTHREADDATA GetThreadData(void)
{
PTHREADDATA ThreadData;
DWORD LastError;
LastError = GetLastError();
ThreadData = TlsGetValue(TlsIndex);
if (ThreadData == NULL)
{
ThreadData = (PTHREADDATA)calloc(1, sizeof(THREADDATA));
if (ThreadData != NULL)
{
TlsSetValue(TlsIndex, (LPVOID)ThreadData);
InitThreadData(ThreadData);
}
else
{
_amsg_exit(_RT_THREAD); /* write message and die */
}
}
SetLastError(LastError);
return ThreadData;
}
/* EOF */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?