Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

108 lines
1.9 KiB

/*++
Copyright (c) 2001, Microsoft Corporation
Module Name:
tls.h
Abstract:
This file defines the TLS.
Author:
Revision History:
Notes:
--*/
#ifndef _TLS_H_
#define _TLS_H_
class TLS
{
public:
static inline void Initialize()
{
dwTLSIndex = TlsAlloc();
}
static inline void Uninitialize()
{
TlsFree(dwTLSIndex);
}
static inline TLS* GetTLS()
{
//
// Should allocate TLS data if doesn't exist.
//
return InternalAllocateTLS();
}
static inline TLS* ReferenceTLS()
{
//
// Shouldn't allocate TLS data even TLS data doesn't exist.
//
return (TLS*)TlsGetValue(dwTLSIndex);
}
static inline BOOL DestroyTLS()
{
return InternalDestroyTLS();
}
inline int IncrementAIMMRefCnt()
{
return ++_fActivateCnt;
}
inline int DecrementAIMMRefCnt()
{
if (_fActivateCnt)
return --_fActivateCnt;
else
return -1;
}
private:
int _fActivateCnt;
private:
static inline TLS* InternalAllocateTLS()
{
TLS* ptls = (TLS*)TlsGetValue(dwTLSIndex);
if (ptls == NULL)
{
if ((ptls = (TLS*)cicMemAllocClear(sizeof(TLS))) == NULL)
return NULL;
if (! TlsSetValue(dwTLSIndex, ptls))
{
cicMemFree(ptls);
return NULL;
}
}
return ptls;
}
static BOOL InternalDestroyTLS()
{
TLS* ptls = (TLS*)TlsGetValue(dwTLSIndex);
if (ptls != NULL)
{
cicMemFree(ptls);
TlsSetValue(dwTLSIndex, NULL);
return TRUE;
}
return FALSE;
}
private:
static DWORD dwTLSIndex;
};
#endif // _TLS_H_