2010-07-06 17 views
0

我想在我的代碼中使用git的malloc和realloc包裝來處理OOM(內存不足)的情況。下面是它的代碼:如何在代碼中使用Git的malloc包裝?

void *xmalloc(size_t size) 
{ 
     void *ret = malloc(size); 
     if (!ret && !size) 
       ret = malloc(1); 
     if (!ret) { 
       release_pack_memory(size, -1); 
       ret = malloc(size); 
       if (!ret && !size) 
         ret = malloc(1); 
       if (!ret) 
         die("Out of memory, malloc failed"); 
     } 
#ifdef XMALLOC_POISON 
     memset(ret, 0xA5, size); 
#endif 
     return ret; 
} 

但release_pack_memory功能是sha1_file.c頭文件,這個功能在Git的代碼在其他頭文件中的函數的引用,我不想把這麼多精力用於隔離該函數來自Git的代碼庫。目前我正在尋找release_pack_memory函數的替代函數,或者可以向我推薦另一種替代函數。我會很感激任何幫助

回答

5

爲什麼你想使用Git的malloc包裝?你明白它在做什麼?如果是這樣,你爲什麼認爲你需要一個「替代」release_pack_memory?

所有這個包裝函數都是*,如果malloc失敗,它會嘗試釋放一些用於緩存的內存(這是release_pack_memory所做的),然後再次嘗試。如果你沒有任何內存緩存,那麼複製這個包裝就沒有意義了(如果你的內存緩存是,那麼你應該已經知道如何從它釋放內存而不必複製這個函數) 。


*它還包含如果size是0上不支持malloc(0)平臺的檢查,如果這是涉及您的利益,那麼release_pack_memory東西還是沒用。

+0

是的,我認爲我明白這個代碼。但是我錯過了它從自己的緩存中解放出來的觀點:)。我確實有內存緩存。 – systemsfault 2010-07-06 07:19:15

+0

@systemsfault:當然,邏輯基本上只是「如果malloc'失敗,從緩存中至少釋放大小字節並再次嘗試」。 – 2010-07-06 07:23:03

+1

不,大小爲0的檢查不適用於不支持malloc(0)的平臺。這對於那些希望在malloc(0)上返回一個非NULL指針的愚蠢的GNU行爲的調用者來說。大多數理智的人都同意最好使malloc(0)返回NULL。 – 2010-07-06 07:48:50