From 342b273234405ab76dc159d2e402bfb1ddfa1d8f Mon Sep 17 00:00:00 2001 From: Pixel Date: Mon, 3 Oct 2011 14:48:05 -0700 Subject: First commit - very basic features. --- includes/Local.h | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 includes/Local.h (limited to 'includes/Local.h') diff --git a/includes/Local.h b/includes/Local.h new file mode 100644 index 0000000..f3b7250 --- /dev/null +++ b/includes/Local.h @@ -0,0 +1,37 @@ +#pragma once + +#include + +namespace Balau { + +class TLSManager { + public: + virtual void * getTLS(); + virtual void * setTLS(void * val); +}; + +extern TLSManager * tlsManager; + +class Local : public AtStart { + public: + static int getSize() { return s_size; } + protected: + Local() : AtStart(0) { } + void * getGlobal() { return m_globals[m_idx]; } + void * getLocal() { return reinterpret_cast(getTLS())[m_idx]; } + void * get() { if (getTLS()) { void * l = getLocal(); return l ? l : getGlobal(); } else return getGlobal(); } + void setGlobal(void * obj) { m_globals[m_idx] = obj; } + void setLocal(void * obj) { void * r = getTLS(); reinterpret_cast(r)[m_idx] = obj; } + void set(void * obj) { void * r = getTLS(); if (r) setGlobal(obj); else setLocal(obj); } + int getIndex() { return m_idx; } + private: + static void * create() { void * r = malloc(s_size * sizeof(void *)); setTLS(r); return r; } + static void * getTLS() { return tlsManager->getTLS(); } + static void * setTLS(void * val) { return tlsManager->setTLS(val); } + virtual void doStart(); + int m_idx; + static int s_size; + static void ** m_globals; +}; + +}; -- cgit v1.2.3