TLS calls (currently unused)
authorKJK::Hyperion <hackbunny@reactos.org>
Fri, 17 May 2002 02:07:14 +0000 (02:07 +0000)
committerKJK::Hyperion <hackbunny@reactos.org>
Fri, 17 May 2002 02:07:14 +0000 (02:07 +0000)
svn path=/trunk/; revision=2963

posix/include/psx/tls.h [new file with mode: 0644]
posix/lib/psxdll/misc/tls.c [new file with mode: 0644]

diff --git a/posix/include/psx/tls.h b/posix/include/psx/tls.h
new file mode 100644 (file)
index 0000000..ee1f2dc
--- /dev/null
@@ -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 */
+
diff --git a/posix/lib/psxdll/misc/tls.c b/posix/lib/psxdll/misc/tls.c
new file mode 100644 (file)
index 0000000..bc17481
--- /dev/null
@@ -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 */
+