2010-07-06 2 views
0

Я хочу использовать оболочки gall's malloc и realloc в моем коде для условий OOM (из памяти). Вот его код:Как я могу использовать оболочку malloc Git в моем коде?

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

Почему Вы хотите использовать обертку Malloc Git? Вы понимаете, что он делает? Если да, то почему, по-вашему, вам нужна «замена» для release_pack_memory?

Вся эта оболочка делает, если malloc не работает, он пытается освободить некоторую память, которую он использует для кешей (это то, что делает release_pack_memory), а затем повторяет попытку. Если у вас нет кэшей в памяти, тогда на самом деле нет копий этой оболочки (и если у вас do есть кэши в памяти, то вы уже должны знать, как освободить память от нее, не копируя эту функцию) ,


* Он также содержит проверку, если size 0 на платформах, которые не поддерживают malloc(0), если это является проблемой для вас, то release_pack_memory материал по-прежнему бесполезно.

+0

Да, я думал, что понял этот код. Но я пропустил тот факт, что он освобождался от своего собственного кеша :). И у меня есть тайники в памяти. – systemsfault

+0

@systemsfault: конечно, логика в основном просто «если« malloc »терпит неудачу, освободите байты размером« size »из кеша и повторите попытку». –

+1

Нет, проверка размера 0 не для платформ, которые не поддерживают malloc (0). Именно для вызывающих абонентов ожидают глупое поведение GNU по возврату указателя non-NULL на malloc (0). Большинство здравомыслящих людей согласны, что лучше всего malloc (0) вернуть NULL. –