Files
d330viewer/include/dkam_asyncqueue.h
2026-01-14 18:07:26 +08:00

144 lines
4.5 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#pragma once
#include <stdio.h>
#include <stdbool.h>
#ifdef _WIN32
//Head files that WIN Visual Studio needs
#include <tchar.h>
#include <synchapi.h>
#else
//Head files that linux system needs
//TRUE FALSE BOOL that linux not support
#include <pthread.h>
#define TRUE 1
#define FALSE 0
#define BOOL _Bool
#endif
#ifdef _WIN32
#define DLLEXPORT_API extern __declspec(dllexport)
#define DLL_VOID void __stdcall
#define DLL_INT int __stdcall
#else
#define DLLEXPORT_API
#define DLL_VOID void
#define DLL_INT int
#endif
typedef struct _List List;
struct _List
{
void* data;
List *next;
List *prev;
};
typedef struct _Queue Queue;
struct _Queue
{
List *head;
List *tail;
unsigned int length;
};
typedef struct _AsyncQueue AsyncQueue;
#ifdef _WIN32
//mutex and cond are different in WIN and Linux.
struct _AsyncQueue
{
SRWLOCK mutex;
CONDITION_VARIABLE cond;
Queue queue;
unsigned int waiting_threads;
int ref_count;
};
#else
struct _AsyncQueue
{
pthread_mutex_t mutex;
pthread_cond_t cond;
Queue queue;
unsigned int waiting_threads;
int ref_count;
};
#endif
#ifdef __cplusplus
extern "C"
{
#endif
//add a new point to the List
//向队列中增加一个指针
DLLEXPORT_API List* list_append(List *list, void* data);
// Initialization of the queue
// 队列初始化函数
DLLEXPORT_API DLL_VOID queue_init(Queue *queue);
// Push a data point to the queue headand increase the leagth for 1.
// 将一个数据指针推送到队列头并将队列长度增加1。
DLLEXPORT_API DLL_VOID queue_push_head(Queue *queue, void *data);
// Pop a data From the tail of the queue and return the point, If there isn't a data, Then return NUll.
// 从队列尾推出一个数据并返回这个数据指针。如果没有数据则返回NULL。
DLLEXPORT_API void* queue_pop_tail(Queue *queue);
// Release all the queue, but not the data point.
// If the data point is generate by malloc, it should free first.
// 释放队列但不是队列中data指向的数据如果队列的data是开辟的空间应先释放。
DLLEXPORT_API DLL_VOID queue_clear(Queue *queue);
// Check If there is data or not in the queue.
// 查看队列是否有数据
DLLEXPORT_API List* queue_peek_tail_link(Queue *queue);
// Creat a AsyncQueue.
// If successed, it return a point to a AsyncQueue.
// Otherwise, it return a NULL point.
// 创建一个异步队列。如果成功返回队列的指针否则返回NULL。
DLLEXPORT_API AsyncQueue* async_queue_new();
// Push a point data to the AsyncQueue head. After this, the queue length will increase one.
// input AsyncQueue point; data point.
// 将数据指针推送到异步队形头然后队列长度增加1。 输入参数: 队列指针,数据指针。
DLLEXPORT_API DLL_VOID async_queue_push(AsyncQueue *queue, void *data);
// Pop a point of the data from AsyncQueue tail, After this, the queue length will decrease one and return a point.
// It will waiting point until there is one. It is a blocking function.
// 将一个数据从队列中弹出然后队列长度减少1返回数据的指针。 这个函数会一直等到有数据,这是一个阻塞函数。
DLLEXPORT_API void* async_queue_pop(AsyncQueue *queue);
// Try Pop a point of the data from AsyncQueue tail, If successed, the queue length will decrease one and return a point.
// If not successed, it return NULL. This function return immediately.
// 尝试将一数据从队列中弹出如果成功队列长度减少1返回数据指针。 如果无数据就返回NULL这个函数是立即返回。
DLLEXPORT_API void* async_queue_try_pop(AsyncQueue *queue);
// Pop a point of the data from AsyncQueue tail until the timeout.
// If during the timeout, there is data, the queue length will decrease one and return a point.
// If during the timeout, there is no data, it return NULL.
// the unit of timeout is us.
// 在等待的时间内尝试将一数据从队列中弹出如果成功队列长度减少1返回数据指针。 如果无数据就返回NULL。
// 这个函数的返回时间是小于等于等待时间的。
DLLEXPORT_API void* async_queue_timeout_pop(AsyncQueue *queue,
long long timeout);
// return the length of AsyncQueue
// 返回异步队列的长度
DLLEXPORT_API DLL_INT async_queue_length(AsyncQueue *queue);
// release the AsyncQueue
// 释放异步队列资源
DLLEXPORT_API DLL_VOID async_queue_destroy(AsyncQueue *queue);
#ifdef __cplusplus
}
#endif