// 如果是Android平台，且尚未定义_ANDROID_ASHMEM_H，则定义它
#ifdef __ANDROID__
#ifndef _ANDROID_ASHMEM_H
#define _ANDROID_ASHMEM_H

// 包含所需的头文件
#include <fcntl.h>
#include <linux/ashmem.h>  // 包含ashmem相关的ioctl操作
#include <linux/shm.h>
#include <sys/ioctl.h>
#include <sys/mman.h>  // 包含内存映射函数

// 如果Android API级别大于或等于26（Android 8.0），则使用Bionic的shm*函数
#if __ANDROID_API__ >= 26
#define shmat bionic_shmat
#define shmctl bionic_shmctl
#define shmdt bionic_shmdt
#define shmget bionic_shmget
#endif
#include <sys/shm.h>  // 包含标准的共享内存函数
#undef shmat
#undef shmctl
#undef shmdt
#undef shmget  // 取消对Bionic函数的重定义
#include <stdio.h>

// 定义ashmem设备的路径
#define ASHMEM_DEVICE "/dev/ashmem"

// 定义shmctl函数的封装，用于删除共享内存
static inline int shmctl(int __shmid, int __cmd, struct shmid_ds* __buf) {
    int ret = 0;
    if (__cmd == IPC_RMID) {
        int length = ioctl(__shmid, ASHMEM_GET_SIZE, NULL);
        struct ashmem_pin pin = { 0, length };
        ret = ioctl(__shmid, ASHMEM_UNPIN, &pin);
        close(__shmid);
    }
    return ret;
}

// 定义shmget函数的封装，用于创建共享内存
static inline int shmget(key_t __key, size_t __size, int __shmflg) {
    (void)__shmflg;
    int fd, ret;
    char ourkey[11];

    fd = open(ASHMEM_DEVICE, O_RDWR);
    if (fd < 0)
        return fd;

    sprintf(ourkey, "%d", __key);
    ret = ioctl(fd, ASHMEM_SET_NAME, ourkey);
    if (ret < 0)
        goto error;

    ret = ioctl(fd, ASHMEM_SET_SIZE, __size);
    if (ret < 0)
        goto error;

    return fd;

error:
    close(fd);
    return ret;
}

// 定义shmat函数的封装，用于将共享内存附加到进程地址空间
static inline void* shmat(int __shmid, const void* __shmaddr, int __shmflg) {
    (void)__shmflg;
    int size;
    void* ptr;

    size = ioctl(__shmid, ASHMEM_GET_SIZE, NULL);
    if (size < 0) {
        return NULL;
    }

    ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, __shmid, 0);
    if (ptr == MAP_FAILED) {
        return NULL;
    }

    return ptr;
}

#endif /* !_ANDROID_ASHMEM_H */
#endif /* !__ANDROID__ */