15670430创建于 2020年12月28日历史提交
/*
 * Copyright (c) 2020 Huawei Technologies Co.,Ltd.
 *
 * openGauss 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.
 * ---------------------------------------------------------------------------------------
 * 
 * dataqueuedefs.h
 *        Data replication queue pointer r definitions
 * 
 * 
 * IDENTIFICATION
 *        src/include/replication/dataqueuedefs.h
 *
 * ---------------------------------------------------------------------------------------
 */
#ifndef DATAQUEUE_DEFS_H
#define DATAQUEUE_DEFS_H

/* Pointer to a location in the queue. */
typedef struct DataQueuePtr {
    uint32 queueid;  /* data queue id, 0 based */
    uint32 queueoff; /* byte offset of location in current queue */
} DataQueuePtr;

/*
 * Macros for comparing DataQueuePtrs
 *
 * Beware of passing expressions with side-effects to these macros,
 * since the arguments may be evaluated multiple times.
 */
#define DQByteLT(a, b) ((a).queueid < (b).queueid || ((a).queueid == (b).queueid && (a).queueoff < (b).queueoff))
#define DQByteLE(a, b) ((a).queueid < (b).queueid || ((a).queueid == (b).queueid && (a).queueoff <= (b).queueoff))
#define DQByteEQ(a, b) ((a).queueid == (b).queueid && (a).queueoff == (b).queueoff)

#define DataQueuePtrIsInvalid(r) ((r).queueoff == 0)

/*
 * Macro for advancing a queue pointer by the specified number of bytes.
 */
#define DQByteAdvance(queueptr, nbytes)                                                                              \
    do {                                                                                                             \
        if (queueptr.queueoff > (uint32)g_instance.attr.attr_storage.DataQueueBufSize * 1024 - nbytes) {             \
            queueptr.queueid += 1;                                                                                   \
            queueptr.queueoff =                                                                                      \
                (uint32)(queueptr.queueoff + nbytes - (uint32)g_instance.attr.attr_storage.DataQueueBufSize * 1024); \
        } else                                                                                                       \
            queueptr.queueoff += nbytes;                                                                             \
    } while (0)

#endif /* DATAQUEU_DEFS_H */