NT4/private/ole32/olethunk/olethk32/tlsthk.cxx
2020-09-30 17:12:29 +02:00

172 lines
4.5 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1994.
//
// File: tlsthk.cxx
//
// Contents: Utility routines for logical thread data
//
// History: 5-18-94 JohannP (Johann Posch) Created
//
//----------------------------------------------------------------------------
#include "headers.cxx"
#pragma hdrstop
#define UNINITIALIZED_INDEX (0xffffffff)
DWORD dwTlsThkIndex = UNINITIALIZED_INDEX;
//+---------------------------------------------------------------------------
//
// Function: TlsThkGetData
//
// Synopsis: returns pointer to thread data
//
// Returns: pointer to threaddata
//
// History: 5-18-94 JohannP (Johann Posch) Created
//
//----------------------------------------------------------------------------
#if DBG == 1
PThreadData TlsThkGetData(void)
{
if (dwTlsThkIndex == UNINITIALIZED_INDEX)
{
thkDebugOut((DEB_WARN, "WARNING: TLS slot used when uninitialized\n"));
}
PThreadData pThreaddata = (PThreadData) TlsGetValue(dwTlsThkIndex);
return pThreaddata;
}
#endif
//+---------------------------------------------------------------------------
//
// Function: TlsThkAlloc
//
// Synopsis: allocates a slot for thread data
//
// Returns: BOOL
//
// History: 5-18-94 JohannP (Johann Posch) Created
//
//----------------------------------------------------------------------------
BOOL TlsThkAlloc(void)
{
thkDebugOut((DEB_THUNKMGR, "In TlsThkAlloc\n"));
// We must be uninitialized to call this routine
thkAssert(dwTlsThkIndex == UNINITIALIZED_INDEX);
dwTlsThkIndex = TlsAlloc();
if (dwTlsThkIndex == UNINITIALIZED_INDEX)
{
return FALSE;
}
thkDebugOut((DEB_THUNKMGR, "Out TlsThkAlloc\n"));
return TRUE;
}
//+---------------------------------------------------------------------------
//
// Function: TlsThkInitialize
//
// Synopsis: allocates thread data and initialize slot
//
// Returns: Appropriate status code
//
// History: 5-18-94 JohannP (Johann Posch) Created
//
//----------------------------------------------------------------------------
HRESULT TlsThkInitialize(void)
{
PThreadData pThreaddata;
thkDebugOut((DEB_THUNKMGR, "In TlsThkInitialize\n"));
thkAssert(dwTlsThkIndex != UNINITIALIZED_INDEX &&
"Tls slot not allocated.");
// We must be uninitialized to call this routine
thkAssert(TlsGetValue(dwTlsThkIndex) == 0);
pThreaddata = (PThreadData) LocalAlloc(LPTR, sizeof (ThreadData));
if(pThreaddata != NULL)
{
// Force construction since we allocated with LocalAlloc
pThreaddata->sa16.CStackAllocator::
CStackAllocator(&mmodel16Owned, 1024, 2);
pThreaddata->sa32.CStackAllocator::
CStackAllocator(&mmodel32, 8192, 8);
pThreaddata->pCThkMgr = 0;
pThreaddata->dwAppCompatFlags = 0;
TlsSetValue(dwTlsThkIndex, pThreaddata);
}
thkDebugOut((DEB_THUNKMGR, "Out TlsThkInitialize\n"));
return (pThreaddata != NULL) ? NOERROR : E_OUTOFMEMORY;
}
//+---------------------------------------------------------------------------
//
// Function: TlsThkUninitialize
//
// Synopsis: frees thread data and set it to NULL
//
// History: 5-18-94 JohannP (Johann Posch) Created
//
//----------------------------------------------------------------------------
void TlsThkUninitialize(void)
{
thkDebugOut((DEB_TLSTHK, "In TlsThkUninitialize\n"));
// Asserts if data is NULL
PThreadData pThreaddata = TlsThkGetData();
// BUGBUG - We should assert that the things in the ThreadData
// are freed up
if (pThreaddata != NULL)
{
// Stack allocators are cleaned up elsewhere
// because they require special treatment
if (pThreaddata->pDelayedRegs != NULL)
{
delete pThreaddata->pDelayedRegs;
}
LocalFree(pThreaddata);
}
TlsSetValue(dwTlsThkIndex, NULL);
thkDebugOut((DEB_TLSTHK, "Out TlsThkUninitialize\n"));
}
//+---------------------------------------------------------------------------
//
// Function: TlsThkFree
//
// Synopsis: frees slot
//
// History: 5-18-94 JohannP (Johann Posch) Created
//
//----------------------------------------------------------------------------
void TlsThkFree(void)
{
thkAssert(dwTlsThkIndex != UNINITIALIZED_INDEX);
TlsFree( dwTlsThkIndex );
// We must set this to an invalid value so any further uses of the
// TLS slot will return NULL
dwTlsThkIndex = UNINITIALIZED_INDEX;
}