Chromium Code Reviews| Index: Source/platform/heap/StackFrameDepth.cpp |
| diff --git a/Source/platform/heap/StackFrameDepth.cpp b/Source/platform/heap/StackFrameDepth.cpp |
| index 2d7985a1d3bf9fd1d72f07cb50a8673e3ff6c5eb..95189d39aa0d44946d4b6e50979eb5f273fac817 100644 |
| --- a/Source/platform/heap/StackFrameDepth.cpp |
| +++ b/Source/platform/heap/StackFrameDepth.cpp |
| @@ -29,7 +29,17 @@ NEVER_INLINE static uintptr_t currentStackFrameBaseOnCallee(const char* dummy) |
| void StackFrameDepth::configureLimit() |
| { |
| - // Allocate a large object in stack and query stack frame pointer after it. |
| + static const int kStackRoomSize= 1024; |
|
kouhei (in TOK)
2015/02/12 03:46:05
space
|
| + |
| + size_t stackSize = getUnderestimatedStackSize(); |
| + if (stackSize) { |
| + size_t stackBase = reinterpret_cast<size_t>(getStackStart()); |
| + m_stackFrameLimit = stackBase - stackSize + kStackRoomSize; |
| + return; |
| + } |
| + |
| + // Fallback version |
| + // Allocate a 32KB object on stack and query stack frame base after it. |
| char dummy[kSafeStackFrameSize]; |
| m_stackFrameLimit = currentStackFrameBaseOnCallee(dummy); |
| @@ -40,10 +50,30 @@ void StackFrameDepth::configureLimit() |
| size_t StackFrameDepth::getUnderestimatedStackSize() |
| { |
| #if defined(__GLIBC__) || OS(ANDROID) || OS(FREEBSD) |
| - // We cannot get the stack size in these platforms because |
| - // pthread_getattr_np() can fail for the main thread. |
| - // This is OK because ThreadState::current() doesn't use the stack size |
| - // in these platforms. |
| + // pthread_getattr_np() can fail if the thread is not invoked by |
| + // pthread_create() (e.g., the main thread of webkit_unit_tests). |
| + // In this case, this method returns 0 and the caller must handle it. |
| + |
| + pthread_attr_t attr; |
| + int error; |
| +#if OS(FREEBSD) |
| + pthread_attr_init(&attr); |
| + error = pthread_attr_get_np(pthread_self(), &attr); |
| +#else |
| + error = pthread_getattr_np(pthread_self(), &attr); |
| +#endif |
| + if (!error) { |
| + void* base; |
| + size_t size; |
| + error = pthread_attr_getstack(&attr, &base, &size); |
| + RELEASE_ASSERT(!error); |
| + pthread_attr_destroy(&attr); |
| + return size; |
| + } |
| +#if OS(FREEBSD) |
| + pthread_attr_destroy(&attr); |
| +#endif |
| + |
| return 0; |
| #elif OS(MACOSX) |
| return pthread_get_stacksize_np(pthread_self()); |
| @@ -57,6 +87,7 @@ size_t StackFrameDepth::getUnderestimatedStackSize() |
| return __readfsdword(offsetof(NT_TIB, StackBase)) - __readfsdword(offsetof(NT_TIB, StackLimit)); |
| #endif |
| #else |
| +#error "Stack frame size estimation not supported on this platform." |
| return 0; |
| #endif |
| } |