eathread_callstack_null.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // Copyright (c) Electronic Arts Inc. All rights reserved.
  3. ///////////////////////////////////////////////////////////////////////////////
  4. #include <eathread/eathread_callstack.h>
  5. #include <eathread/eathread_callstack_context.h>
  6. #include <eathread/eathread_storage.h>
  7. #include <string.h>
  8. #if defined(EA_COMPILER_MSVC)
  9. #pragma warning(disable: 4172) // returning address of local variable or temporary
  10. #endif
  11. namespace EA
  12. {
  13. namespace Thread
  14. {
  15. EATHREADLIB_API void InitCallstack()
  16. {
  17. }
  18. EATHREADLIB_API void ShutdownCallstack()
  19. {
  20. }
  21. EATHREADLIB_API size_t GetCallstack(void* /*callstack*/[], size_t /*maxDepth*/, const CallstackContext* /*pContext*/)
  22. {
  23. return 0;
  24. }
  25. EATHREADLIB_API bool GetCallstackContext(CallstackContext& /*context*/, intptr_t /*threadId*/)
  26. {
  27. return false;
  28. }
  29. EATHREADLIB_API bool GetCallstackContextSysThreadId(CallstackContext& /*context*/, intptr_t /*sysThreadId*/)
  30. {
  31. return false;
  32. }
  33. EATHREADLIB_API void GetCallstackContext(CallstackContext& context, const Context* /*pContext*/)
  34. {
  35. memset(&context, 0, sizeof(context));
  36. }
  37. EATHREADLIB_API size_t GetModuleFromAddress(const void* /*pAddress*/, char* /*pModuleFileName*/, size_t /*moduleNameCapacity*/)
  38. {
  39. return 0;
  40. }
  41. EATHREADLIB_API ModuleHandle GetModuleHandleFromAddress(const void* /*pAddress*/)
  42. {
  43. return (ModuleHandle)0;
  44. }
  45. #if EA_THREADS_AVAILABLE
  46. static EA::Thread::ThreadLocalStorage sStackBase;
  47. #else
  48. static void* sStackBase;
  49. #endif
  50. ///////////////////////////////////////////////////////////////////////////////
  51. // SetStackBase
  52. //
  53. EATHREADLIB_API void SetStackBase(void* pStackBase)
  54. {
  55. if(pStackBase)
  56. {
  57. #if EA_THREADS_AVAILABLE
  58. sStackBase.SetValue(pStackBase);
  59. #else
  60. sStackBase = pStackBase;
  61. #endif
  62. }
  63. else
  64. {
  65. pStackBase = GetStackBase();
  66. SetStackBase(pStackBase);
  67. }
  68. }
  69. ///////////////////////////////////////////////////////////////////////////////
  70. // GetStackBase
  71. //
  72. EATHREADLIB_API void* GetStackBase()
  73. {
  74. #if EA_THREADS_AVAILABLE
  75. void* pStackBase = sStackBase.GetValue();
  76. #else
  77. void* pStackBase = sStackBase;
  78. #endif
  79. if(!pStackBase)
  80. pStackBase = (void*)(((uintptr_t)GetStackLimit() + 4095) & ~4095); // Align up to nearest page, as the stack grows downward.
  81. return pStackBase;
  82. }
  83. ///////////////////////////////////////////////////////////////////////////////
  84. // GetStackLimit
  85. //
  86. EATHREADLIB_API void* GetStackLimit()
  87. {
  88. void* pStack = NULL;
  89. pStack = &pStack;
  90. return (void*)((uintptr_t)pStack & ~4095); // Round down to nearest page, as the stack grows downward.
  91. }
  92. } // namespace Thread
  93. } // namespace EA