//===----------- rtl.cpp - Target independent OpenMP target RTL -----------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// Initialization and tear down of the offload runtime.
//
//===----------------------------------------------------------------------===//

#include "OpenMP/OMPT/Callback.h"
#include "PluginManager.h"

#include "Shared/Debug.h"
#include "Shared/Profile.h"

#ifdef OMPT_SUPPORT
extern void llvm::omp::target::ompt::connectLibrary();
#endif
using namespace llvm::omp::target::debug;

static std::mutex PluginMtx;
static uint32_t RefCount = 0;
std::atomic<bool> RTLAlive{false};
std::atomic<int> RTLOngoingSyncs{0};

/// Check deleted and deprecated features, such as environment variables.
static void checkRuntimeEnvironment() {
  const char *ShmemEnvarName = "LIBOMPTARGET_SHARED_MEMORY_SIZE";
  if (std::getenv(ShmemEnvarName))
    MESSAGE("Warning: %s is no longer valid. Please use OpenMP clause "
            "'dyn_groupprivate' instead.\n",
            ShmemEnvarName);
}

void initRuntime() {
  std::scoped_lock<decltype(PluginMtx)> Lock(PluginMtx);
  Profiler::get();
  TIMESCOPE();

  checkRuntimeEnvironment();

  if (PM == nullptr)
    PM = new PluginManager();

  RefCount++;
  if (RefCount == 1) {
    ODBG(ODT_Init) << "Init offload library!";
#ifdef OMPT_SUPPORT
    // Initialize OMPT first
    llvm::omp::target::ompt::connectLibrary();
#endif

    PM->init();
    PM->registerDelayedLibraries();

    // RTL initialization is complete
    RTLAlive = true;
  }
}

void deinitRuntime() {
  std::scoped_lock<decltype(PluginMtx)> Lock(PluginMtx);
  assert(PM && "Runtime not initialized");

  if (RefCount == 1) {
    ODBG(ODT_Deinit) << "Deinit offload library!";
    // RTL deinitialization has started
    RTLAlive = false;
    while (RTLOngoingSyncs > 0) {
      ODBG(ODT_Sync) << "Waiting for ongoing syncs to finish, count:"
                     << RTLOngoingSyncs.load();
      std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
    PM->deinit();
    delete PM;
    PM = nullptr;
  }

  RefCount--;
}
