libevent

cmake链接libevent的问题 先说我的解决方案 使用 event 链接 # ... add_executable(demo <源文件>) # 注意是event target_link_libraies(demo event) #... 根据错误提示解决 我遇到的问题 根据一般习惯而言,使用cmake链接某个第三方库时,一般先使用find_package()由cmake帮忙找出相应的package。然后,在生成链接时,只需要使用target_link_libraries()即可。 然而上述的一般方案碰上 链接l 阅读详情

Libevent Memory Mange

#include <event2/event.h>                                                                 
#include <sys/types.h>                                                                    
#include <stdlib.h>                                                                       
                                                                                          
/* This union's purpose is to be as big as the largest of all the                         
 * types it contains. */
union alignment {                                                                         
    size_t sz;                                                                            
    void *ptr;                                                                            
    double dbl;                                                                           
};                                                                                 
/* We need to make sure that everything we return is on the right                         
   alignment to hold anything, including a double. */
#define ALIGNMENT sizeof(union alignment)                                                 
                                                                                          
/* We need to do this cast‐to‐char* trick on our pointers to adjust                       
   them; doing arithmetic on a void* is not standard. */
#define OUTPTR(ptr) (((char*)ptr)+ALIGNMENT)                                              
#define INPTR(ptr) (((char*)ptr)‐ALIGNMENT)                                               
                                                                                          
static size_t total_allocated = 0;                                                        
static void *replacement_malloc(size_t sz)                                                
{                                                                                 
    void *chunk = malloc(sz + ALIGNMENT);                                                 
    if (!chunk) return chunk;                                                             
    total_allocated += sz;                                                                
    *(size_t*)chunk = sz;                                                                 
    return OUTPTR(chunk);                                                                 
}                                                                                 
static void *replacement_realloc(void *ptr, size_t sz)                                    
{                                                                                 
    size_t old_size = 0;                                                                  
    if (ptr) {                                                                            
        ptr = INPTR(ptr);                                                                 
        old_size = *(size_t*)ptr;                                                         
    }                                                                                 
    ptr = realloc(ptr, sz + ALIGNMENT);

 if (!ptr)                                                                             
        return NULL;                                                                      
    *(size_t*)ptr = sz;                                                                   
    total_allocated = total_allocated ‐ old_size + sz;                                    
    return OUTPTR(ptr);                                                                   
}                                                                                 
static void replacement_free(void *ptr)                                                   
{                                                                                 
    ptr = INPTR(ptr);                                                                     
    total_allocated ‐= *(size_t*)ptr;                                                     
    free(ptr);                                                                            
}                                                                                 
void start_counting_bytes(void)                                                           
{                                                                                 
    event_set_mem_functions(replacement_malloc,                                           
                            replacement_realloc,                                          
                            replacement_free);                                            
}


先说明其实这个memory alignment其实是这样的

 
这里介绍两个宏
                                                                                       
/* We need to do this cast‐to‐char* trick on our pointers to adjust                       
   them; doing arithmetic on a void* is not standard. */
#define OUTPTR(ptr) (((char*)ptr)+ALIGNMENT)                                              
#define INPTR(ptr) (((char*)ptr)‐ALIGNMENT) 
第一个ptr是指向chunk的指针
第二个ptr是指向memory的指针

然后分析replace_malloc这个很简单
void *chunk = malloc(sz + ALIGNMENT);    //这里分配了sz+ALLGNMENT的内存memory和union alignment                                             
    if (!chunk) return chunk;                      //这里如果分配失败直接返回NULL                                       
    total_allocated += sz;                         //这里在total_allocated里面加上sz
                                       
    *(size_t*)chunk = sz;                              //然后给chunk的union alignment sz赋值                            
    return OUTPTR(chunk); //然后返回memory的指针


