/* -------------------------------------------------------------------------
 *  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.
 * -------------------------------------------------------------------------
 *
 * cm_disklock.h
 *
 *
 * IDENTIFICATION
 * src/common/cm_disklock.h
 *
 * -------------------------------------------------------------------------
 */

#ifndef _CM_DISKLOCK_
#define _CM_DISKLOCK_

#include "cm_defs.h"
#include "cm_disk.h"
#include "cm_thread.h"
#include "cm_latch.h"

#define CM_LOCK_TRY_INTERVAL 200
#define CM_LOCK_DBS_TRY_INTERVAL 1000 // ms
#define CM_DETECT_DBS_CONNECT_TIMOUT 2000 // ms

typedef enum en_cm_disklock_mode {
    DISK_LOCK_MUTEX = 0,
    DISK_LOCK_LATCHX = 1,
    DISK_LOCK_LATCHS = 2,
} cm_disklock_mode_e;

typedef struct u_cm_file_lock_t {
    short l_type;
    short l_whence;
    off_t l_start;
    off_t l_len;
    pid_t l_pid;
    uint64 magic;
    time_t lock_time;
} cm_flock_t;

typedef struct _st_cm_disk_lock_t {
    int fd;
    cm_flock_t flock;
    thread_lock_t tlock;
    latch_t lh_lock;
    uint32 id;
    uint32 inst_id;
    char dev_name[OG_FILE_NAME_BUFFER_SIZE];
} cm_disk_lock_t;

status_t cm_disk_lock_init(cm_disk_lock_t *lock, uint32 inst_id, uint32 uid);
void cm_destory_lock(cm_disk_lock_t *lock);
status_t cm_disk_save_lockinfo(cm_disk_lock_t *lock);
status_t cm_disk_mutex_try_lock(cm_disk_lock_t *lock);
status_t cm_disk_latchs_try_lock(cm_disk_lock_t *lock);
status_t cm_disk_file_lock(cm_disk_lock_t *lock, uint8 lock_type);
status_t cm_disk_timed_file_lock(cm_disk_lock_t *lock, uint32 timeout_ms, uint8 lock_type);
status_t cm_disk_mutex_lock(cm_disk_lock_t *lock, uint32 timeout_ms);
status_t cm_disk_latchx_lock(cm_disk_lock_t *lock, uint32 timeout_ms);
status_t cm_disk_latchs_lock(cm_disk_lock_t *lock, uint32 timeout_ms);
status_t cm_record_disk_unlock(cm_disk_lock_t *lock);
status_t cm_disk_mutex_unlock(cm_disk_lock_t *lock);
status_t cm_disk_latch_unlock(cm_disk_lock_t *lock);

#endif