Skip to content

Commit

Permalink
added tc_malloc_skip_new_handler
Browse files Browse the repository at this point in the history
This is port of corresponding chromium change at:
https://codereview.chromium.org/55333002/

Basic idea is that sometimes apps that use tc_set_new_mode in order to
have C++ out-of-memory handler catch OOMs in malloc, need to invoke
usual malloc that returns 0 on OOM.

That new API is exactly for that. It'll always return NULL on OOM even
if tc_new_mode is set to true.
  • Loading branch information
Aliaksey Kandratsenka committed Apr 2, 2014
1 parent d773172 commit 0399af1
Show file tree
Hide file tree
Showing 6 changed files with 20 additions and 0 deletions.
6 changes: 6 additions & 0 deletions src/debugallocation.cc
Expand Up @@ -1486,3 +1486,9 @@ extern "C" PERFTOOLS_DLL_DECL struct mallinfo tc_mallinfo(void) __THROW {
extern "C" PERFTOOLS_DLL_DECL size_t tc_malloc_size(void* ptr) __THROW {
return MallocExtension::instance()->GetAllocatedSize(ptr);
}

extern "C" PERFTOOLS_DLL_DECL void* tc_malloc_skip_new_handler(size_t size) __THROW {
void* result = DebugAllocate(size, MallocBlock::kMallocType);
MallocHook::InvokeNewHook(result, size);
return result;
}
1 change: 1 addition & 0 deletions src/gperftools/tcmalloc.h.in
Expand Up @@ -89,6 +89,7 @@ extern "C" {
const char** patch) __THROW;

PERFTOOLS_DLL_DECL void* tc_malloc(size_t size) __THROW;
PERFTOOLS_DLL_DECL void* tc_malloc_skip_new_handler(size_t size) __THROW;
PERFTOOLS_DLL_DECL void tc_free(void* ptr) __THROW;
PERFTOOLS_DLL_DECL void* tc_realloc(void* ptr, size_t size) __THROW;
PERFTOOLS_DLL_DECL void* tc_calloc(size_t nmemb, size_t size) __THROW;
Expand Down
6 changes: 6 additions & 0 deletions src/tcmalloc.cc
Expand Up @@ -1735,4 +1735,10 @@ extern "C" PERFTOOLS_DLL_DECL size_t tc_malloc_size(void* ptr) __THROW {
return MallocExtension::instance()->GetAllocatedSize(ptr);
}

extern "C" PERFTOOLS_DLL_DECL void* tc_malloc_skip_new_handler(size_t size) __THROW {
void* result = do_malloc(size);
MallocHook::InvokeNewHook(result, size);
return result;
}

#endif // TCMALLOC_USING_DEBUGALLOCATION
5 changes: 5 additions & 0 deletions src/tests/tcmalloc_unittest.cc
Expand Up @@ -1132,6 +1132,11 @@ static int RunAllTests(int argc, char** argv) {
free(p1);
VerifyDeleteHookWasCalled();

p1 = tc_malloc_skip_new_handler(10);
CHECK(p1 != NULL);
VerifyNewHookWasCalled();
free(p1);
VerifyDeleteHookWasCalled();

p1 = calloc(10, 2);
CHECK(p1 != NULL);
Expand Down
1 change: 1 addition & 0 deletions src/windows/gperftools/tcmalloc.h
Expand Up @@ -79,6 +79,7 @@ extern "C" {
const char** patch) __THROW;

PERFTOOLS_DLL_DECL void* tc_malloc(size_t size) __THROW;
PERFTOOLS_DLL_DECL void* tc_malloc_skip_new_handler(size_t size) __THROW;
PERFTOOLS_DLL_DECL void tc_free(void* ptr) __THROW;
PERFTOOLS_DLL_DECL void* tc_realloc(void* ptr, size_t size) __THROW;
PERFTOOLS_DLL_DECL void* tc_calloc(size_t nmemb, size_t size) __THROW;
Expand Down
1 change: 1 addition & 0 deletions src/windows/gperftools/tcmalloc.h.in
Expand Up @@ -79,6 +79,7 @@ extern "C" {
const char** patch) __THROW;

PERFTOOLS_DLL_DECL void* tc_malloc(size_t size) __THROW;
PERFTOOLS_DLL_DECL void* tc_malloc_skip_new_handler(size_t size) __THROW;
PERFTOOLS_DLL_DECL void tc_free(void* ptr) __THROW;
PERFTOOLS_DLL_DECL void* tc_realloc(void* ptr, size_t size) __THROW;
PERFTOOLS_DLL_DECL void* tc_calloc(size_t nmemb, size_t size) __THROW;
Expand Down

0 comments on commit 0399af1

Please sign in to comment.