(verbose_)?try_malloc() to use on buf_write()

There will be more use cases for try_malloc(): see #556.

 - Reimplemented xmalloc() using try_malloc().
 - verbose_try_malloc() is just like try_malloc() but shows an out-of-memory
	 error message before returning NULL.
 - Let the compiler generate size>>1 assembly for signed types. We're not using
	 old compilers here.
 - Add proper function attributes to the new functions in memory.h
This commit is contained in:
Felipe Oliveira Carvalho
2014-04-18 02:16:51 -03:00
committed by Thiago de Arruda
parent 1befc49414
commit 15d8f702a8
3 changed files with 78 additions and 31 deletions

View File

@@ -81,24 +81,40 @@ static void try_to_free_memory()
trying_to_free = false;
}
void *xmalloc(size_t size)
void *try_malloc(size_t size)
{
void *ret = malloc(size);
if (!ret && !size)
if (!ret && !size) {
ret = malloc(1);
}
if (!ret) {
try_to_free_memory();
ret = malloc(size);
if (!ret && !size)
if (!ret && !size) {
ret = malloc(1);
if (!ret) {
OUT_STR("Vim: Error: Out of memory.\n");
preserve_exit();
}
}
return ret;
}
void *verbose_try_malloc(size_t size)
{
void *ret = try_malloc(size);
if (!ret) {
do_outofmem_msg((long_u)size);
}
return ret;
}
void *xmalloc(size_t size)
{
void *ret = try_malloc(size);
if (!ret) {
OUT_STR("Vim: Error: Out of memory.\n");
preserve_exit();
}
return ret;
}