From cfa089df23ff50fcd5ed3854c54991d30be5fc7e Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Fri, 29 Mar 2013 16:35:00 -0700 Subject: [PATCH] Extra logging in pthread_create. pthread_create returns EAGAIN when it can't allocate a pthread_internal_t, when it can't allocate a stack for the new thread, or when clone(2) fails because there are too many threads. It's useful to be able to know why your pthread_create just failed, so add some logging. Bug: 8470684 Change-Id: I1bb4497d4f7528eacce0db35c2014771cba64569 --- libc/bionic/pthread_create.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libc/bionic/pthread_create.cpp b/libc/bionic/pthread_create.cpp index 15f18aa2f..70a9bf533 100644 --- a/libc/bionic/pthread_create.cpp +++ b/libc/bionic/pthread_create.cpp @@ -153,6 +153,7 @@ int pthread_create(pthread_t* thread_out, pthread_attr_t const* attr, pthread_internal_t* thread = reinterpret_cast(calloc(sizeof(*thread), 1)); if (thread == NULL) { + __libc_format_log(ANDROID_LOG_WARN, "libc", "pthread_create failed: couldn't allocate thread"); return EAGAIN; } thread->allocated_on_heap = true; @@ -172,6 +173,7 @@ int pthread_create(pthread_t* thread_out, pthread_attr_t const* attr, thread->attr.stack_base = __create_thread_stack(stack_size, thread->attr.guard_size); if (thread->attr.stack_base == NULL) { free(thread); + __libc_format_log(ANDROID_LOG_WARN, "libc", "pthread_create failed: couldn't allocate %zd-byte stack", stack_size); return EAGAIN; } } else { @@ -203,6 +205,7 @@ int pthread_create(pthread_t* thread_out, pthread_attr_t const* attr, munmap(thread->attr.stack_base, stack_size); } free(thread); + __libc_format_log(ANDROID_LOG_WARN, "libc", "pthread_create failed: clone failed: %s", strerror(errno)); return clone_errno; }