X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/14957cd040308e3eeec43d26bae5d76da13fcd85..refs/heads/master:/heap/MachineStackMarker.h diff --git a/heap/MachineStackMarker.h b/heap/MachineStackMarker.h index c814ac5..9b6b732 100644 --- a/heap/MachineStackMarker.h +++ b/heap/MachineStackMarker.h @@ -22,52 +22,71 @@ #ifndef MachineThreads_h #define MachineThreads_h +#include #include +#include #include -#if ENABLE(JSC_MULTIPLE_THREADS) -#include -#endif - namespace JSC { - class Heap; + class CodeBlockSet; class ConservativeRoots; + class Heap; + class JITStubRoutineSet; class MachineThreads { WTF_MAKE_NONCOPYABLE(MachineThreads); public: + typedef jmp_buf RegisterState; + MachineThreads(Heap*); ~MachineThreads(); - void gatherConservativeRoots(ConservativeRoots&, void* stackCurrent); + void gatherConservativeRoots(ConservativeRoots&, JITStubRoutineSet&, CodeBlockSet&, void* stackOrigin, void* stackTop, RegisterState& calleeSavedRegisters); -#if ENABLE(JSC_MULTIPLE_THREADS) - void makeUsableFromMultipleThreads(); - void addCurrentThread(); // Only needs to be called by clients that can use the same heap from multiple threads. -#endif + JS_EXPORT_PRIVATE void addCurrentThread(); // Only needs to be called by clients that can use the same heap from multiple threads. private: - void gatherFromCurrentThread(ConservativeRoots&, void* stackCurrent); - -#if ENABLE(JSC_MULTIPLE_THREADS) class Thread; - static void removeThread(void*); - void removeCurrentThread(); + void gatherFromCurrentThread(ConservativeRoots&, JITStubRoutineSet&, CodeBlockSet&, void* stackOrigin, void* stackTop, RegisterState& calleeSavedRegisters); - void gatherFromOtherThread(ConservativeRoots&, Thread*); -#endif + void tryCopyOtherThreadStack(Thread*, void*, size_t capacity, size_t*); + bool tryCopyOtherThreadStacks(MutexLocker&, void*, size_t capacity, size_t*); - Heap* m_heap; + static void removeThread(void*); + + template + void removeThreadIfFound(PlatformThread); -#if ENABLE(JSC_MULTIPLE_THREADS) Mutex m_registeredThreadsMutex; Thread* m_registeredThreads; - pthread_key_t m_threadSpecific; + WTF::ThreadSpecificKey m_threadSpecific; +#if !ASSERT_DISABLED + Heap* m_heap; #endif }; } // namespace JSC +#if COMPILER(GCC) +#define REGISTER_BUFFER_ALIGNMENT __attribute__ ((aligned (sizeof(void*)))) +#else +#define REGISTER_BUFFER_ALIGNMENT +#endif + +// ALLOCATE_AND_GET_REGISTER_STATE() is a macro so that it is always "inlined" even in debug builds. +#if COMPILER(MSVC) +#pragma warning(push) +#pragma warning(disable: 4611) +#define ALLOCATE_AND_GET_REGISTER_STATE(registers) \ + MachineThreads::RegisterState registers REGISTER_BUFFER_ALIGNMENT; \ + setjmp(registers) +#pragma warning(pop) +#else +#define ALLOCATE_AND_GET_REGISTER_STATE(registers) \ + MachineThreads::RegisterState registers REGISTER_BUFFER_ALIGNMENT; \ + setjmp(registers) +#endif + #endif // MachineThreads_h