TLS calls (currently unused)

svn path=/trunk/; revision=2963
This commit is contained in:
KJK::Hyperion 2002-05-17 02:07:14 +00:00
parent 69ca37d697
commit 75a810da7d
2 changed files with 137 additions and 0 deletions

48
posix/include/psx/tls.h Normal file
View file

@ -0,0 +1,48 @@
/* $Id: tls.h,v 1.1 2002/05/17 02:07:14 hyperion Exp $
*/
/*
* psx/tls.h
*
* types and calls for TLS management
*
* This file is part of the ReactOS Operating System.
*
* Contributors:
* Created by KJK::Hyperion <noog@libero.it>
*
* THIS SOFTWARE IS NOT COPYRIGHTED
*
* This source code is offered for use in the public domain. You may
* use, modify or distribute it freely.
*
* This code is distributed in the hope that it will be useful but
* WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
* DISCLAMED. This includes but is not limited to warranties of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
*/
#ifndef __PSX_TLS_H_INCLUDED__
#define __PSX_TLS_H_INCLUDED__
/* INCLUDES */
/* OBJECTS */
/* TYPES */
typedef unsigned int __tls_index_t;
/* CONSTANTS */
/* PROTOTYPES */
__tls_index_t __tls_alloc();
int __tls_free(__tls_index_t index);
void * __tls_get_val(__tls_index_t index);
int __tls_put_val(__tls_index_t index, void * data);
/* MACROS */
#endif /* __PSX_TLS_H_INCLUDED__ */
/* EOF */

View file

@ -0,0 +1,89 @@
/* $Id: tls.c,v 1.1 2002/05/17 02:07:14 hyperion 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 */