/****************************************************************************** 版权所有 (C), 2018-2099, Radkil ****************************************************************************** 文 件 名 : rd_thread.h 版 本 号 : 初稿 作 者 : Radkil 生成日期 : 2026年3月5日星期四 最近修改 : 功能描述 : rd_thread.c 的头文件 修改历史 : 1.日 期 : 2026年3月5日星期四 作 者 : Radkil 修改内容 : 创建文件 ******************************************************************************/ /*----------------------------------------------* * 外部变量说明 * *----------------------------------------------*/ /*----------------------------------------------* * 外部函数原型说明 * *----------------------------------------------*/ /*----------------------------------------------* * 内部函数原型说明 * *----------------------------------------------*/ /*----------------------------------------------* * 全局变量 * *----------------------------------------------*/ /*----------------------------------------------* * 模块级变量 * *----------------------------------------------*/ /*----------------------------------------------* * 常量定义 * *----------------------------------------------*/ /*----------------------------------------------* * 宏定义 * *----------------------------------------------*/ #ifndef __RD_THREAD_H__ #define __RD_THREAD_H__ #ifdef __cplusplus #if __cplusplus extern "C"{ #endif #endif /* __cplusplus */ /*==============================================* * include header files * *----------------------------------------------*/ #include "common.h" #include /*==============================================* * constants or macros define * *----------------------------------------------*/ #ifdef BUILD_PLATFORM_LINUX typedef pthread_mutex_t rd_mutex_t; #define RD_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER #else typedef struct { uint8_t dummy;// 占位,无特殊意义 } rd_mutex_t; #define RD_MUTEX_INITIALIZER {0} #endif typedef enum { AUTO_MODE_ANDROID = 0, // mmap + file (Android 推荐) AUTO_MODE_POSIX = 1, // shm_open (Linux 标准) AUTO_MODE_SYSV = 2 // shmget (老式 Linux) } rd_shm_mode_t; #ifdef __ANDROID__ #define RD_SHM_DEFAULT_MODE AUTO_MODE_ANDROID #else #define RD_SHM_DEFAULT_MODE AUTO_MODE_POSIX #endif typedef struct { pthread_mutex_t mutex; pthread_cond_t cond; int count; } rd_sem_t; #if RD_SHM_DEFAULT_MODE == AUTO_MODE_POSIX || RD_SHM_DEFAULT_MODE == AUTO_MODE_ANDROID typedef rd_sem_t Rd_sem_t; #elif RD_SHM_DEFAULT_MODE == AUTO_MODE_SYSV #include typedef sem_t Rd_sem_t; #endif #define SYSV_SHM_ID 'R' // System V共享内存默认ID #define IF_NOT_KEY "/dev/null" //找不到key文件时使用的文件名 typedef struct { void *addr; // 映射后的内存地址 int size; // 内存大小 int fd; // Android/POSIX: 文件描述符 int shmid; // System V: 共享内存 ID char path[256]; // Android: 文件路径 (用于 unlink) char name[64]; // POSIX/System V: 名称或 Key 标识 rd_shm_mode_t mode; // 当前使用的模式 int is_creator; // 是否是创建者 } rd_shm_t; /*==============================================* * project-wide global variables * *----------------------------------------------*/ /*==============================================* * routines' or functions' implementations * *----------------------------------------------*/ int Rd_MutexInit(void *_pMutex); void Rd_MutexLock(void *_pMutex, const char *_pcFunc, int *_piCnt); void Rd_MutexUnlock(void *_pMutex, const char *_pcFunc, int *_piCnt); int Rd_MutexDestroy(void *_pMutex); int Rd_SemInit(void *_sem, int _iPshared, int _iValue); void Rd_SemPost(void *_sem, const char *_pcFunc, int *_piCnt); void Rd_SemWait(void *_sem, const char *_pcFunc, int *_piCnt); int Rd_SemDestroy(void *_sem); /** * @brief 创建或打开共享内存 * @param shm 指向句柄的指针 * @param name 共享内存标识 (POSIX/ShmOpen 用名字, SysV 用 key 字符串, Android 用文件名) * @param size 大小 * @param is_creator 1=创建并初始化, 0=仅附加 * @param mode 强制模式 (0=Auto, 1=POSIX, 2=SYSV). 建议传 0 自动检测. * @return 0 成功, -1 失败 */ int Rd_ShmOpen(rd_shm_t *_ptShm, const char *_psName, int _iSize, int _iIsCreator, rd_shm_mode_t _eMode); /** * @brief 分离共享内存 (unmap) */ int Rd_ShmClose(rd_shm_t *_ptShm); /** * @brief 销毁共享内存 (unlink 或 rmid) * @note 通常由最后一个进程调用,或者由创建者在退出时调用 */ int Rd_ShmUnlink(rd_shm_t *_ptShm); #ifdef __cplusplus #if __cplusplus } #endif #endif /* __cplusplus */ #endif /* __RD_THREAD_H__ */