X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/6fe7ccc865dc7d7541b93c5bcaf6368d2c98a174..refs/heads/master:/heap/MachineStackMarker.h diff --git a/heap/MachineStackMarker.h b/heap/MachineStackMarker.h index eeb7db9..9b6b732 100644 --- a/heap/MachineStackMarker.h +++ b/heap/MachineStackMarker.h @@ -22,42 +22,71 @@ #ifndef MachineThreads_h #define MachineThreads_h -#include +#include #include +#include #include 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); - JS_EXPORT_PRIVATE void makeUsableFromMultipleThreads(); 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); - class Thread; + void gatherFromCurrentThread(ConservativeRoots&, JITStubRoutineSet&, CodeBlockSet&, void* stackOrigin, void* stackTop, RegisterState& calleeSavedRegisters); + + void tryCopyOtherThreadStack(Thread*, void*, size_t capacity, size_t*); + bool tryCopyOtherThreadStacks(MutexLocker&, void*, size_t capacity, size_t*); + static void removeThread(void*); - void removeCurrentThread(); - void gatherFromOtherThread(ConservativeRoots&, Thread*); + template + void removeThreadIfFound(PlatformThread); - Heap* m_heap; 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