Libevent原始碼分析 記憶體分配

2021-06-28 08:45:15 字數 2773 閱讀 3100

libevent的記憶體分配函式還是比較簡單的,並沒有定義記憶體池之類的東西。如同前一篇部落格

那樣,給予libevent庫的使用者充分的設定權(定製),即可以設定使用者(libevent庫的使用者)自己的記憶體分配函式。至於怎麼分配,主動權在於使用者。但在設定(定製)的時候要注意一些地方,下面會說到。

首先,如果要定製自己的記憶體分配函式,就得在一開始配置編譯libevent庫是,不能加入--disable-malloc-replacement選項。預設情況下,是沒有這個選項的。如果加入了這個選項,那麼將會在生成的event-config.h中,定義_event_disable_mm_replacement這個巨集。關於event-config.h檔案,可以參考博文。下面是libevent記憶體分配函式的宣告(在mm-internal.h檔案):

[cpp]view plain

copy

檔案#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

*s);  

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使用的,而非使用者(從這些介面宣告在mm-internal.h檔案中就可以看到這一點)。libevent的其他函式要申請記憶體就呼叫mm_malloc之類的巨集定義。如果一開始在配置的時候(event-config.h)就禁止使用者定製自己的記憶體分配函式,那麼就把這些巨集定義為c語言標準記憶體分配函式。

當然,即使沒有禁止,如果使用者沒有定製自己的記憶體分配函式,最終還是呼叫c語言的標準記憶體分配函式。這一點在event_mm_***x這些函式的實現上可以看到。

這些函式的實現是在event.c檔案中的。定製功能的實現原理和前一篇部落格中說到的定製實現原理是一樣的。如下:

[cpp]view plain

copy

#ifndef _event_disable_mm_replacement

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;  

void

event_set_mem_functions(void

*(*malloc_fn)(

size_t

sz),  

void

*(*realloc_fn)(

void

*ptr, 

size_t

sz),  

void

(*free_fn)(

void

*ptr))    

使用者就是通過呼叫event_set_mem_functions函式來定製自己的記憶體分配函式。雖然這個函式不做任何的檢查,但還是有一點要注意。這個三個指標,要麼全設為null(恢復預設狀態),要麼全部都非null。原因後面會說到。

這些記憶體分配函式的實現是相當簡單。看看event_mm_malloc_

[cpp]view plain

copy

void

*  event_mm_malloc_(size_t

sz)    

如果使用者定製了記憶體分配函式(_mm_malloc_fn不為null),那麼就直接呼叫使用者定製的記憶體分配函式。否則使用c語言標準庫提供的。其他幾個記憶體分配函式也是這樣實現的。這裡就不貼**了。

定製自己的記憶體分配函式需要注意的一些地方:

參考:

Libevent原始碼分析 記憶體分配

libevent的記憶體分配函式還是比較簡單的,並沒有定義記憶體池之類的東西。如同前一篇部落格 那樣,給予libevent庫的使用者充分的設定權 定製 即可以設定使用者 libevent庫的使用者 自己的記憶體分配函式。至於怎麼分配,主動權在於使用者。但在設定 定製 的時候要注意一些地方,下面會說到...

Libevent 2 1 8原始碼分析 記憶體管理

預設情況下,libevent使用c庫的記憶體管理函式在堆上分配記憶體 其實也就是我們在c中經常使用的malloc realloc和free 當然如果對於記憶體的管理有極高的要求,例如在我們的應用程式中可能頻繁的申請和釋放libevent相關的物件,如果採用預設的記憶體管理,那麼可能就會產生大量的記憶...

Libevent原始碼分析 開篇

出處 我所分析的libevent版本是2.0.21版本,是目前最新的穩定版本。看這系列博文中,需要讀者有linux程式設計的一些基礎。因為像posix 檔案描述符 多執行緒等等這些概念,我並不會去解釋,我預設讀者已經熟悉這些概念了。如果讀者讀過 unix環境高階程式設計 那就完全沒問題了。因為lib...