Skip to content

Commit

Permalink
fix:添加c代码
Browse files Browse the repository at this point in the history
  • Loading branch information
binghe001 committed Feb 6, 2025
1 parent ff91044 commit d6e17bb
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 35 deletions.
53 changes: 38 additions & 15 deletions githook/c/queue.c
Original file line number Diff line number Diff line change
@@ -1,18 +1,27 @@
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>

typedef struct {
void** data;
size_t head;
size_t tail;
size_t size;
pthread_mutex_t lock;
void** data; // 存储元素的指针数组
size_t head; // 队列头部索引
size_t tail; // 队列尾部索引
size_t size; // 队列容量
pthread_mutex_t lock; // 互斥锁,用于线程同步
} lua_queue_t;

// 初始化队列
lua_queue_t* lua_queue_new(size_t initial_size) {
lua_queue_t* queue = (lua_queue_t*)malloc(sizeof(lua_queue_t));
if (!queue) {
return NULL;
}
queue->data = (void**)calloc(initial_size, sizeof(void*));
if (!queue->data) {
free(queue);
return NULL;
}
queue->head = 0;
queue->tail = 0;
queue->size = initial_size;
Expand All @@ -22,16 +31,23 @@ lua_queue_t* lua_queue_new(size_t initial_size) {

// 销毁队列
void lua_queue_destroy(lua_queue_t* queue) {
free(queue->data);
free(queue);
if (queue) {
free(queue->data);
pthread_mutex_destroy(&queue->lock);
free(queue);
}
}

// 入队操作
int lua_queue_enqueue(lua_queue_t* queue, void* value) {
if (!queue) {
return -1;
}
pthread_mutex_lock(&queue->lock);
// 检查队列是否已满
if ((queue->tail + 1) % queue->size == queue->head) {
pthread_mutex_unlock(&queue->lock);
return -1; // 队列已满
return -1; // 队列已满
}
queue->data[queue->tail] = value;
queue->tail = (queue->tail + 1) % queue->size;
Expand All @@ -41,34 +57,41 @@ int lua_queue_enqueue(lua_queue_t* queue, void* value) {

// 出队操作
void* lua_queue_dequeue(lua_queue_t* queue) {
if (!queue) {
return NULL;
}
pthread_mutex_lock(&queue->lock);
// 检查队列是否为空
if (queue->head == queue->tail) {
pthread_mutex_unlock(&queue->lock);
return NULL; // 队列为空
return NULL; // 队列为空
}
void* value = queue->data[queue->head];
queue->data[queue->head] = NULL;
queue->head = (queue->head + 1) % queue->size;
pthread_mutex_unlock(&queue->lock);
return value;
}

// 查看队首元素
void* lua_queue_peek(lua_queue_t* queue) {
pthread_mutex_lock(&queue->lock);
if (queue->head == queue->tail) {
pthread_mutex_unlock(&queue->lock);
return NULL;
if (!queue || queue->head == queue->tail) {
return NULL; // 队列为空
}
pthread_mutex_lock(&queue->lock);
void* value = queue->data[queue->head];
pthread_mutex_unlock(&queue->lock);
return value;
}

// 获取队列长度
size_t lua_queue_length(lua_queue_t* queue) {
if (!queue) {
return 0;
}
pthread_mutex_lock(&queue->lock);
size_t length = (queue->tail - queue->head) % queue->size;
size_t length = (queue->tail >= queue->head) ?
(queue->tail - queue->head) :
(queue->size - (queue->head - queue->tail));
pthread_mutex_unlock(&queue->lock);
return length;
}
47 changes: 27 additions & 20 deletions githook/c/queue.lua
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
local ffi = require("ffi")
local C = ffi.C
local C = ffi.load("./lua_queue") -- 加载编译后的C模块

-- 定义 C 结构体
-- 定义C结构体
ffi.cdef[[
typedef struct {
void** data;
Expand All @@ -19,40 +19,47 @@ ffi.cdef[[
size_t lua_queue_length(lua_queue_t* queue);
]]

-- 定义队列类
-- 创建Lua队列类
local Queue = {}
Queue.__index = Queue

function Queue.new(initial_size)
local self = setmetatable({}, Queue)
self.queue = C.lua_queue_new(initial_size)
return self
end

function Queue:__gc()
if self.queue ~= nil then
C.lua_queue_destroy(self.queue)
self.queue = nil
function Queue:new(initial_size)
local queue = C.lua_queue_new(initial_size)
if not queue then
error("Failed to create queue")
end
return setmetatable({ handle = queue }, Queue)
end

function Queue:enqueue(value)
local result = C.lua_queue_enqueue(self.queue, value)
return result == 0
local result = C.lua_queue_enqueue(self.handle, value)
if result ~= 0 then
error("Failed to enqueue element")
end
end

function Queue:dequeue()
local value = C.lua_queue_dequeue(self.queue)
return value ~= nil and value or nil
local value = C.lua_queue_dequeue(self.handle)
if not value then
error("Queue is empty")
end
return value
end

function Queue:peek()
local value = C.lua_queue_peek(self.queue)
return value ~= nil and value or nil
local value = C.lua_queue_peek(self.handle)
if not value then
error("Queue is empty")
end
return value
end

function Queue:length()
return C.lua_queue_length(self.queue)
return C.lua_queue_length(self.handle)
end

function Queue:destroy()
C.lua_queue_destroy(self.handle)
end

return Queue

0 comments on commit d6e17bb

Please sign in to comment.