diff --git a/posix/include/psx/tls.h b/posix/include/psx/tls.h new file mode 100644 index 00000000000..ee1f2dc3e73 --- /dev/null +++ b/posix/include/psx/tls.h @@ -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 + * + * 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 */ + diff --git a/posix/lib/psxdll/misc/tls.c b/posix/lib/psxdll/misc/tls.c new file mode 100644 index 00000000000..bc174816089 --- /dev/null +++ b/posix/lib/psxdll/misc/tls.c @@ -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 + * UPDATE HISTORY: + * 30/04/2002: Created + */ + +#include +#include +#include +#include + +__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 */ +