blob: 4c7b9a398b95bcf533a4092c0f612360a893a95a [file] [edit]
//===-------- RuntimeState.cpp ------------------------------------ C++ -*-===//
//
// 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
//
//===----------------------------------------------------------------------===//
//
// Contains managing the OpenACC runtime state.
//
//===----------------------------------------------------------------------===//
#include "RuntimeState.h"
#include "Debug.h"
#include <cassert>
#include <mutex>
namespace llvm::acc::target {
PluginManager *PM = nullptr;
} // namespace llvm::acc::target
using namespace llvm::acc::target;
static std::mutex &getInitMutex() {
static std::mutex Mutex;
return Mutex;
}
static int32_t InitRefCount = 0;
void initAccRuntime() {
std::scoped_lock<std::mutex> Lock(getInitMutex());
assert(InitRefCount >= 0 && "Ref count cannot be negative.");
if (InitRefCount++ == 0) {
ODBG(ADT_Init) << "Init OpenACC runtime";
assert(!PM && "PM is present");
PM = new PluginManager();
PM->init();
PM->initializeAllDevices();
}
}
void deinitAccRuntime() {
std::scoped_lock<std::mutex> Lock(getInitMutex());
assert(PM && "OpenACC runtime not initialized");
assert(InitRefCount > 0 && "Ref count cannot be negative.");
if (--InitRefCount == 0) {
ODBG(ADT_Init) << "Deinit OpenACC runtime";
PM->deinit();
delete PM;
PM = nullptr;
}
}