text: // Copyright 2009-2021 Intel Corporation
  // SPDX-License-Identifier: Apache-2.0
  
  #pragma once
  
  #include "../sys/platform.h"
  #include "../sys/alloc.h"
  #include "../sys/barrier.h"
  #include "../sys/thread.h"
  #include "../sys/mutex.h"
  #include "../sys/condition.h"
  #include "../sys/ref.h"
  
  #if defined(__WIN32__)
  // -- GODOT start --
  #if !defined(NOMINMAX)
  // -- GODOT end --
  #  define NOMINMAX
  // -- GODOT start --
  #endif
  // -- GODOT end --
  #endif
  
  // We need to define these to avoid implicit linkage against
  // tbb_debug.lib under Windows. When removing these lines debug build
  // under Windows fails.
  #define __TBB_NO_IMPLICIT_LINKAGE 1
  #define __TBBMALLOC_NO_IMPLICIT_LINKAGE 1
  #define TBB_SUPPRESS_DEPRECATED_MESSAGES 1
  #define TBB_PREVIEW_ISOLATED_TASK_GROUP 1
  #include "tbb/tbb.h"
  #include "tbb/parallel_sort.h"
  
  namespace embree
  {
    struct TaskScheduler
    {
      /*! initializes the task scheduler */
      static void create(size_t numThreads, bool set_affinity, bool start_threads);
  
      /*! destroys the task scheduler again */
      static void destroy();
  
      /* returns the ID of the current thread */
      static __forceinline size_t threadID()
      {
        return threadIndex();
      }
  
      /* returns the index (0..threadCount-1) of the current thread */
      static __forceinline size_t threadIndex()
      {
  #if TBB_INTERFACE_VERSION >= 9100
        return tbb::this_task_arena::current_thread_index();
  #elif TBB_INTERFACE_VERSION >= 9000
        return tbb::task_arena::current_thread_index();
  #else
        return 0;
  #endif
      }
  
      /* returns the total number of threads */
      static __forceinline size_t threadCount() {
  #if TBB_INTERFACE_VERSION >= 9100
        return tbb::this_task_arena::max_concurrency();
  #else
        return tbb::task_scheduler_init::default_num_threads();
  #endif
      }
  
    };
  
  };
  