然后分析replace_realloc这个也很简单
size_t old_size = 0;                                                                  
    if (ptr) {                           //ptr本来就是就是一个memory    的指针                                             
        ptr = INPTR(ptr);             //    然后得到 chunk    的指针                                       
        old_size = *(size_t*)ptr;      //用old_size保存旧的memory的size
                                                   
    }                                                                                 
    ptr = realloc(ptr, sz + ALIGNMENT); //重新分配 用realloc
  if (!ptr)                                          //分配失败                                   
        return NULL;                             //这里其实可以返回 return ptr;                                         
    *(size_t*)ptr = sz;                             //然后把新分配的chunk 然后把sz赋给他                                      
    total_allocated = total_allocated ‐ old_size + sz;           //减去旧的size然后 加上新分配的memory                         
    return OUTPTR(ptr);  //返回memory的指针

replace_free这个也很简单
ptr = INPTR(ptr);                 //得到chunk的指针                                                    
    total_allocated ‐= *(size_t*)ptr;   //减去memory的大小                                                  
    free(ptr);     //释放ptr所占的内存


IN A WORD

这里在实际操作中使用的是memory的指针 ,但是这里自爱memory的头部加一个union alignment管理这个memory 然后无论在分配还是在释放的时候都用的是chunk
,而在实际使用的时候使用的是memory
这个memory management very easy 但是我在这里现在还没有发现 union alignment的优势我觉得这个还会占内存 ,这里没有得到大的用处,

看后续他的用处 估计union alignment也是作者的巧妙构思吧

libevent源码深度剖析 + libevent参考手册(中文版) libevent库,文字版,很清晰,附带libevent参考手册(中文版) libevent源码深度剖析,根据libevent开源代码框架进行剖析,很不错值得学习借鉴,还有libevent中C语言的功底值得学习揣摩! 立即下载

相关推荐

libevent配置程序-附已编译的libevent的lib和头文件

使用libevent编写的程序,配有博客教程,工程中的inc、lib为已编译的libevent,大家可以直接下载回去使用,免得再在官网下载

libevent中的缓冲区(二)

