You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
5.1 KiB
170 lines
5.1 KiB
/******************************************************************************
|
|
|
|
版权所有 (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 <pthread.h>
|
|
|
|
/*==============================================*
|
|
* 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 <semaphore.h>
|
|
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__ */
|
|
|