mirror of
https://github.com/reactos/reactos.git
synced 2024-09-11 13:23:51 +00:00
90 lines
1.4 KiB
C
90 lines
1.4 KiB
C
/* $Id: tls.c,v 1.3 2002/10/29 04:45:35 rex Exp $
|
|
*/
|
|
/*
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
* PROJECT: ReactOS POSIX+ Subsystem
|
|
* FILE: subsys/psx/lib/psxdll/misc/tls.c
|
|
* PURPOSE: Thread local storage
|
|
* PROGRAMMER: KJK::Hyperion <noog@libero.it>
|
|
* UPDATE HISTORY:
|
|
* 30/04/2002: Created
|
|
*/
|
|
|
|
#include <ddk/ntddk.h>
|
|
#include <ntdll/rtl.h>
|
|
#include <psx/tls.h>
|
|
#include <psx/errno.h>
|
|
|
|
__tls_index_t __tls_alloc()
|
|
{
|
|
ULONG nIndex;
|
|
|
|
RtlAcquirePebLock();
|
|
|
|
nIndex = RtlFindClearBitsAndSet(NtCurrentPeb()->TlsBitmap, 1, 0);
|
|
|
|
if (nIndex == (ULONG)-1)
|
|
errno = ENOMEM;
|
|
else
|
|
NtCurrentTeb()->TlsSlots[nIndex] = 0;
|
|
|
|
RtlReleasePebLock();
|
|
|
|
return(nIndex);
|
|
|
|
}
|
|
|
|
int __tls_free(__tls_index_t index)
|
|
{
|
|
if (index >= TLS_MINIMUM_AVAILABLE)
|
|
{
|
|
errno = ERANGE;
|
|
return (-1);
|
|
}
|
|
|
|
RtlAcquirePebLock();
|
|
|
|
if(RtlAreBitsSet(NtCurrentPeb()->TlsBitmap, index, 1))
|
|
{
|
|
NtSetInformationThread
|
|
(
|
|
NtCurrentThread(),
|
|
ThreadZeroTlsCell,
|
|
&index,
|
|
sizeof(DWORD)
|
|
);
|
|
|
|
RtlClearBits(NtCurrentPeb()->TlsBitmap, index, 1);
|
|
}
|
|
|
|
RtlReleasePebLock();
|
|
|
|
return (0);
|
|
}
|
|
|
|
void * __tls_get_val(__tls_index_t index)
|
|
{
|
|
if(index >= TLS_MINIMUM_AVAILABLE)
|
|
{
|
|
errno = ERANGE;
|
|
return (0);
|
|
}
|
|
|
|
return (NtCurrentTeb()->TlsSlots[index]);
|
|
}
|
|
|
|
int __tls_put_val(__tls_index_t index, void * data)
|
|
{
|
|
if(index >= TLS_MINIMUM_AVAILABLE)
|
|
{
|
|
errno = ERANGE;
|
|
return (-1);
|
|
}
|
|
|
|
NtCurrentTeb()->TlsSlots[index] = data;
|
|
return (0);
|
|
}
|
|
|
|
/* EOF */
|
|
|