Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(135)

Unified Diff: third_party/WebKit/Source/wtf/StackUtil.cpp

Issue 2767153004: Move files in wtf/ to platform/wtf/ (Part 12). (Closed)
Patch Set: Rebase. Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/WebKit/Source/wtf/SizeLimits.cpp ('k') | third_party/WebKit/Source/wtf/TerminatedArray.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « third_party/WebKit/Source/wtf/SizeLimits.cpp ('k') | third_party/WebKit/Source/wtf/TerminatedArray.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698