1. 缓冲区的chunk的分配 在分配chunk时,其实chunk头包含一些附加信息,如chunk块存放数据的空间大小(buffer_len),起始地址(buffer),当前数据尾到起始片的偏移(off)等。chunk的大小算上头部信息,至少是1024个字节。 “` static struct evbuffer_chain * evbuffer_chain_new(size_t size

多看多听多总结 2984

STM32与K210串口通信

这篇文章是为了填上一篇埋下的坑,k210和STM32通过串口通信,我是采用数据包的形式发送数据的,因为K210发送的数据有几种,采用数据包的形式发送比较安全。本文代码运行的平台是STM32F103C8T6和K210 Dock,只涉及到K210发送数据给STM32,stm32将接受到的数据显示到0.96寸OLED屏上。

qq_70715693的博客 3万+

libevent实现图片的上传和下载

【代码】libevent实现图片的上传和下载。

StarWang的博客 619

光耦CTR参数实战:如何避免误触发与功耗陷阱(附计算公式)

本文深入解析光耦CTR参数在电路设计中的关键作用,探讨如何平衡误触发风险与功耗表现。通过TLP521、PC817等常见型号的实测数据对比,提供不同工作状态下的选型策略和计算公式,帮助工程师优化设计,提升系统稳定性和能效。

2a4s6d8f0g的博客 323

使用pytorch-superpoint与pytorch-superglue项目实现训练自己的数据集

superpoint与superglue的组合可以实现基于深度学习的图像配准,官方发布的superpoint与superglue模型均基于coco数据训练,与业务中的实际数据或许存在差距,为此实现基于开源的pytorch-superpoint与pytorch-superglue项目实现训练自己的数据集。然而,在训练pytorch-superpoint有诸多细节需要优化,特此整理成技术文档。本文档描述了实验pytorch-superpoint与pytorch-superglue项目训练自己的图像配准模型。

a486259的博客 9504

libevent 上传文件

print_log("evhttp_connection_get_bufferevent() ok\n"); // Fire off the request req = evhttp_request_new(http_post_done, bev); if (req == NULL) { fprintf(stderr, "evhttp_request_new() failed\n"

dp__mcu的专栏 4110

硅电容的工艺结构原理及选型参数总结

硅电容,也称为硅质电容或硅二极管电容,是一种特殊的电容器。它利用硅二极管的结构来实现电容的功能。本文对硅电容的工作原理,结构特点,选型参数及设计注意事项进行总结。

fydar的博客 2332

使用libevent evhttp做服务器提供文件上传、下载、查询功能

文件上传 post接口/xpoc/ue-fse-uploadfd请求报文如下: 请求头header如下 body如下: //上传post接口/xpoc/ue-fse-uploadfd请求报文如下: 请求头header如下 在这里插入图片描述 //文件上传接口的回调处理函数 void HttpUpFile(struct evhttp_request *req, void *arg) { char * pBoundary = NULL; char strtemp[260];

weixin_45312249的博客 2770

【33】软考软件设计师——算法题(二):贪心法与回溯法深度精讲|第4题进阶满分攻略

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第33篇,承接第32篇分治法与动态规划,聚焦**下午第4题算法大题进阶核心**,详解贪心法与回溯法两大高频难点算法。全文超4000字深度拆解贪心法核心原理、贪心选择性质、局部最优推全局最优的底层逻辑,厘清贪心算法适用边界与经典误区;深挖回溯法深度优先遍历思想、递归回溯三步流程、可行性剪枝与最优性剪枝两大核心技巧;全覆盖活动选择、零钱兑换、01背包贪心禁区、八皇后、全排列等软考必考经典题型;配套标准化算法框架代码、考场填空模板、剪枝优化实操案例

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 439

人工智能智能体研究综述:从理论架构到前沿应用

AI Agent,即人工智能智能体,是指能够在特定环境中自主感知、推理、决策并执行行动以实现特定目标的智能系统[1]。自主性反应性主动性(Pro-activeness)和社会性fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;AI Agent核心特征自主性 Autonomy反应性 Reactivity主动性 Pro-activeness。

nmdbbzcl的博客 902

libevent上传和下载文件

该函数只能完成表单上传一个文件的功能。

jianfeng123123的博客 490

学Simulink--基础微电网场景实例:基于Simulink的微电网经济调度优化策略仿真

指标传统调度PSO经济调度(本文)目标值总运行成本(元/h)45.232.5(工况1)降低≥20%调度响应时间(s)25<30储能SOC范围(%)50~50(不变)28~56(动态优化)20~80弃风弃光率(%)0(强制满发)0(优化消纳)0原理:微电网经济调度通过PSO算法优化各单元出力,以总成本最小化为目标,平衡功率平衡与设备约束;建模:Simulink中用实现PSO控制器,结合PV/WT/DG/ESS模型,完成闭环优化;验证。

amy_mhd的博客 67

libevent: 在libevent中使用线程池

一 线程的初始化 1线程对象      在进行事件驱动时,每个线程需建立自己的事件根基。由于libevent未提供线程之间通信的方式,我们采用管道来进行线程的通信。同时为方便主线程分配线程,我们还需保留各个线程的id号。因此我们采用如下结构来保留每个线程的有关信息。 typedef struct {     pthread_t thread_id;        //线程ID

求索 5328

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

libevent 库使用(一)socket实例

在工作中,之前经常使用tcp通信,每次都要自己写tcp通信程序,管理,比较麻烦,使用socket、bind、listen、connect、send、recv等基础函数虽然能够从最底层管理维护socket通信,但是socket通信一般不会使用其太高深的功能的情况下,libevent库完全可以胜任这项工作。 下面,贴一段源码来简单介绍以下libevent的功能,代码是从公司项目代码中抽离出来的,可能不...

weixin_43608153的博客 4797

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Libevent

如果当前正在为多个活跃事件调用回调函数,那么当前正在被调用的回调函数会被执行,然后马上退出事。如果当前正在为多个活跃事件调用回调函数,那么不会立即退出,而是等待所有的活跃事件的回调函数都。因为写数据时把缓冲区的数据读出写到对应的文件描述符中,所以水位肯定时下降的。)编程相对简单,可以最大程度的避免复杂的多线程问题,并且避免了多线程。不阻塞,检查那个事件准备好,调用优先级最高的那个,然后退出。,则只有事件进来的时候才会调用一次事件的回调函数,比较常用。)普通函数实现的应用程序,应用程序主动调用。

qq_65175225的博客 1578

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

libevent学习之二:Windows下编译libevent

Linux下编译参考源码中的README文件即可,这里主要记录Windows下的编译。一.准备工作去官网下载最新的稳定发布版本libevent-2.0.22-stable官网地址:http://libevent.org/二.使用VS2012编译1.解压libevent到C:\Users\zhang\Desktop\libevent-2.0.22-stable2.打开“VS2012开发人员命令提示”.........

草上爬的博客 8691

libevent源码

Libevent 的源代码虽然都在一层文件夹下面,但是其代码分类还是相当清晰的,主要可分为头文件、内部使用的头文件、辅助功能函数、日志、libevent 框架、对系统 I/O 多路复用机制的封装、信号管理、定时事件管理、缓冲区管理、基本数据结构和基于 libevent的两个实用库等几个部分,有些部分可能就是一个源文件。 (1)头文件 主要就是 event.h:事件宏定义、接口函数声明,主要结构体 event 的声明; (2)内部头文件 xxx-internal.h:内部数据结构和

Mac Track 2093

libevent深入浅出

引子 图1 一种简单的服务架构 在介绍libevent之前,首先抛出一个问题,如果让你设计一个高性能的服务架构,要求服务端能够处理多个客户端连接并响应客户端的请求,如图1所示,你会如何设计? 一个比较直观的想法是在服务端,每来一个客户端连接,即开启一个线程去处理并响应,这种设计的优点是简单易懂,缺点也很明显,如果客户端连接比较多,需要开启多个线程去处理,而操作系统开启线程是需要一定代价的,服务端在多个线程间切换也是比较消耗资源的;另外,多个线程操作临界资源时会带来锁竞争问题,当连接数比较多时竞争会非常激烈

none123java321的博客 1369

libevent java_libevent

http://blog.youkuaiyun.com/wind19/article/details/42678875libevent的基本使用http://www.cnblogs.com/cnspace/archive/2011/07/19/2110891.htmlhttp://yifangyou.blog.51cto.com/900206/611414============================...

weixin_28077113的博客 276

libevent简介

libevent简介

上善若水 1223

【Libevent】Ubuntu安装libevent报错问题解决

00. 目录 文章目录00. 目录01. 问题描述02. 问题分析03. 问题解决04. 附录 01. 问题描述 编译libevent的时候报一下错误: make make all-recursive make[1]: Entering directory `/libevent-2.0.21-stable' Making all in . make[2]: Entering directory `/libevent-2.0.21-stable' /bin/bash ./libtool --tag=CC

C/C++软件工程师、嵌入式软件工程师、物联网研发工程师、C/C++讲师、物联网讲师、嵌入式讲师、鸿蒙讲师---欢迎大家一起交流(私信添加博主微信) 3182

【Libevent】Libevent数据行为

Libevent数据行为

qq_53893431的博客 934

[libevent]Libevent介绍与编译

编译libevent 1.在此下载,最新的libevent压缩包libevent-2.0.22-stable.tar.gz 。源文件有个问题,evutil.c源码修改这部分。不然使用会失败。 #ifdef WIN32 #include #include #pragma comment(lib,"ws2_32.lib") #define WIN32_LEAN_AND_MEAN #inclu

超越 3026
上一篇: Linux下rename批量改变同文件夹的文件后缀名
下一篇: libevent
gyafdxis
博客等级 码龄12年 6粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值