預設情況下,libevent使用c庫的記憶體管理函式在堆上分配記憶體(其實也就是我們在c中經常使用的malloc、realloc和free)。當然如果對於記憶體的管理有極高的要求,例如在我們的應用程式中可能頻繁的申請和釋放libevent相關的物件,如果採用預設的記憶體管理,那麼可能就會產生大量的記憶體碎片造成效率下降,如果對於我們的網路應用程式來說這種效率的下降是不可接受的,那麼我們就需要自己提供記憶體管理函式了 ,比如記憶體池技術。
在libevent中使用自定義的記憶體管理函式,就是在使用libevent之前註冊對應的分配、釋放等介面。
libevent的記憶體管理api定義在標頭檔案mm-internal.h。如同標頭檔案表現的那樣,這些api是libevent內部使用,用於管理分配和釋放libevent相關物件。
#ifndef event__disable_mm_replacement
void *event_mm_malloc_(size_t sz);
void *event_mm_calloc_(size_t count, size_t size);
char *event_mm_strdup_(const char *str);
void *event_mm_realloc_(void *p, size_t sz);
void event_mm_free_(void *p);
#define mm_malloc(sz) event_mm_malloc_(sz)
#define mm_calloc(count, size) event_mm_calloc_((count), (size))
#define mm_strdup(s) event_mm_strdup_(s)
#define mm_realloc(p, sz) event_mm_realloc_((p), (sz))
#define mm_free(p) event_mm_free_(p)
#else
#define mm_malloc(sz) malloc(sz)
#define mm_calloc(n, sz) calloc((n), (sz))
#define mm_strdup(s) strdup(s)
#define mm_realloc(p, sz) realloc((p), (sz))
#define mm_free(p) free(p)
#endif
從上面的**可以知道,如果我們沒有使能自定義記憶體管理,預設的情況下,libevent使用的就是c函式庫的記憶體管理。
就以event_mm_malloc函式來說:
void *
event_mm_malloc_(size_t sz)
內部實現無非就是如果有註冊自定義的記憶體管理函式那麼使用自定義的記憶體管理函式,否則使用標準c函式庫的記憶體管理。
關於如何註冊自定義的記憶體管理函式是使用下面這個介面:
void
event_set_mem_functions(void *(*malloc_fn)(size_t sz),
void *(*realloc_fn)(void *ptr, size_t sz),
void (*free_fn)(void *ptr))
而mm_malloc_fn_、mm_realloc_fn_和mm_free_fn_其實就是全域性變數的函式指標:
static void *(*mm_malloc_fn_)(size_t sz) = null;
static void *(*mm_realloc_fn_)(void *p, size_t sz) = null;
static void (*mm_free_fn_)(void *p) = null;
libevent原始碼深度剖析
序幕 張亮上來當然要先誇獎啦,libevent 有幾個顯著的亮點 事件驅動 event driven 高效能 輕量級,專注於網路,不如ace那麼臃腫龐大 源 相當精煉 易讀 跨平台,支援windows linux bsd和mac os 支援多種i o多路復用技術,epoll poll dev pol...
libevent原始碼深度剖析
上來當然要先誇獎啦,libevent 有幾個顯著的亮點 事件驅動 event driven 高效能 輕量級,專注於網路,不如ace那麼臃腫龐大 源 相當精煉 易讀 跨平台,支援windows linux bsd和mac os 支援多種i o多路復用技術,epoll poll dev poll sel...
Libevent原始碼分析 開篇
出處 我所分析的libevent版本是2.0.21版本,是目前最新的穩定版本。看這系列博文中,需要讀者有linux程式設計的一些基礎。因為像posix 檔案描述符 多執行緒等等這些概念,我並不會去解釋,我預設讀者已經熟悉這些概念了。如果讀者讀過 unix環境高階程式設計 那就完全沒問題了。因為lib...