/*
* Copyright (C) 2024 Intel Corporation. All rights reserved.
* Authors:
* Gustavo A Espinoza <[email protected]>
* <[email protected]>
*
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "qat.hpp"
#include <qat/cpa.h>
#include <qat/icp_sal_user.h>
#include <qat/qae_mem.h>
#include <iostream>
#include <string>
#include <memory>
#include <mutex>
namespace qat
{
static bool g_qat_not_available = false;
static bool g_qat_initialized = false;
static std::mutex g_qat_initialization_mutex;
class QATContext
{
public:
explicit QATContext() {}
QATContext(const QATContext &) = delete;
QATContext &operator=(const QATContext &) = delete;
QATContext(QATContext &&) = delete;
QATContext &operator=(QATContext &&) = delete;
~QATContext()
{
std::lock_guard<std::mutex> lock(g_qat_initialization_mutex);
if (g_qat_not_available) return;
if (g_qat_initialized) {
icp_sal_userStop();
g_qat_initialized = false;
}
}
};
static std::unique_ptr<QATContext> qat_context;
int Initialize()
{
std::lock_guard<std::mutex> lock(g_qat_initialization_mutex);
uint32_t cpa_state;
if (g_qat_not_available) {
return CPA_STATUS_FAIL;
}
if (g_qat_initialized) {
return CPA_STATUS_SUCCESS;
}
cpa_state = icp_sal_userStartMultiProcess("SSL", CPA_FALSE);
g_qat_not_available = (cpa_state != CPA_STATUS_SUCCESS);
g_qat_initialized = (cpa_state == CPA_STATUS_SUCCESS);
qat_context = std::make_unique<QATContext>();
return cpa_state;
}
}