/* -------------------------------------------------------------------------
 *  This file is part of the oGRAC project.
 * Copyright (c) 2024 Huawei Technologies Co.,Ltd.
 *
 * oGRAC is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *
 *          http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 * -------------------------------------------------------------------------
 *
 * dtc_drc_stat.c
 *
 *
 * IDENTIFICATION
 * src/cluster/dtc_drc_stat.c
 *
 * -------------------------------------------------------------------------
 */
#include "knl_cluster_module.h"
#include "dtc_drc.h"
#include "dtc_context.h"

char g_master_info_record_name[][OG_DYNVIEW_NORMAL_LEN] = {
    {"R_PO_TOTAL"},
    {"R_PO_CONVETED"},
    {"R_PO_FIRST"},
    {"R_PO_TRY"},
    {"R_PO_CVTING_TOTAL"},
    {"R_PO_CVTING_CURR"},
    {"R_PO_CVTQ_TOTAL"},
    {"R_PO_CVTQ_CURR"},
    {"R_PO_CONFLICT_TOTAL"},

};


static status_t drc_master_info_init(drc_res_ctx_t *ogx)
{
    uint32 stat_row_cnt = sizeof(g_master_info_record_name) / sizeof(g_master_info_record_name[0]);
    uint32 stat_info_size = sizeof(drc_master_info_row) * stat_row_cnt;
    ogx->stat.stat_info = (drc_master_info_row *)malloc(stat_info_size);
    if (ogx->stat.stat_info == NULL) {
        return OG_ERROR;
    }

    ogx->stat.master_info_row_cnt = stat_row_cnt;
    int i;
    drc_master_info_row *row = ogx->stat.stat_info;

    for (i = 0; i < stat_row_cnt; i++) {
        row->name = g_master_info_record_name[i];
        row->cnt = 0;
        row++;
    }
    return OG_SUCCESS;
}
status_t drc_stat_init(void)
{
    drc_res_ctx_t *ogx = DRC_RES_CTX;
    ogx->stat.lock = 0;
    ogx->stat.stat_info = NULL;
    (void)cm_atomic_set(&ogx->stat.clean_page_cnt, 0);
    (void)cm_atomic_set(&ogx->stat.clean_lock_cnt, 0);
    (void)cm_atomic_set(&ogx->stat.rcy_page_cnt, 0);
    (void)cm_atomic_set(&ogx->stat.clean_convert_cnt, 0);
    (void)cm_atomic_set(&ogx->stat.rcy_lock_cnt, 0);
    (void)cm_atomic_set(&ogx->stat.mig_buf_cnt, 0);
    (void)cm_atomic_set(&ogx->stat.mig_lock_cnt, 0);
    (void)cm_atomic_set(&ogx->stat.mig_buf_msg_sent_cnt, 0);
    (void)cm_atomic_set(&ogx->stat.mig_lock_msg_sent_cnt, 0);

    if (OG_SUCCESS != drc_master_info_init(ogx)) {
        drc_stat_res_destroy();
        return OG_ERROR;
    }

    return OG_SUCCESS;
}

void drc_stat_res_destroy(void)
{
    drc_res_ctx_t *ogx = DRC_RES_CTX;
    drc_stat_t *stat = &ogx->stat;

    if (stat->stat_info != NULL) {
        free(stat->stat_info);
        stat->stat_info = NULL;
        stat->master_info_row_cnt = 0;
    }

    stat->lock = 0;
    (void)cm_atomic_set(&stat->clean_page_cnt, 0);
    (void)cm_atomic_set(&stat->clean_lock_cnt, 0);
    (void)cm_atomic_set(&stat->clean_convert_cnt, 0);
    (void)cm_atomic_set(&stat->rcy_page_cnt, 0);
    (void)cm_atomic_set(&stat->rcy_lock_cnt, 0);
    (void)cm_atomic_set(&stat->mig_buf_cnt, 0);
    (void)cm_atomic_set(&stat->mig_lock_cnt, 0);
    (void)cm_atomic_set(&stat->mig_buf_msg_sent_cnt, 0);
    (void)cm_atomic_set(&stat->mig_lock_msg_sent_cnt, 0);
}