IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C-libev学习笔记-事件库源码阅读5-API-ev_set_allocator(),ev_set_syserr_cb() -> 正文阅读

[C++知识库]C-libev学习笔记-事件库源码阅读5-API-ev_set_allocator(),ev_set_syserr_cb()

ev_set_allocator()

函数声明:

/* Sets the allocation function to use, works like realloc.
 * It is used to allocate and free memory.
 * If it returns zero when memory needs to be allocated, the library might abort
 * or take some potentially destructive action.
 * The default is your system realloc function.
 */
EV_API_DECL void ev_set_allocator (void *(*cb)(void *ptr, long size) EV_THROW) EV_THROW;

通过注释可以知道这是一个用来 分配和释放内存 的函数。
并且强调指出,与realloc类似,而不是malloc,至于realloc和malloc的区别移步笔者另一篇文章。
realloc最重要的地方就是它能根据已有的内存地址进行缩减或者扩充。

它的参数比较特别,是一个函数指针:
void *(*cb)(void *ptr, long size) EV_THROW

函数定义:

ecb_cold //冷门函数
void
ev_set_allocator (void *(*cb)(void *ptr, long size) EV_THROW) EV_THROW
{
  alloc = cb;//把cb这个函数指针,赋值给alloc
}

alloc:

static void *(*alloc)(void *ptr, long size) EV_THROW = ev_realloc_emul;//alloc指针指向ev_realloc_emul函数

ev_realloc_emul:

static void *
ev_realloc_emul (void *ptr, long size) EV_THROW
{
  /* some systems, notably openbsd and darwin, fail to properly
   * implement realloc (x, 0) (as required by both ansi c-89 and
   * the single unix specification, so work around them here.
   * recently, also (at least) fedora and debian started breaking it,
   * despite documenting it otherwise.
   */

  if (size)
    return realloc (ptr, size);//调用realloc函数,把ptr扩充成size大小,并且返回新指针

  free (ptr);//如果size == 0,相当于释放空间,调用free
  return 0;
}

那么这个函数到底是不是用来申请内存的呢?其实从函数原型就看出来了,这个函数并不是用来申请内存的,还是用来给函数指针赋值的。

其实这只是一个工具函数,用于修改realloc 函数,以适应不同的操作系统,它并不用来申请内存,后续我们将遇到负责申请内存的函数。
提前告诉你,那个函数是 ev_realloc()

    ev_set_allocator(realloc);//函数名就充当着函数指针的角色。

改变的并不是系统函数,而是libev里面负责内存申请的那个函数。

ev_set_syserr_cb()

函数声明:

/* set the callback function to call on a
 * retryable syscall error
 * (such as failed select, poll, epoll_wait)
 */
EV_API_DECL void ev_set_syserr_cb (void (*cb)(const char *msg) EV_THROW) EV_THROW;

通过注释可以理解它是用来设置系统错误的回调,关于系统错误的回调,程序在发生错误的时候,会发送一些值给操作系统,比如perror,exit,abort等,只不过我们平时不深入系统,不必理会这些值。

函数定义:

ecb_cold
void
ev_set_syserr_cb (void (*cb)(const char *msg) EV_THROW) EV_THROW
{
  syserr_cb = cb;
}

static void (*syserr_cb)(const char *msg) EV_THROW;

这个函数也是对系统的错误回调函数进行了封装。
封装的结果就是libev库将拥有自己的错误回调机制。
和上面申请内存封装函数一样,ev_set_syserr_cb()本身不负责错误回调,真正负责错误回调的函数是:ev_syserr()

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-19 07:48:45  更:2021-09-19 07:50:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:38:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码