+++ /dev/null
-/* $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 */
-