From b23828cd5c139a7742421f207f7f133171977d2e Mon Sep 17 00:00:00 2001 From: jianf <2198972886@qq.com> Date: Wed, 18 Feb 2026 14:46:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86bug?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=86=85=E5=AD=98=E6=B1=A0=EF=BC=8C?= =?UTF-8?q?=E4=B8=BA=E5=90=8E=E7=BB=AD=E5=86=85=E5=AD=98=E6=B1=A0=E5=8C=96?= =?UTF-8?q?=E5=88=86=E9=85=8D=E6=89=93=E5=9F=BA=E7=A1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- c/CMakeLists.txt | 3 +- c/config.h | 20 +++++- c/memctl/memctl.c | 144 ++++++++++++++++++++++++++++++++++++++ c/memctl/memctl.h | 36 ++++++++++ c/network/http/http_rel.c | 3 +- c/network/network.c | 4 +- c/network/protocal.h | 17 +++++ c/tools/log/log.h | 1 + 8 files changed, 224 insertions(+), 4 deletions(-) create mode 100644 c/memctl/memctl.c create mode 100644 c/memctl/memctl.h create mode 100644 c/network/protocal.h diff --git a/c/CMakeLists.txt b/c/CMakeLists.txt index 8a08696..35450d8 100644 --- a/c/CMakeLists.txt +++ b/c/CMakeLists.txt @@ -17,7 +17,8 @@ add_library(Interpre SHARED interpreter/interpreter.c tools/pkgmanager/pkginstal add_library(Log SHARED tools/log/log.c) add_library(Toml SHARED tools/toml/toml.c) add_library(Quit SHARED tools/quit/quit.c) +add_library(Memctl SHARED memctl/memctl.c) -target_link_libraries(Start_Onebot_back Network Swmem Interpre Log Toml Quit) +target_link_libraries(Start_Onebot_back Network Swmem Interpre Log Toml Quit Memctl) include_directories(${PROJECT_SOURCE_DIR}) \ No newline at end of file diff --git a/c/config.h b/c/config.h index 361c10c..a07f6ff 100644 --- a/c/config.h +++ b/c/config.h @@ -1,18 +1,36 @@ #ifndef SEVERCONFG #define SEVERCONFG +/*------日志管理---------*/ #define MAX_LOG 64 -#define MAX_LOG_LENGTH 4096 +#define MAX_LOG_LENGTH 4080 +#define INFO_LENGTH 8 +/*------日志管理---------*/ +/*-------终端管理-------*/ #define TEM_MAX_BUF 256 #define TEM_HISTORY_BUF 210 #define TEM_PROMPT "chatbot$$ " +/*----终端管理--------*/ +/*-------网路池管理-----*/ #define NET_MAX_POOL 1 #define NET_MAX_MESSAGE_BUF 1024 #define HTTP_BLOCK_SIZE 512 #define MAX_HTTP_LENGTH 20 +/*-------网路池管理-----*/ +/*------解释器管理-------*/ #define INTER_MAX_BUF 256 +/*------解释器管理-------*/ + +/*------内存池管理------*/ +#define MAX_MEM_SIZE 256 +#define COMINE_MEM_SIZE 192 +#define MEM_BLOCK_SIZE 4096 +#define POOL_EXPEND_ID 3 +#define POOL_EXPEND_SIZE 4 +#define CYCLE_NUM 7 +/*------内存池管理------*/ #endif \ No newline at end of file diff --git a/c/memctl/memctl.c b/c/memctl/memctl.c new file mode 100644 index 0000000..11462c4 --- /dev/null +++ b/c/memctl/memctl.c @@ -0,0 +1,144 @@ +#include "memctl.h" +#include +#include + +int extend_pool(mem_ctl* self,int size) +{ + if(self == NULL)//入参检查 + { + return -1; + } + int poolsize = atomic_load(&self->poolsize); + int target = poolsize +size;//计算目标大小 + if(target >MAX_MEM_SIZE) + target = MAX_MEM_SIZE;//计算限制 + + for(int i = poolsize;iblocks[i].location !=NULL)//若存在未释放内存 + free(self->blocks[i].location); + self->blocks[i].location = malloc(MEM_BLOCK_SIZE); + if(self->blocks[i].location == NULL) + return target-i;//堆内存不足 + atomic_store(&self->blocks[i].condition,FREE); + } + atomic_fetch_add(&self->poolsize,size); + int log = atomic_load(&self->logbuf)+size/2; + atomic_store(&self->logbuf,log);//重新划定日志区 + return 0; +} + +mem_block *GetBlock(mem_ctl* self,int type) +{ + int status = 0; + int sp=0,start = 0; + atomic_int *id; + //模式判断 + if(type == LOGMOD) + { + id = &self->Loglast_loc; + sp = self->poolsize; + start = self->logbuf; + } + else + { + id = &self->Commenlast_loc; + sp = self->logbuf; + } + int i = atomic_load(id); + for(status;statusblocks[i].condition,1) == FREE) + { + atomic_fetch_sub(&self->blocks[i].condition,1); + return &self->blocks[i]; + } + else{ + atomic_fetch_add(&self->blocks[i].condition,1);//回滚路径 + } + } + i = start; + atomic_fetch_add(&self->mem_e_indicator,1); + //检查是否需要扩池 + if(atomic_fetch_sub(&self->mem_e_indicator,POOL_EXPEND_ID)>POOL_EXPEND_ID) + { + extend_pool(self,POOL_EXPEND_SIZE); + } + else{ + atomic_fetch_add(&self->mem_e_indicator,POOL_EXPEND_ID); + } + } + return NULL; +} + +int FreeBlock(mem_ctl* self,mem_block *block) +{ + if(self == NULL) + return -1; + if(block == NULL) + return -1; + if(block < &self->blocks[COMINE_MEM_SIZE])//标准池部分归还 + { + atomic_fetch_add(&block->condition,2); + block = NULL; + return 0; + } + else//扩容池尝试回收 + { + atomic_fetch_add(&block->condition,1); + free(block->location); + block->location = NULL; + int poolsize = atomic_load(&self->poolsize); + if(&self->blocks[poolsize] == block) + { + for(int i = poolsize -1;i>COMINE_MEM_SIZE;i--) + { + if(atomic_load(&self->blocks[i].condition) == PROCESSING) + { + poolsize--; + } + else{ + break; + } + if(poolsize-COMINE_MEM_SIZE%2 == 0) + { + atomic_fetch_sub(&self->logbuf,1); + } + } + } + atomic_store(&self->poolsize,poolsize); + } +} + +int init_memctl(mem_ctl *self) +{ + if(self == NULL) + return -1; + self->poolsize = 0; + for(int i =0;iblocks[i].location = NULL; + atomic_init(&self->blocks[i].condition,PROCESSING);//初始化池 + } + extend_pool(self,COMINE_MEM_SIZE);//预分配内存 + self->Commenlast_loc = 0; + self->logbuf = COMINE_MEM_SIZE/2; + self->mem_e_indicator = 0; + self->FreeBlock = FreeBlock; + self->GetBlock = GetBlock; + return 0; +} + +int free_memctl(mem_ctl *self)//清除内存池 +{ + if(self == NULL) + return -1; + for(int i = 0;i++;iblocks[i].location!=NULL) + free(self->blocks[i].location); + } +} \ No newline at end of file diff --git a/c/memctl/memctl.h b/c/memctl/memctl.h new file mode 100644 index 0000000..453971c --- /dev/null +++ b/c/memctl/memctl.h @@ -0,0 +1,36 @@ +#ifndef MEMCTL +#define MEMCTL +#include "config.h" +#include + +#define FREE 1 +#define INUSE -1 +#define PROCESSING 0 + +#define LOGMOD 0 +#define COMMENMOD 1 + +typedef struct mem_block +{ + void *location;//块地址 + atomic_int condition;//块状态 +}mem_block; + +typedef struct mem_ctl +{ + mem_block blocks[MAX_MEM_SIZE]; + atomic_int logbuf; + atomic_int poolsize; + atomic_int Commenlast_loc;//分配起始 + atomic_int Loglast_loc; + atomic_int mem_e_indicator;//内存不足指示器 + //获取一个内存块 + mem_block* (*GetBlock)(struct mem_ctl*,int); + //释放一个内存块 + int (*FreeBlock)(struct memctl*,mem_block*); +}mem_ctl; + +int init_memctl(mem_ctl *self); +int free_memctl(mem_ctl *self); + +#endif \ No newline at end of file diff --git a/c/network/http/http_rel.c b/c/network/http/http_rel.c index 76f7159..87e50eb 100644 --- a/c/network/http/http_rel.c +++ b/c/network/http/http_rel.c @@ -5,11 +5,12 @@ #include #include #include +#include #include "errno.h" #include "tools/log/log.h" #include "http_rel.h" -#include + int write_in_bk(char input,httpbuf* blk){ if(blk->size%HTTP_BLOCK_SIZE == 0)//块满分配新块 diff --git a/c/network/network.c b/c/network/network.c index c722605..d98f39f 100644 --- a/c/network/network.c +++ b/c/network/network.c @@ -33,6 +33,8 @@ static void safe_strcpy(char *dst, size_t dst_size, const char *src) /* 主解析 */ int rbt_parse_json(const char *json_text, rbt_msg *out) { + if(json_text == NULL) + return -1; memset(out, 0, sizeof(*out)); // 统一清 0,gid 天然 '\0' cJSON *root = cJSON_Parse(json_text); @@ -108,7 +110,7 @@ int process_message(char *req, log_manager *logger,rbt_msg *swap) { make_swap(swap); logger->in_log(log, logger); } - + //通知前端已收到消息 const char *response = "HTTP/1.1 200 OK\r\n" "Content-Type: text/plain\r\n" diff --git a/c/network/protocal.h b/c/network/protocal.h new file mode 100644 index 0000000..b41508a --- /dev/null +++ b/c/network/protocal.h @@ -0,0 +1,17 @@ +#ifndef PROTOCAL +#define PROTOCAL + +typedef struct network_pakage +{ + char *data; + int buf_block; +}network_package; + +typedef struct net_protocal +{ + void *protocal; + int (*init)(void *self); + int (*rev_message)(void *self,network_package *data); +}net_protocal; + +#endif \ No newline at end of file diff --git a/c/tools/log/log.h b/c/tools/log/log.h index 10ecf77..80132a6 100644 --- a/c/tools/log/log.h +++ b/c/tools/log/log.h @@ -10,6 +10,7 @@ typedef struct logs { char log[MAX_LOG_LENGTH]; struct logs *next; + char info[INFO_LENGTH]; }logs; typedef struct log_manager