//===- subzero/src/IceTLS.h - thread_local workaround -----------*- C++ -*-===//
//
//                        The Subzero Code Generator
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
///
/// \file
/// This file defines macros for working around the lack of support for
/// thread_local in MacOS 10.6.  It assumes std::thread is written in
/// terms of pthread.  Define ICE_THREAD_LOCAL_HACK to enable the
/// pthread workarounds.
///
//===----------------------------------------------------------------------===//

#ifndef SUBZERO_SRC_ICETLS_H
#define SUBZERO_SRC_ICETLS_H

#if defined(_MSC_VER)
#define ICE_ATTRIBUTE_TLS __declspec(thread)
#else // !_MSC_VER
#define ICE_ATTRIBUTE_TLS thread_local
#endif // !_MSC_VER

// Defines 4 macros for unifying thread_local and pthread:
//
// ICE_TLS_DECLARE_FIELD(Type, FieldName): Declare a static
// thread_local field inside the current class definition.  "Type"
// needs to be a pointer type, such as int* or class Foo*.
//
// ICE_TLS_DEFINE_FIELD(Type, ClassName, FieldName): Define a static
// thread_local field outside of its class definition.  The field will
// ultimately be initialized to nullptr.
//
// ICE_TLS_INIT_FIELD(FieldName): Ensure the thread_local field is
// properly initialized.  This is intended to be called from within a
// static method of the field's class after main() starts (to ensure
// that the pthread library is fully initialized) but before any uses
// of ICE_TLS_GET_FIELD or ICE_TLS_SET_FIELD.
//
// ICE_TLS_GET_FIELD(Type, FieldName): Read the value of the static
// thread_local field.  Must be done within the context of its class.
//
// ICE_TLS_SET_FIELD(FieldName, Value): Write a value into the static
// thread_local field.  Must be done within the context of its class.

// TODO(stichnot): Limit this define to only the platforms that
// absolutely require it.  And ideally, eventually remove this hack
// altogether.
#define ICE_THREAD_LOCAL_HACK
#ifdef ICE_THREAD_LOCAL_HACK

// For a static thread_local field F of a class C, instead of
// declaring and defining C::F, we create two static fields:
//   static pthread_key_t F__key;
//   static int F__initStatus;
//
// The F__initStatus field is used to hold the result of the
// pthread_key_create() call, where a zero value indicates success,
// and a nonzero value indicates failure or that ICE_TLS_INIT_FIELD()
// was never called.
// The F__key field is used as the argument to
// pthread_getspecific() and pthread_setspecific().

#include <pthread.h>

#define ICE_TLS_DECLARE_FIELD(Type, FieldName)                                 \
  typedef Type FieldName##__type;                                              \
  static pthread_key_t FieldName##__key;                                       \
  static int FieldName##__initStatus
#define ICE_TLS_DEFINE_FIELD(Type, ClassName, FieldName)                       \
  pthread_key_t ClassName::FieldName##__key;                                   \
  int ClassName::FieldName##__initStatus = 1
#define ICE_TLS_INIT_FIELD(FieldName)                                          \
  if (FieldName##__initStatus) {                                               \
    FieldName##__initStatus = pthread_key_create(&FieldName##__key, nullptr);  \
    if (FieldName##__initStatus)                                               \
      llvm::report_fatal_error("Failed to create pthread key");                \
  }
#define ICE_TLS_GET_FIELD(FieldName)                                           \
  (assert(FieldName##__initStatus == 0),                                       \
   static_cast<FieldName##__type>(pthread_getspecific(FieldName##__key)))
#define ICE_TLS_SET_FIELD(FieldName, Value)                                    \
  (assert(FieldName##__initStatus == 0),                                       \
   pthread_setspecific(FieldName##__key, (Value)))

#else // !ICE_THREAD_LOCAL_HACK

#define ICE_TLS_DECLARE_FIELD(Type, FieldName)                                 \
  static ICE_ATTRIBUTE_TLS Type FieldName
#define ICE_TLS_DEFINE_FIELD(Type, ClassName, FieldName)                       \
  ICE_ATTRIBUTE_TLS Type ClassName::FieldName = nullptr
#define ICE_TLS_INIT_FIELD(FieldName)
#define ICE_TLS_GET_FIELD(FieldName) (FieldName)
#define ICE_TLS_SET_FIELD(FieldName, Value) (FieldName = (Value))

#endif // !ICE_THREAD_LOCAL_HACK

#endif // SUBZERO_SRC_ICETLS_H
