| Index: third_party/WebKit/Source/wtf/StackUtil.cpp
|
| diff --git a/third_party/WebKit/Source/wtf/StackUtil.cpp b/third_party/WebKit/Source/wtf/StackUtil.cpp
|
| deleted file mode 100644
|
| index 0312ad8d8bd6a9f3fc45021445f5ce242d46e5d9..0000000000000000000000000000000000000000
|
| --- a/third_party/WebKit/Source/wtf/StackUtil.cpp
|
| +++ /dev/null
|
| @@ -1,197 +0,0 @@
|
| -// Copyright 2017 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "wtf/StackUtil.h"
|
| -
|
| -#include "wtf/Assertions.h"
|
| -#include "wtf/Threading.h"
|
| -#include "wtf/WTFThreadData.h"
|
| -
|
| -#if OS(WIN)
|
| -#include <stddef.h>
|
| -#include <windows.h>
|
| -#include <winnt.h>
|
| -#elif defined(__GLIBC__)
|
| -extern "C" void* __libc_stack_end; // NOLINT
|
| -#endif
|
| -
|
| -namespace WTF {
|
| -
|
| -size_t getUnderestimatedStackSize() {
|
| -// FIXME: ASAN bot uses a fake stack as a thread stack frame,
|
| -// and its size is different from the value which APIs tells us.
|
| -#if defined(ADDRESS_SANITIZER)
|
| - return 0;
|
| -#endif
|
| -
|
| -// FIXME: On Mac OSX and Linux, this method cannot estimate stack size
|
| -// correctly for the main thread.
|
| -
|
| -#if defined(__GLIBC__) || OS(ANDROID) || OS(FREEBSD)
|
| - // pthread_getattr_np() can fail if the thread is not invoked by
|
| - // pthread_create() (e.g., the main thread of webkit_unit_tests).
|
| - // If so, a conservative size estimate is returned.
|
| -
|
| - 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 a 512k stack size, (conservatively) assuming the following:
|
| - // - that size is much lower than the pthreads default (x86 pthreads has a 2M
|
| - // default.)
|
| - // - no one is running Blink with an RLIMIT_STACK override, let alone as
|
| - // low as 512k.
|
| - //
|
| - return 512 * 1024;
|
| -#elif OS(MACOSX)
|
| - // pthread_get_stacksize_np() returns too low a value for the main thread on
|
| - // OSX 10.9,
|
| - // http://mail.openjdk.java.net/pipermail/hotspot-dev/2013-October/011369.html
|
| - //
|
| - // Multiple workarounds possible, adopt the one made by
|
| - // https://github.com/robovm/robovm/issues/274
|
| - // (cf.
|
| - // https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html
|
| - // on why hardcoding sizes is reasonable.)
|
| - if (pthread_main_np()) {
|
| -#if defined(IOS)
|
| - pthread_attr_t attr;
|
| - pthread_attr_init(&attr);
|
| - size_t guardSize = 0;
|
| - pthread_attr_getguardsize(&attr, &guardSize);
|
| - // Stack size for the main thread is 1MB on iOS including the guard page
|
| - // size.
|
| - return (1 * 1024 * 1024 - guardSize);
|
| -#else
|
| - // Stack size for the main thread is 8MB on OSX excluding the guard page
|
| - // size.
|
| - return (8 * 1024 * 1024);
|
| -#endif
|
| - }
|
| - return pthread_get_stacksize_np(pthread_self());
|
| -#elif OS(WIN) && COMPILER(MSVC)
|
| - return WTFThreadData::threadStackSize();
|
| -#else
|
| -#error "Stack frame size estimation not supported on this platform."
|
| - return 0;
|
| -#endif
|
| -}
|
| -
|
| -void* getStackStart() {
|
| -#if defined(__GLIBC__) || OS(ANDROID) || OS(FREEBSD)
|
| - 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 reinterpret_cast<uint8_t*>(base) + size;
|
| - }
|
| -#if OS(FREEBSD)
|
| - pthread_attr_destroy(&attr);
|
| -#endif
|
| -#if defined(__GLIBC__)
|
| - // pthread_getattr_np can fail for the main thread. In this case
|
| - // just like NaCl we rely on the __libc_stack_end to give us
|
| - // the start of the stack.
|
| - // See https://code.google.com/p/nativeclient/issues/detail?id=3431.
|
| - return __libc_stack_end;
|
| -#else
|
| - NOTREACHED();
|
| - return nullptr;
|
| -#endif
|
| -#elif OS(MACOSX)
|
| - return pthread_get_stackaddr_np(pthread_self());
|
| -#elif OS(WIN) && COMPILER(MSVC)
|
| -// On Windows stack limits for the current thread are available in
|
| -// the thread information block (TIB). Its fields can be accessed through
|
| -// FS segment register on x86 and GS segment register on x86_64.
|
| -#ifdef _WIN64
|
| - return reinterpret_cast<void*>(__readgsqword(offsetof(NT_TIB64, StackBase)));
|
| -#else
|
| - return reinterpret_cast<void*>(__readfsdword(offsetof(NT_TIB, StackBase)));
|
| -#endif
|
| -#else
|
| -#error Unsupported getStackStart on this platform.
|
| -#endif
|
| -}
|
| -
|
| -namespace internal {
|
| -
|
| -uintptr_t s_mainThreadStackStart = 0;
|
| -uintptr_t s_mainThreadUnderestimatedStackSize = 0;
|
| -
|
| -void initializeMainThreadStackEstimate() {
|
| - // getStackStart is exclusive, not inclusive (i.e. it points past the last
|
| - // page of the stack in linear order). So, to ensure an inclusive comparison,
|
| - // subtract here and below.
|
| - s_mainThreadStackStart =
|
| - reinterpret_cast<uintptr_t>(getStackStart()) - sizeof(void*);
|
| -
|
| - size_t underestimatedStackSize = getUnderestimatedStackSize();
|
| - if (underestimatedStackSize > sizeof(void*)) {
|
| - underestimatedStackSize = underestimatedStackSize - sizeof(void*);
|
| - }
|
| - s_mainThreadUnderestimatedStackSize = underestimatedStackSize;
|
| -}
|
| -
|
| -#if OS(WIN) && COMPILER(MSVC)
|
| -size_t threadStackSize() {
|
| - // Notice that we cannot use the TIB's StackLimit for the stack end, as i
|
| - // tracks the end of the committed range. We're after the end of the reserved
|
| - // stack area (most of which will be uncommitted, most times.)
|
| - MEMORY_BASIC_INFORMATION stackInfo;
|
| - memset(&stackInfo, 0, sizeof(MEMORY_BASIC_INFORMATION));
|
| - size_t resultSize =
|
| - VirtualQuery(&stackInfo, &stackInfo, sizeof(MEMORY_BASIC_INFORMATION));
|
| - DCHECK_GE(resultSize, sizeof(MEMORY_BASIC_INFORMATION));
|
| - uint8_t* stackEnd = reinterpret_cast<uint8_t*>(stackInfo.AllocationBase);
|
| -
|
| - uint8_t* stackStart = reinterpret_cast<uint8_t*>(WTF::getStackStart());
|
| - RELEASE_ASSERT(stackStart && stackStart > stackEnd);
|
| - size_t s_threadStackSize = static_cast<size_t>(stackStart - stackEnd);
|
| - // When the third last page of the reserved stack is accessed as a
|
| - // guard page, the second last page will be committed (along with removing
|
| - // the guard bit on the third last) _and_ a stack overflow exception
|
| - // is raised.
|
| - //
|
| - // We have zero interest in running into stack overflow exceptions while
|
| - // marking objects, so simply consider the last three pages + one above
|
| - // as off-limits and adjust the reported stack size accordingly.
|
| - //
|
| - // http://blogs.msdn.com/b/satyem/archive/2012/08/13/thread-s-stack-memory-management.aspx
|
| - // explains the details.
|
| - RELEASE_ASSERT(s_threadStackSize > 4 * 0x1000);
|
| - s_threadStackSize -= 4 * 0x1000;
|
| - return s_threadStackSize;
|
| -}
|
| -#endif
|
| -
|
| -} // namespace internal
|
| -
|
| -} // namespace WTF
|
|
|